Skip to content

Commit 7cec10f

Browse files
committed
If a missing token has a child name, use that instead of the generic token kind
1 parent 3907c80 commit 7cec10f

File tree

11 files changed

+54
-50
lines changed

11 files changed

+54
-50
lines changed

Sources/SwiftParser/Diagnostics/MissingNodesError.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,20 @@ fileprivate func findCommonAncestor(_ nodes: [Syntax]) -> Syntax? {
2323

2424
fileprivate enum MissingNodesDescriptionPart {
2525
case tokensWithDefaultText([TokenSyntax])
26-
case tokenWithoutDefaultText(RawTokenKind)
26+
case tokenWithoutDefaultText(TokenSyntax)
2727
case node(Syntax)
2828

2929
var description: String? {
3030
switch self {
3131
case .tokensWithDefaultText(let tokens):
3232
let tokenContents = tokens.map({ BasicFormat().visit($0).description }).joined()
3333
return "'\(tokenContents.trimmingSpaces())'"
34-
case .tokenWithoutDefaultText(let tokenKind):
35-
return tokenKind.nameForDiagnostics
34+
case .tokenWithoutDefaultText(let token):
35+
if let parent = token.parent,
36+
let childName = parent.childNameForDiagnostics(token.index) {
37+
return childName
38+
}
39+
return token.tokenKind.decomposeToRaw().rawKind.nameForDiagnostics
3640
case .node(let node):
3741
if let parent = node.parent,
3842
let childName = parent.childNameForDiagnostics(node.index) {
@@ -57,7 +61,7 @@ fileprivate enum MissingNodesDescriptionPart {
5761
let presentToken = TokenSyntax(newKind, presence: .present)
5862
newPart = .tokensWithDefaultText([presentToken])
5963
} else {
60-
newPart = .tokenWithoutDefaultText(rawKind)
64+
newPart = .tokenWithoutDefaultText(missingToken)
6165
}
6266

6367
switch (parts.last, newPart) {

Tests/SwiftDiagnosticsTest/DiagnosticsFormatterTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ final class DiagnosticsFormatterTests: XCTestCase {
4141
"""
4242
let expectedOutput = """
4343
1 │ foo.[].[].[]
44-
∣ │ │ ╰─ expected identifier in member access
45-
∣ │ ╰─ expected identifier in member access
46-
∣ ╰─ expected identifier in member access
44+
∣ │ │ ╰─ expected name in member access
45+
∣ │ ╰─ expected name in member access
46+
∣ ╰─ expected name in member access
4747
4848
"""
4949
AssertStringsEqualWithDiff(expectedOutput, try annotate(source: source))

Tests/SwiftParserTest/Declarations.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ final class DeclarationTests: XCTestCase {
5555
AssertParse(
5656
"func 1️⃣/^notoperator^/ (lhs: Int, rhs: Int) -> Int { 1 / 2 }",
5757
diagnostics: [
58-
DiagnosticSpec(message: "expected identifier in function"),
58+
DiagnosticSpec(message: "expected name in function"),
5959
DiagnosticSpec(message: "unexpected code '/^notoperator^/' before parameter clause")
6060
]
6161
)
@@ -159,7 +159,7 @@ final class DeclarationTests: XCTestCase {
159159
"protocol P{1️⃣{}case2️⃣",
160160
diagnostics: [
161161
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code '{}' before enum case"),
162-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected identifier in enum case"),
162+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected name in enum case"),
163163
DiagnosticSpec(locationMarker: "2️⃣", message: "expected '}' to end protocol"),
164164
])
165165
}
@@ -816,7 +816,7 @@ final class DeclarationTests: XCTestCase {
816816
diagnostics: [
817817
DiagnosticSpec(locationMarker: "1️⃣", message: "expected ':' in function parameter"),
818818
DiagnosticSpec(locationMarker: "3️⃣", message: "expected ')' to end parameter clause"),
819-
DiagnosticSpec(locationMarker: "4️⃣", message: "expected identifier and member block in struct"),
819+
DiagnosticSpec(locationMarker: "4️⃣", message: "expected name and member block in struct"),
820820
DiagnosticSpec(locationMarker: "4️⃣", message: "extraneous code ': Int) {}' at top level"),
821821
]
822822
)
@@ -1102,7 +1102,7 @@ final class DeclarationTests: XCTestCase {
11021102
""",
11031103
diagnostics: [
11041104
DiagnosticSpec(message: "expected name in attribute"),
1105-
DiagnosticSpec(message: "expected identifier in generic parameter"),
1105+
DiagnosticSpec(message: "expected name in generic parameter"),
11061106
DiagnosticSpec(message: "expected '>' to end generic parameter clause"),
11071107
DiagnosticSpec(message: "expected member block in struct"),
11081108
]
@@ -1126,7 +1126,7 @@ final class DeclarationTests: XCTestCase {
11261126
AssertParse(
11271127
"func 1️⃣{}",
11281128
diagnostics: [
1129-
DiagnosticSpec(message: "expected identifier and function signature in function")
1129+
DiagnosticSpec(message: "expected name and function signature in function")
11301130
]
11311131
)
11321132
}

Tests/SwiftParserTest/translated/DeprecatedWhereTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ final class DeprecatedWhereTests: XCTestCase {
182182
DiagnosticSpec(locationMarker: "2️⃣", message: "expected inherited type in generic parameter"),
183183
DiagnosticSpec(locationMarker: "2️⃣", message: "expected '>' to end generic parameter clause"),
184184
DiagnosticSpec(locationMarker: "2️⃣", message: "expected parameter clause in function signature"),
185-
DiagnosticSpec(locationMarker: "3️⃣", message: "expected identifier and member block in protocol"),
185+
DiagnosticSpec(locationMarker: "3️⃣", message: "expected name and member block in protocol"),
186186
DiagnosticSpec(locationMarker: "3️⃣", message: "extraneous code '<ProtoA, ProtoB> where T: ProtoC>(x: T) {}' at top level"),
187187
]
188188
)
@@ -199,7 +199,7 @@ final class DeprecatedWhereTests: XCTestCase {
199199
DiagnosticSpec(locationMarker: "2️⃣", message: "expected inherited type in generic parameter"),
200200
DiagnosticSpec(locationMarker: "2️⃣", message: "expected '>' to end generic parameter clause"),
201201
DiagnosticSpec(locationMarker: "2️⃣", message: "expected parameter clause in function signature"),
202-
DiagnosticSpec(locationMarker: "3️⃣", message: "expected identifier and member block in protocol"),
202+
DiagnosticSpec(locationMarker: "3️⃣", message: "expected name and member block in protocol"),
203203
DiagnosticSpec(locationMarker: "3️⃣", message: "extraneous code '<ProtoA, ProtoB> where T: ProtoC>(x: T) where T: ProtoD {}' at top level"),
204204
]
205205
)

Tests/SwiftParserTest/translated/DollarIdentifierTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class DollarIdentifierTests: XCTestCase {
5757
""",
5858
diagnostics: [
5959
// TODO: Old parser expected error on line 2: '$' is not an identifier; use backticks to escape it, Fix-It replacements: 9 - 10 = '`$`'
60-
DiagnosticSpec(message: "expected identifier and member block in class"),
60+
DiagnosticSpec(message: "expected name and member block in class"),
6161
]
6262
)
6363
}
@@ -71,7 +71,7 @@ final class DollarIdentifierTests: XCTestCase {
7171
""",
7272
diagnostics: [
7373
// TODO: Old parser expected error on line 2: '$' is not an identifier; use backticks to escape it, Fix-It replacements: 8 - 9 = '`$`'
74-
DiagnosticSpec(message: "expected identifier and member block in enum"),
74+
DiagnosticSpec(message: "expected name and member block in enum"),
7575
]
7676
)
7777
}
@@ -85,7 +85,7 @@ final class DollarIdentifierTests: XCTestCase {
8585
""",
8686
diagnostics: [
8787
// TODO: Old parser expected error on line 2: '$' is not an identifier; use backticks to escape it, Fix-It replacements: 10 - 11 = '`$`'
88-
DiagnosticSpec(message: "expected identifier and member block in struct"),
88+
DiagnosticSpec(message: "expected name and member block in struct"),
8989
]
9090
)
9191
}
@@ -102,7 +102,7 @@ final class DollarIdentifierTests: XCTestCase {
102102
diagnostics: [
103103
// TODO: Old parser expected error on line 2: '$' is not an identifier; use backticks to escape it, Fix-It replacements: 8 - 9 = '`$`'
104104
// TODO: Old parser expected error on line 2: '$' is not an identifier; use backticks to escape it, Fix-It replacements: 10 - 11 = '`$`'
105-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected identifier in function"),
105+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected name in function"),
106106
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code '$' before parameter clause"),
107107
DiagnosticSpec(locationMarker: "2️⃣", message: "expected type in function parameter"),
108108
DiagnosticSpec(locationMarker: "2️⃣", message: "unexpected code '$ dollarParam: Int' in parameter clause"),

Tests/SwiftParserTest/translated/EnumTests.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ final class EnumTests: XCTestCase {
264264
""",
265265
diagnostics: [
266266
// TODO: Old parser expected error on line 2: 'case' label can only appear inside a 'switch' statement
267-
DiagnosticSpec(message: "expected identifier in enum case"),
267+
DiagnosticSpec(message: "expected name in enum case"),
268268
DiagnosticSpec(message: "unexpected code '0:' in enum"),
269269
]
270270
)
@@ -293,7 +293,7 @@ final class EnumTests: XCTestCase {
293293
""",
294294
diagnostics: [
295295
// TODO: Old parser expected error on line 2: 'case' label can only appear inside a 'switch' statement
296-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected identifier in enum case"),
296+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected name in enum case"),
297297
DiagnosticSpec(locationMarker: "2️⃣", message: "expected ':' and type in function parameter"),
298298
DiagnosticSpec(locationMarker: "3️⃣", message: "expected type in function parameter"),
299299
DiagnosticSpec(locationMarker: "3️⃣", message: "unexpected code '0' in parameter clause"),
@@ -349,7 +349,7 @@ final class EnumTests: XCTestCase {
349349
""",
350350
diagnostics: [
351351
// TODO: Old parser expected error on line 3: expected identifier after comma in enum 'case' declaration
352-
DiagnosticSpec(message: "expected identifier in enum case"),
352+
DiagnosticSpec(message: "expected name in enum case"),
353353
]
354354
)
355355
}
@@ -364,7 +364,7 @@ final class EnumTests: XCTestCase {
364364
diagnostics: [
365365
// TODO: Old parser expected error on line 2: 'case' label can only appear inside a 'switch' statement
366366
// TODO: Old parser expected error on line 2: expected pattern
367-
DiagnosticSpec(message: "expected identifier in enum case"),
367+
DiagnosticSpec(message: "expected name in enum case"),
368368
DiagnosticSpec(message: "unexpected code ':' in enum"),
369369
]
370370
)
@@ -426,11 +426,11 @@ final class EnumTests: XCTestCase {
426426
""",
427427
diagnostics: [
428428
// TODO: Old parser expected error on line 2: extraneous code '.' in enum 'case' declaration, Fix-It replacements: 8 - 9 = ''
429-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected identifier in enum case"),
429+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected name in enum case"),
430430
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code '.UE3' before enum case"),
431431
// TODO: Old parser expected error on line 3: extraneous code '.' in enum 'case' declaration, Fix-It replacements: 8 - 9 = ''
432432
// TODO: Old parser expected error on line 3: extraneous code '.' in enum 'case' declaration, Fix-It replacements: 14 - 15 = ''
433-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected identifier in enum case"),
433+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected name in enum case"),
434434
DiagnosticSpec(locationMarker: "2️⃣", message: "unexpected code '.UE4, .UE5' in enum"),
435435
]
436436
)
@@ -449,7 +449,7 @@ final class EnumTests: XCTestCase {
449449
DiagnosticSpec(locationMarker: "1️⃣", message: "'_' cannot be used as an identifier here"),
450450
DiagnosticSpec(locationMarker: "2️⃣", message: "'_' cannot be used as an identifier here"),
451451
// TODO: Old parser expected error on line 20: expected identifier after comma in enum 'case' declaration
452-
DiagnosticSpec(locationMarker: "3️⃣", message: "expected identifier in enum case"),
452+
DiagnosticSpec(locationMarker: "3️⃣", message: "expected name in enum case"),
453453
]
454454
)
455455
}
@@ -1330,7 +1330,7 @@ final class EnumTests: XCTestCase {
13301330
}
13311331
""",
13321332
diagnostics: [
1333-
DiagnosticSpec(message: "expected identifier in enum case"),
1333+
DiagnosticSpec(message: "expected name in enum case"),
13341334
// TODO: Old parser expected error on line 5: keyword 'case' cannot be used as an identifier here
13351335
// TODO: Old parser expected note on line 5: if this name is unavoidable, use backticks to escape it, Fix-It replacements: 3 - 7 = '`case`'
13361336
]
@@ -1346,7 +1346,7 @@ final class EnumTests: XCTestCase {
13461346
}
13471347
""",
13481348
diagnostics: [
1349-
DiagnosticSpec(message: "expected identifier in enum case"),
1349+
DiagnosticSpec(message: "expected name in enum case"),
13501350
]
13511351
)
13521352
}
@@ -1375,9 +1375,9 @@ final class EnumTests: XCTestCase {
13751375
"""#,
13761376
diagnostics: [
13771377
// TODO: Old parser expected error on line 2: expected identifier after comma in enum 'case' declaration
1378-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected identifier in enum case"),
1378+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected name in enum case"),
13791379
// TODO: Old parser expected error on line 3: expected identifier after comma in enum 'case' declaration
1380-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected identifier in enum case"),
1380+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected name in enum case"),
13811381
]
13821382
)
13831383
}

Tests/SwiftParserTest/translated/InvalidTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ final class InvalidTests: XCTestCase {
480480
// TODO: Old parser expected note on line 1: did you mean to write an 'AnyObject' constraint?, Fix-It replacements: 16 - 21 = 'AnyObject'
481481
DiagnosticSpec(locationMarker: "1️⃣", message: "expected '>' to end generic parameter clause"),
482482
DiagnosticSpec(locationMarker: "1️⃣", message: "expected '{' in struct"),
483-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected identifier and member block in class"),
483+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected name and member block in class"),
484484
DiagnosticSpec(locationMarker: "2️⃣", message: "expected '}' to end struct"),
485485
DiagnosticSpec(locationMarker: "2️⃣", message: "extraneous code at top level"),
486486
// TODO: Old parser expected error on line 2: 'weak' must be a mutable variable, because it may change at runtime

0 commit comments

Comments
 (0)