Skip to content

Commit 6a006e2

Browse files
committed
Fix wrong fix-it in modifier for variable decl
1 parent d364e1e commit 6a006e2

File tree

2 files changed

+68
-11
lines changed

2 files changed

+68
-11
lines changed

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,47 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
15251525
if shouldSkip(node) {
15261526
return .skipChildren
15271527
}
1528+
1529+
if let modifiers = node.modifiers, modifiers.hasError {
1530+
for modifier in modifiers {
1531+
guard let detail = modifier.detail else {
1532+
continue
1533+
}
1534+
1535+
let unexpectedTokens: [TokenSyntax] = [detail.unexpectedBetweenLeftParenAndDetail, detail.unexpectedBetweenDetailAndRightParen]
1536+
.compactMap { $0?.tokens(viewMode: .all) }
1537+
.flatMap { $0 }
1538+
1539+
// If there is no unexpected tokens it means we miss a paren or set keyword.
1540+
// So we just skip the handling here
1541+
guard let firstUnexpected = unexpectedTokens.first else {
1542+
continue
1543+
}
1544+
1545+
let fixItMessage: ParserFixIt
1546+
1547+
if detail.detail.presence == .missing {
1548+
fixItMessage = ReplaceTokensFixIt(replaceTokens: unexpectedTokens, replacements: [detail.detail])
1549+
} else {
1550+
fixItMessage = RemoveNodesFixIt(unexpectedTokens)
1551+
}
1552+
1553+
addDiagnostic(
1554+
firstUnexpected,
1555+
MissingNodesError(missingNodes: [Syntax(detail.detail)]),
1556+
fixIts: [
1557+
FixIt(
1558+
message: fixItMessage,
1559+
changes: [
1560+
FixIt.MultiNodeChange.makePresent(detail.detail)
1561+
] + unexpectedTokens.map { FixIt.MultiNodeChange.makeMissing($0) }
1562+
)
1563+
],
1564+
handledNodes: [detail.id] + unexpectedTokens.map(\.id)
1565+
)
1566+
}
1567+
}
1568+
15281569
let missingTries = node.bindings.compactMap({
15291570
return $0.initializer?.value.as(TryExprSyntax.self)?.tryKeyword
15301571
})

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -343,11 +343,10 @@ final class DeclarationTests: XCTestCase {
343343
private(1️⃣get) var a = 0
344344
""",
345345
diagnostics: [
346-
DiagnosticSpec(message: "expected 'set' in modifier", fixIts: ["insert 'set'"]),
347-
DiagnosticSpec(message: "unexpected code 'get' in modifier"),
346+
DiagnosticSpec(message: "expected 'set' in modifier", fixIts: ["replace 'get' with 'set'"])
348347
],
349348
fixedSource: """
350-
private(setget) var a = 0
349+
private(set) var a = 0
351350
"""
352351
)
353352

@@ -374,17 +373,29 @@ final class DeclarationTests: XCTestCase {
374373
private(1️⃣get, set) var a = 0
375374
""",
376375
diagnostics: [
377-
DiagnosticSpec(message: "unexpected code 'get,' in modifier")
378-
]
376+
DiagnosticSpec(
377+
message: "expected 'set' in modifier",
378+
fixIts: ["remove 'get,'"]
379+
)
380+
],
381+
fixedSource: """
382+
private(set) var a = 0
383+
"""
379384
)
380385

381386
assertParse(
382387
"""
383388
private(1️⃣get: set) var a = 0
384389
""",
385390
diagnostics: [
386-
DiagnosticSpec(message: "unexpected code 'get:' in modifier")
387-
]
391+
DiagnosticSpec(
392+
message: "expected 'set' in modifier",
393+
fixIts: ["remove 'get:'"]
394+
)
395+
],
396+
fixedSource: """
397+
private(set) var a = 0
398+
"""
388399
)
389400

390401
assertParse(
@@ -410,12 +421,17 @@ final class DeclarationTests: XCTestCase {
410421

411422
assertParse(
412423
"""
413-
private(1️⃣get, set2️⃣, didSet) var a = 0
424+
private(1️⃣get, set, didSet) var a = 0
414425
""",
415426
diagnostics: [
416-
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code 'get,' in modifier"),
417-
DiagnosticSpec(locationMarker: "2️⃣", message: "unexpected code ', didSet' in modifier"),
418-
]
427+
DiagnosticSpec(
428+
message: "expected 'set' in modifier",
429+
fixIts: ["remove 'get, , didSet'"]
430+
)
431+
],
432+
fixedSource: """
433+
private(set) var a = 0
434+
"""
419435
)
420436

421437
assertParse(

0 commit comments

Comments
 (0)