File tree Expand file tree Collapse file tree 3 files changed +48
-2
lines changed Expand file tree Collapse file tree 3 files changed +48
-2
lines changed Original file line number Diff line number Diff line change @@ -256,3 +256,45 @@ extension Syntax {
256
256
data. raw. accept ( RawSyntaxVisitor ( visitor, self ) )
257
257
}
258
258
}
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
+ }
Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ public class ParseFileTestCase: XCTestCase {
30
30
let fileContents = try String ( contentsOf: currentFile)
31
31
let parsed = try SyntaxTreeParser . parse ( currentFile)
32
32
XCTAssertEqual ( " \( parsed) " , fileContents)
33
+ try SyntaxVerifier . verify ( parsed)
33
34
} ( ) )
34
35
}
35
36
}
Original file line number Diff line number Diff line change @@ -120,7 +120,10 @@ public class SyntaxFactoryAPITestCase: XCTestCase {
120
120
public func testUnknownSyntax( ) {
121
121
let expr = SyntaxFactory . makeStringLiteralExpr ( " Hello, world! " )
122
122
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) )
125
128
}
126
129
}
You can’t perform that action at this time.
0 commit comments