Skip to content

Commit fbd3d19

Browse files
committed
Use token nameForDiagnostics to generate diagnostic messages
1 parent de5ee9b commit fbd3d19

File tree

4 files changed

+23
-19
lines changed

4 files changed

+23
-19
lines changed

Sources/SwiftParser/Diagnostics/ParserDiagnosticMessages.swift

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import SwiftDiagnostics
14-
import SwiftSyntax
14+
@_spi(RawSyntax) import SwiftSyntax
1515

1616
let diagnosticDomain: String = "SwiftParser"
1717

@@ -139,22 +139,27 @@ public struct MissingTokenError: ParserError {
139139
public let missingToken: TokenSyntax
140140

141141
public var message: String {
142-
guard let parent = missingToken.parent, let parentTypeName = parent.nodeTypeNameForDiagnostics() else {
143-
return "Expected '\(missingToken.text)'"
142+
var message = "Expected"
143+
if missingToken.text.isEmpty {
144+
message += " \(missingToken.tokenKind.decomposeToRaw().rawKind.nameForDiagnostics)"
145+
} else {
146+
message += " '\(missingToken.text)'"
144147
}
145-
switch missingToken.tokenKind {
146-
case .leftAngle, .leftBrace, .leftParen, .leftSquareBracket:
147-
if parent.children(viewMode: .fixedUp).first?.as(TokenSyntax.self) == missingToken {
148-
return "Expected '\(missingToken.text)' to start \(parentTypeName)"
149-
}
150-
case .rightAngle, .rightBrace, .rightParen, .rightSquareBracket:
151-
if parent.children(viewMode: .fixedUp).last?.as(TokenSyntax.self) == missingToken {
152-
return "Expected '\(missingToken.text)' to end \(parentTypeName)"
148+
if let parent = missingToken.parent, let parentTypeName = parent.nodeTypeNameForDiagnostics() {
149+
switch missingToken.tokenKind {
150+
case .leftAngle, .leftBrace, .leftParen, .leftSquareBracket:
151+
if parent.children(viewMode: .fixedUp).first?.as(TokenSyntax.self) == missingToken {
152+
message += " to start \(parentTypeName)"
153+
}
154+
case .rightAngle, .rightBrace, .rightParen, .rightSquareBracket:
155+
if parent.children(viewMode: .fixedUp).last?.as(TokenSyntax.self) == missingToken {
156+
message += " to end \(parentTypeName)"
157+
}
158+
default:
159+
message += " in \(parentTypeName)"
153160
}
154-
default:
155-
break
156161
}
157-
return "Expected '\(missingToken.text)' in \(parentTypeName)"
162+
return message
158163
}
159164

160165
public var handledNodes: [Syntax] {

Tests/SwiftParserTest/Declarations.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class DeclarationTests: XCTestCase {
3838
r#^DIAG2^#
3939
""",
4040
diagnostics: [
41-
DiagnosticSpec(locationMarker: "DIAG1", message: "Expected '' in function"),
41+
DiagnosticSpec(locationMarker: "DIAG1", message: "Expected identifier in function"),
4242
DiagnosticSpec(locationMarker: "DIAG1", message: "Expected argument list in function declaration"),
4343
DiagnosticSpec(locationMarker: "DIAG2", message: "Expected '=' in same type requirement"),
4444
])
@@ -670,8 +670,7 @@ final class DeclarationTests: XCTestCase {
670670
diagnostics: [
671671
DiagnosticSpec(locationMarker: "MISSING_COLON", message: "Expected ':' in function parameter"),
672672
DiagnosticSpec(locationMarker: "MISSING_RPAREN", message: "Expected ')' to end parameter clause"),
673-
// FIXME: We should issues something like "Expected identifier in declaration"
674-
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected '' in struct"),
673+
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected identifier in struct"),
675674
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '{' to start struct"),
676675
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '}' to end struct"),
677676
DiagnosticSpec(locationMarker: "BRACES", message: "Extraneous ': Int) {}' at top level"),

Tests/SwiftParserTest/Expressions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ final class ExpressionTests: XCTestCase {
416416

417417
AssertParse("#keyPath(#^DIAG^#(b:)",
418418
diagnostics: [
419-
DiagnosticSpec(message: "Expected '' in '#keyPath' expression"),
419+
DiagnosticSpec(message: "Expected identifier in '#keyPath' expression"),
420420
DiagnosticSpec(message: "Expected ')' to end '#keyPath' expression"),
421421
])
422422
}

Tests/SwiftParserTest/Types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ final class TypeTests: XCTestCase {
4848
AssertParse("{[#^DIAG_1^#class]in#^DIAG_2^#",
4949
{ $0.parseClosureExpression() },
5050
diagnostics: [
51-
DiagnosticSpec(locationMarker: "DIAG_1", message: "Expected '' in closure capture item"),
51+
DiagnosticSpec(locationMarker: "DIAG_1", message: "Expected identifier in closure capture item"),
5252
DiagnosticSpec(locationMarker: "DIAG_1", message: "Unexpected text 'class' in closure capture signature"),
5353
DiagnosticSpec(locationMarker: "DIAG_2", message: "Expected '}' to end closure"),
5454
])

0 commit comments

Comments
 (0)