Skip to content

Commit 36dbcbe

Browse files
authored
Merge pull request swiftlang#40 from nkcsgexi/verifier
Add a SyntaxVerifier to assert no unknown syntax in a fully parsed tree.
2 parents de92a86 + ef680b0 commit 36dbcbe

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

Sources/SwiftSyntax/SyntaxRewriter.swift.gyb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,45 @@ extension Syntax {
256256
data.raw.accept(RawSyntaxVisitor(visitor, self))
257257
}
258258
}
259+
260+
public enum SyntaxVerifierError: Error, CustomStringConvertible {
261+
case unknownSyntaxFound(node: Syntax)
262+
263+
public var description: String {
264+
switch self {
265+
case .unknownSyntaxFound(let node):
266+
return "unknown syntax node for \"\(node)\""
267+
}
268+
}
269+
}
270+
271+
public class SyntaxVerifier: SyntaxVisitor {
272+
273+
var UnknownNodes: [Syntax] = []
274+
275+
override public func shouldVisit(_ node: SyntaxKind) -> Bool {
276+
return node.isUnknown
277+
}
278+
279+
override public func shouldVisit(_ node: TokenKind) -> Bool {
280+
return false
281+
}
282+
283+
override public func visitPre(_ node: Syntax) {
284+
assert(node.isUnknown)
285+
UnknownNodes.append(node)
286+
}
287+
288+
private func verify(_ node: Syntax) throws {
289+
node.walk(self)
290+
if !UnknownNodes.isEmpty {
291+
throw SyntaxVerifierError.unknownSyntaxFound(node: UnknownNodes.first!)
292+
}
293+
}
294+
295+
private override init() {}
296+
297+
public static func verify(_ node: Syntax) throws {
298+
try SyntaxVerifier().verify(node)
299+
}
300+
}

Tests/SwiftSyntaxTest/ParseFile.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class ParseFileTestCase: XCTestCase {
3030
let fileContents = try String(contentsOf: currentFile)
3131
let parsed = try SyntaxTreeParser.parse(currentFile)
3232
XCTAssertEqual("\(parsed)", fileContents)
33+
try SyntaxVerifier.verify(parsed)
3334
}())
3435
}
3536
}

Tests/SwiftSyntaxTest/SyntaxFactory.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ public class SyntaxFactoryAPITestCase: XCTestCase {
120120
public func testUnknownSyntax() {
121121
let expr = SyntaxFactory.makeStringLiteralExpr("Hello, world!")
122122
XCTAssertFalse(expr.isUnknown)
123-
XCTAssertTrue(SyntaxFactory.makeUnknownSyntax(
124-
tokens: [SyntaxFactory.makeLeftBraceToken()]).isUnknown)
123+
let unknown = SyntaxFactory.makeUnknownSyntax(
124+
tokens: [SyntaxFactory.makeLeftBraceToken()])
125+
XCTAssertTrue(unknown.isUnknown)
126+
XCTAssertNoThrow(try SyntaxVerifier.verify(expr))
127+
XCTAssertThrowsError(try SyntaxVerifier.verify(unknown))
125128
}
126129
}

0 commit comments

Comments
 (0)