Skip to content

Commit aa56781

Browse files
authored
Merge pull request #131 from nkcsgexi/diagnose-parse
lit-tester: add an action to diagnose regular parser errors and unknown syntax nodes
2 parents 0c74466 + aff63a9 commit aa56781

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

Sources/SwiftSyntax/SyntaxParser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public enum SyntaxParser {
110110
let source = fileData.withUnsafeBytes { buf in
111111
return String.fromBuffer(buf.bindMemory(to: UInt8.self))
112112
}
113-
return try parse(source: source, filenameForDiagnostics: url.absoluteString,
113+
return try parse(source: source, filenameForDiagnostics: url.path,
114114
diagnosticEngine: diagnosticEngine)
115115
}
116116

Sources/lit-test-helper/main.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,32 @@ func printParserDiags(args: CommandLineArguments) throws {
445445
_ = try SyntaxParser.parse(treeURL, diagnosticEngine: diagEngine)
446446
}
447447

448+
func diagnose(args: CommandLineArguments) throws {
449+
let treeURL = URL(fileURLWithPath: try args.getRequired("-source-file"))
450+
let diagEngine = DiagnosticEngine()
451+
diagEngine.addConsumer(PrintingDiagnosticConsumer())
452+
let tree = try SyntaxParser.parse(treeURL, diagnosticEngine: diagEngine)
453+
struct DiagnoseUnknown: SyntaxAnyVisitor {
454+
let diagEngine: DiagnosticEngine
455+
let converter: SourceLocationConverter
456+
init(_ diagEngine: DiagnosticEngine, _ converter: SourceLocationConverter) {
457+
self.diagEngine = diagEngine
458+
self.converter = converter
459+
}
460+
func visitAny(_ node: Syntax) -> SyntaxVisitorContinueKind {
461+
if node.isUnknown {
462+
diagEngine.diagnose(Diagnostic.Message(.warning, "unknown syntax exists"),
463+
location: node.startLocation(converter: converter,
464+
afterLeadingTrivia: true))
465+
}
466+
return .visitChildren
467+
}
468+
}
469+
var visitor = DiagnoseUnknown(diagEngine,
470+
SourceLocationConverter(file: treeURL.path, tree: tree))
471+
tree.walk(&visitor)
472+
}
473+
448474
do {
449475
let args = try CommandLineArguments.parse(CommandLine.arguments.dropFirst())
450476

@@ -458,6 +484,8 @@ do {
458484
try printSyntaxTree(args: args)
459485
} else if args.has("-dump-diags") {
460486
try printParserDiags(args: args)
487+
} else if args.has("-diagnose") {
488+
try diagnose(args: args)
461489
} else if args.has("-help") {
462490
printHelp()
463491
} else {

0 commit comments

Comments
 (0)