Skip to content

Commit 4a50ae5

Browse files
committed
Use token nameForDiagnostics to generate diagnostic messages
1 parent 88067a6 commit 4a50ae5

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
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

@@ -126,22 +126,27 @@ public struct MissingTokenError: ParserError {
126126
public let missingToken: TokenSyntax
127127

128128
public var message: String {
129-
guard let parent = missingToken.parent, let parentTypeName = parent.nodeTypeNameForDiagnostics() else {
130-
return "Expected '\(missingToken.text)'"
129+
var message = "Expected"
130+
if missingToken.text.isEmpty {
131+
message += " \(missingToken.tokenKind.decomposeToRaw().rawKind.nameForDiagnostics)"
132+
} else {
133+
message += " '\(missingToken.text)'"
131134
}
132-
switch missingToken.tokenKind {
133-
case .leftAngle, .leftBrace, .leftParen, .leftSquareBracket:
134-
if parent.children(viewMode: .fixedUp).first?.as(TokenSyntax.self) == missingToken {
135-
return "Expected '\(missingToken.text)' to start \(parentTypeName)"
136-
}
137-
case .rightAngle, .rightBrace, .rightParen, .rightSquareBracket:
138-
if parent.children(viewMode: .fixedUp).last?.as(TokenSyntax.self) == missingToken {
139-
return "Expected '\(missingToken.text)' to end \(parentTypeName)"
135+
if let parent = missingToken.parent, let parentTypeName = parent.nodeTypeNameForDiagnostics() {
136+
switch missingToken.tokenKind {
137+
case .leftAngle, .leftBrace, .leftParen, .leftSquareBracket:
138+
if parent.children(viewMode: .fixedUp).first?.as(TokenSyntax.self) == missingToken {
139+
message += " to start \(parentTypeName)"
140+
}
141+
case .rightAngle, .rightBrace, .rightParen, .rightSquareBracket:
142+
if parent.children(viewMode: .fixedUp).last?.as(TokenSyntax.self) == missingToken {
143+
message += " to end \(parentTypeName)"
144+
}
145+
default:
146+
message += " in \(parentTypeName)"
140147
}
141-
default:
142-
break
143148
}
144-
return "Expected '\(missingToken.text)' in \(parentTypeName)"
149+
return message
145150
}
146151
}
147152

Tests/SwiftParserTest/Declarations.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ final class DeclarationTests: XCTestCase {
486486
""",
487487
// FIXME: These are simply bad diagnostics. We should be complaining that identifiers cannot start with digits.
488488
diagnostics: [
489-
DiagnosticSpec(message: "Expected '' in class"),
489+
DiagnosticSpec(message: "Expected identifier in class"),
490490
DiagnosticSpec(message: "Expected '{' to start class"),
491491
DiagnosticSpec(message: "Expected '}' to end class"),
492492
DiagnosticSpec(message: "Extraneous code at top level"),
@@ -611,8 +611,7 @@ final class DeclarationTests: XCTestCase {
611611
diagnostics: [
612612
DiagnosticSpec(locationMarker: "MISSING_COLON", message: "Expected ':' in function parameter"),
613613
DiagnosticSpec(locationMarker: "MISSING_RPAREN", message: "Expected ')' to end parameter clause"),
614-
// FIXME: We should issues something like "Expected identifier in declaration"
615-
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected '' in struct"),
614+
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected identifier in struct"),
616615
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '{' to start struct"),
617616
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '}' to end struct"),
618617
DiagnosticSpec(locationMarker: "BRACES", message: "Extraneous ': Int) {}' at top level"),

0 commit comments

Comments
 (0)