Skip to content

Commit 39e2b9a

Browse files
committed
Use token nameForDiagnostics to generate diagnostic messages
1 parent 873d78c commit 39e2b9a

File tree

4 files changed

+25
-21
lines changed

4 files changed

+25
-21
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: 3 additions & 4 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
])
@@ -142,7 +142,7 @@ final class DeclarationTests: XCTestCase {
142142
"protocol P{#^DIAG_1^#{}case#^DIAG_2^#",
143143
diagnostics: [
144144
DiagnosticSpec(locationMarker: "DIAG_1", message: "Unexpected text '{}' before enum case"),
145-
DiagnosticSpec(locationMarker: "DIAG_2", message: "Expected '' in enum case"),
145+
DiagnosticSpec(locationMarker: "DIAG_2", message: "Expected identifier in enum case"),
146146
DiagnosticSpec(locationMarker: "DIAG_2", message: "Expected '}' to end protocol"),
147147
])
148148
}
@@ -795,8 +795,7 @@ final class DeclarationTests: XCTestCase {
795795
diagnostics: [
796796
DiagnosticSpec(locationMarker: "MISSING_COLON", message: "Expected ':' in function parameter"),
797797
DiagnosticSpec(locationMarker: "MISSING_RPAREN", message: "Expected ')' to end parameter clause"),
798-
// FIXME: We should issues something like "Expected identifier in declaration"
799-
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected '' in struct"),
798+
DiagnosticSpec(locationMarker: "MISSING_IDENTIFIER", message: "Expected identifier in struct"),
800799
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '{' to start struct"),
801800
DiagnosticSpec(locationMarker: "BRACES", message: "Expected '}' to end struct"),
802801
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
@@ -443,7 +443,7 @@ final class ExpressionTests: XCTestCase {
443443

444444
AssertParse("#keyPath(#^DIAG^#(b:)",
445445
diagnostics: [
446-
DiagnosticSpec(message: "Expected '' in '#keyPath' expression"),
446+
DiagnosticSpec(message: "Expected identifier in '#keyPath' expression"),
447447
DiagnosticSpec(message: "Expected ')' to end '#keyPath' expression"),
448448
])
449449
}

Tests/SwiftParserTest/Types.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ final class TypeTests: XCTestCase {
5858
AssertParse("{[#^DIAG_1^#class]in#^DIAG_2^#",
5959
{ $0.parseClosureExpression() },
6060
diagnostics: [
61-
DiagnosticSpec(locationMarker: "DIAG_1", message: "Expected '' in closure capture item"),
61+
DiagnosticSpec(locationMarker: "DIAG_1", message: "Expected identifier in closure capture item"),
6262
DiagnosticSpec(locationMarker: "DIAG_1", message: "Unexpected text 'class' in closure capture signature"),
6363
DiagnosticSpec(locationMarker: "DIAG_2", message: "Expected '}' to end closure"),
6464
])
@@ -72,7 +72,7 @@ final class TypeTests: XCTestCase {
7272
AssertParse("{[weak#^DIAG^#^]in}",
7373
{ $0.parseClosureExpression() },
7474
diagnostics: [
75-
DiagnosticSpec(message: "Expected '' in closure capture item"),
75+
DiagnosticSpec(message: "Expected identifier in closure capture item"),
7676
DiagnosticSpec(message: "Unexpected text '^' in closure capture signature"),
7777
])
7878
}

0 commit comments

Comments
 (0)