Skip to content

Commit d2f5e52

Browse files
committed
Fix wrong fix it for replacing to module for OriginallyDefinedInArgumentsSyntax
1 parent d2ad219 commit d2f5e52

File tree

3 files changed

+82
-21
lines changed

3 files changed

+82
-21
lines changed

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,35 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
993993
return handleMissingSyntax(node, additionalHandledNodes: [node.placeholder.id])
994994
}
995995

996+
override open func visit(_ node: OriginallyDefinedInArgumentsSyntax) -> SyntaxVisitorContinueKind {
997+
if shouldSkip(node) {
998+
return .skipChildren
999+
}
1000+
if let token = node.unexpectedBetweenModuleLabelAndColon?.onlyToken(where: { $0.tokenKind.isIdentifier }),
1001+
node.moduleLabel.presence == .missing
1002+
{
1003+
addDiagnostic(
1004+
node,
1005+
MissingNodesError(missingNodes: [Syntax(node.moduleLabel)]),
1006+
fixIts: [
1007+
FixIt(
1008+
message: ReplaceTokensFixIt(
1009+
replaceTokens: [token],
1010+
replacements: [node.moduleLabel]
1011+
),
1012+
changes: [
1013+
FixIt.MultiNodeChange.makeMissing(token),
1014+
FixIt.MultiNodeChange.makePresentBeforeTrivia(node.moduleLabel),
1015+
]
1016+
)
1017+
],
1018+
handledNodes: [node.moduleLabel.id, token.id]
1019+
)
1020+
}
1021+
1022+
return .visitChildren
1023+
}
1024+
9961025
public override func visit(_ node: OperatorDeclSyntax) -> SyntaxVisitorContinueKind {
9971026
if shouldSkip(node) {
9981027
return .skipChildren

Tests/SwiftParserTest/AttributeTests.swift

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -425,16 +425,20 @@ final class AttributeTests: XCTestCase {
425425
@_expose(Cxx, 1️⃣baz2️⃣) func foo() {}
426426
""",
427427
diagnostics: [
428-
DiagnosticSpec(locationMarker: "1️⃣",
429-
message: #"expected '"' in string literal"#,
430-
fixIts: [#"insert '"'"#]),
431-
DiagnosticSpec(locationMarker: "2️⃣",
432-
message: #"expected '"' to end string literal"#,
433-
fixIts: [#"insert '"'"#]),
428+
DiagnosticSpec(
429+
locationMarker: "1️⃣",
430+
message: #"expected '"' in string literal"#,
431+
fixIts: [#"insert '"'"#]
432+
),
433+
DiagnosticSpec(
434+
locationMarker: "2️⃣",
435+
message: #"expected '"' to end string literal"#,
436+
fixIts: [#"insert '"'"#]
437+
),
434438
],
435-
fixedSource:"""
436-
@_expose(Cxx, "baz") func foo() {}
437-
"""
439+
fixedSource: """
440+
@_expose(Cxx, "baz") func foo() {}
441+
"""
438442
)
439443
}
440444

@@ -500,13 +504,25 @@ final class AttributeTests: XCTestCase {
500504

501505
assertParse(
502506
"""
503-
@_unavailableFromAsync(message: 1️⃣abc)
507+
@_unavailableFromAsync(message: 1️⃣abc2️⃣)
504508
func foo() {}
505509
""",
506510
diagnostics: [
507-
DiagnosticSpec(message: "expected string literal to end @_unavailableFromAsync argument", fixIts: ["insert string literal"]),
508-
DiagnosticSpec(message: "unexpected code 'abc' in attribute"),
509-
]
511+
DiagnosticSpec(
512+
locationMarker: "1️⃣",
513+
message: #"expected '"' in string literal"#,
514+
fixIts: [#"insert '"'"#]
515+
),
516+
DiagnosticSpec(
517+
locationMarker: "2️⃣",
518+
message: #"expected '"' to end string literal"#,
519+
fixIts: [#"insert '"'"#]
520+
),
521+
],
522+
fixedSource: """
523+
@_unavailableFromAsync(message: "abc")
524+
func foo() {}
525+
"""
510526
)
511527
}
512528

Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,15 @@ final class OriginalDefinedInAttrTests: XCTestCase {
3131
public func foo1() {}
3232
"""#,
3333
diagnostics: [
34-
DiagnosticSpec(message: "expected 'module' in @_originallyDefinedIn arguments", fixIts: ["insert 'module'"]),
35-
DiagnosticSpec(message: "unexpected code 'modulename' before @_originallyDefinedIn arguments"),
36-
]
34+
DiagnosticSpec(
35+
message: "expected 'module' in @_originallyDefinedIn arguments",
36+
fixIts: ["replace 'modulename' with 'module'"]
37+
)
38+
],
39+
fixedSource: #"""
40+
@_originallyDefinedIn(module: "foo", OSX 13.13)
41+
public func foo1() {}
42+
"""#
3743
)
3844
}
3945

@@ -53,20 +59,31 @@ final class OriginalDefinedInAttrTests: XCTestCase {
5359
public class ToplevelClass1 {}
5460
"""#,
5561
diagnostics: [
56-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected ',' and version list in @_originallyDefinedIn arguments", fixIts: ["insert ',' and version list"])
62+
DiagnosticSpec(
63+
message: "expected ',' and version list in @_originallyDefinedIn arguments",
64+
fixIts: ["insert ',' and version list"]
65+
)
5766
]
5867
)
5968
}
6069

6170
func testOriginalDefinedInAttr5() {
6271
assertParse(
6372
"""
64-
@_originallyDefinedIn(1️⃣OSX 13.13.3)
73+
@_originallyDefinedIn(1️⃣OSX 2️⃣13.13.3)
6574
public class ToplevelClass2 {}
6675
""",
6776
diagnostics: [
68-
DiagnosticSpec(message: "expected 'module:', string literal, and ',' in @_originallyDefinedIn arguments", fixIts: ["insert 'module:', string literal, and ','"])
69-
]
77+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected 'module:' in @_originallyDefinedIn arguments", fixIts: ["insert 'module:'"]),
78+
DiagnosticSpec(locationMarker: "1️⃣", message: #"expected '"' in string literal"#, fixIts: [#"insert '"'"#]),
79+
DiagnosticSpec(locationMarker: "2️⃣", message: #"expected '"' to end string literal"#, fixIts: [#"insert '"'"#]),
80+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected ',' in @_originallyDefinedIn arguments", fixIts: ["insert ','"]),
81+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected platform in version restriction", fixIts: ["insert platform"]),
82+
],
83+
fixedSource: """
84+
@_originallyDefinedIn(module: "OSX" , <#identifier#>13.13.3)
85+
public class ToplevelClass2 {}
86+
"""
7087
)
7188
}
7289

@@ -172,5 +189,4 @@ final class OriginalDefinedInAttrTests: XCTestCase {
172189
"""
173190
)
174191
}
175-
176192
}

0 commit comments

Comments
 (0)