From 35f32cff7101143421d39bb30b004415335d3e99 Mon Sep 17 00:00:00 2001 From: Kim de Vos Date: Fri, 21 Apr 2023 08:48:16 +0200 Subject: [PATCH 1/3] Fix wrong wrapping of quote tokens around identifiers --- Sources/SwiftParser/StringLiterals.swift | 2 +- Tests/SwiftParserTest/AttributeTests.swift | 39 +++++++++++++++---- .../OriginalDefinedInAttrTests.swift | 34 ++++++++++++++-- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/Sources/SwiftParser/StringLiterals.swift b/Sources/SwiftParser/StringLiterals.swift index 9c422389172..668fbb22cb2 100644 --- a/Sources/SwiftParser/StringLiterals.swift +++ b/Sources/SwiftParser/StringLiterals.swift @@ -487,7 +487,7 @@ extension Parser { // string literal. guard currentToken.leadingTriviaText.isEmpty else { break } - if let stringSegment = self.consume(if: .stringSegment) { + if let stringSegment = self.consume(if: .stringSegment, TokenSpec(.identifier, remapping: .stringSegment)) { segments.append(.stringSegment(RawStringSegmentSyntax(content: stringSegment, arena: self.arena))) } else if let backslash = self.consume(if: .backslash) { let (unexpectedBeforeDelimiter, delimiter) = self.parsePoundDelimiter(.rawStringDelimiter, matching: openDelimiter) diff --git a/Tests/SwiftParserTest/AttributeTests.swift b/Tests/SwiftParserTest/AttributeTests.swift index bdd0c6abf13..4dfa7277621 100644 --- a/Tests/SwiftParserTest/AttributeTests.swift +++ b/Tests/SwiftParserTest/AttributeTests.swift @@ -422,12 +422,23 @@ final class AttributeTests: XCTestCase { assertParse( """ - @_expose(Cxx, 1️⃣baz) func foo() {} + @_expose(Cxx, 1️⃣baz2️⃣) func foo() {} """, diagnostics: [ - DiagnosticSpec(message: "expected string literal to end @_expose arguments", fixIts: ["insert string literal"]), - DiagnosticSpec(message: "unexpected code 'baz' in attribute"), - ] + DiagnosticSpec( + locationMarker: "1️⃣", + message: #"expected '"' in string literal"#, + fixIts: [#"insert '"'"#] + ), + DiagnosticSpec( + locationMarker: "2️⃣", + message: #"expected '"' to end string literal"#, + fixIts: [#"insert '"'"#] + ), + ], + fixedSource: """ + @_expose(Cxx, "baz") func foo() {} + """ ) } @@ -493,13 +504,25 @@ final class AttributeTests: XCTestCase { assertParse( """ - @_unavailableFromAsync(message: 1️⃣abc) + @_unavailableFromAsync(message: 1️⃣abc2️⃣) func foo() {} """, diagnostics: [ - DiagnosticSpec(message: "expected string literal to end @_unavailableFromAsync argument", fixIts: ["insert string literal"]), - DiagnosticSpec(message: "unexpected code 'abc' in attribute"), - ] + DiagnosticSpec( + locationMarker: "1️⃣", + message: #"expected '"' in string literal"#, + fixIts: [#"insert '"'"#] + ), + DiagnosticSpec( + locationMarker: "2️⃣", + message: #"expected '"' to end string literal"#, + fixIts: [#"insert '"'"#] + ), + ], + fixedSource: """ + @_unavailableFromAsync(message: "abc") + func foo() {} + """ ) } diff --git a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift index 7fe2115dcc1..e902063f53a 100644 --- a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift +++ b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift @@ -61,12 +61,40 @@ final class OriginalDefinedInAttrTests: XCTestCase { func testOriginalDefinedInAttr5() { assertParse( """ - @_originallyDefinedIn(1️⃣OSX 13.13.3) + @_originallyDefinedIn(1️⃣OSX 2️⃣13.13.3) public class ToplevelClass2 {} """, diagnostics: [ - DiagnosticSpec(message: "expected 'module:', string literal, and ',' in @_originallyDefinedIn arguments", fixIts: ["insert 'module:', string literal, and ','"]) - ] + DiagnosticSpec( + locationMarker: "1️⃣", + message: "expected 'module:' in @_originallyDefinedIn arguments", + fixIts: ["insert 'module:'"] + ), + DiagnosticSpec( + locationMarker: "1️⃣", + message: #"expected '"' in string literal"#, + fixIts: [#"insert '"'"#] + ), + DiagnosticSpec( + locationMarker: "2️⃣", + message: #"expected '"' to end string literal"#, + fixIts: [#"insert '"'"#] + ), + DiagnosticSpec( + locationMarker: "2️⃣", + message: "expected ',' in @_originallyDefinedIn arguments", + fixIts: ["insert ','"] + ), + DiagnosticSpec( + locationMarker: "2️⃣", + message: "expected platform in version restriction", + fixIts: ["insert platform"] + ), + ], + fixedSource: """ + @_originallyDefinedIn(module: "OSX" , <#identifier#>13.13.3) + public class ToplevelClass2 {} + """ ) } From dff8620704027b3aff818e0a418c61d35929adb1 Mon Sep 17 00:00:00 2001 From: Kim de Vos Date: Fri, 21 Apr 2023 10:46:54 +0200 Subject: [PATCH 2/3] Fix wrong fix it for replacing to `module` for `OriginallyDefinedInArgumentsSyntax` --- .../ParseDiagnosticsGenerator.swift | 29 +++++++++++++++++++ .../OriginalDefinedInAttrTests.swift | 18 ++++++++---- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift b/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift index 913e5109dba..409a2b96b53 100644 --- a/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift +++ b/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift @@ -993,6 +993,35 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor { return handleMissingSyntax(node, additionalHandledNodes: [node.placeholder.id]) } + override open func visit(_ node: OriginallyDefinedInArgumentsSyntax) -> SyntaxVisitorContinueKind { + if shouldSkip(node) { + return .skipChildren + } + if let token = node.unexpectedBetweenModuleLabelAndColon?.onlyToken(where: { $0.tokenKind.isIdentifier }), + node.moduleLabel.presence == .missing + { + addDiagnostic( + node, + MissingNodesError(missingNodes: [Syntax(node.moduleLabel)]), + fixIts: [ + FixIt( + message: ReplaceTokensFixIt( + replaceTokens: [token], + replacements: [node.moduleLabel] + ), + changes: [ + FixIt.MultiNodeChange.makeMissing(token), + FixIt.MultiNodeChange.makePresent(node.moduleLabel), + ] + ) + ], + handledNodes: [node.moduleLabel.id, token.id] + ) + } + + return .visitChildren + } + public override func visit(_ node: OperatorDeclSyntax) -> SyntaxVisitorContinueKind { if shouldSkip(node) { return .skipChildren diff --git a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift index e902063f53a..70b4157baa2 100644 --- a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift +++ b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift @@ -31,9 +31,15 @@ final class OriginalDefinedInAttrTests: XCTestCase { public func foo1() {} """#, diagnostics: [ - DiagnosticSpec(message: "expected 'module' in @_originallyDefinedIn arguments", fixIts: ["insert 'module'"]), - DiagnosticSpec(message: "unexpected code 'modulename' before @_originallyDefinedIn arguments"), - ] + DiagnosticSpec( + message: "expected 'module' in @_originallyDefinedIn arguments", + fixIts: ["replace 'modulename' with 'module'"] + ) + ], + fixedSource: #""" + @_originallyDefinedIn(module: "foo", OSX 13.13) + public func foo1() {} + """# ) } @@ -53,7 +59,10 @@ final class OriginalDefinedInAttrTests: XCTestCase { public class ToplevelClass1 {} """#, diagnostics: [ - DiagnosticSpec(locationMarker: "1️⃣", message: "expected ',' and version list in @_originallyDefinedIn arguments", fixIts: ["insert ',' and version list"]) + DiagnosticSpec( + message: "expected ',' and version list in @_originallyDefinedIn arguments", + fixIts: ["insert ',' and version list"] + ) ] ) } @@ -200,5 +209,4 @@ final class OriginalDefinedInAttrTests: XCTestCase { """ ) } - } From bb5736038f0d7da5a4c685c3c485abce16875b7e Mon Sep 17 00:00:00 2001 From: Kim de Vos Date: Fri, 21 Apr 2023 13:14:45 +0200 Subject: [PATCH 3/3] fix wrong insert of `mesage` in `UnavailableFromAsyncArgumentsSyntax` --- .../ParseDiagnosticsGenerator.swift | 30 +++++++++++++++++++ Tests/SwiftParserTest/AttributeTests.swift | 9 ++++-- .../OriginalDefinedInAttrTests.swift | 2 +- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift b/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift index 409a2b96b53..a9a462fcb81 100644 --- a/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift +++ b/Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift @@ -1376,6 +1376,36 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor { return .visitChildren } + public override func visit(_ node: UnavailableFromAsyncArgumentsSyntax) -> SyntaxVisitorContinueKind { + if shouldSkip(node) { + return .skipChildren + } + + if let token = node.unexpectedBetweenMessageLabelAndColon?.onlyToken(where: { $0.tokenKind.isIdentifier }), + node.messageLabel.presence == .missing + { + addDiagnostic( + node, + MissingNodesError(missingNodes: [Syntax(node.messageLabel)]), + fixIts: [ + FixIt( + message: ReplaceTokensFixIt( + replaceTokens: [token], + replacements: [node.messageLabel] + ), + changes: [ + FixIt.MultiNodeChange.makeMissing(token), + FixIt.MultiNodeChange.makePresent(node.messageLabel), + ] + ) + ], + handledNodes: [node.messageLabel.id, token.id] + ) + } + + return .visitChildren + } + public override func visit(_ node: UnresolvedTernaryExprSyntax) -> SyntaxVisitorContinueKind { if shouldSkip(node) { return .skipChildren diff --git a/Tests/SwiftParserTest/AttributeTests.swift b/Tests/SwiftParserTest/AttributeTests.swift index 4dfa7277621..632b7a1b28a 100644 --- a/Tests/SwiftParserTest/AttributeTests.swift +++ b/Tests/SwiftParserTest/AttributeTests.swift @@ -486,9 +486,12 @@ final class AttributeTests: XCTestCase { func foo() {} """, diagnostics: [ - DiagnosticSpec(message: "expected 'message' in @_unavailableFromAsync argument", fixIts: ["insert 'message'"]), - DiagnosticSpec(message: "unexpected code 'nope' before @_unavailableFromAsync argument"), - ] + DiagnosticSpec(message: "expected 'message' in @_unavailableFromAsync argument", fixIts: ["replace 'nope' with 'message'"]) + ], + fixedSource: """ + @_unavailableFromAsync(message: "abc") + func foo() {} + """ ) assertParse( diff --git a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift index 70b4157baa2..226a8527a5d 100644 --- a/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift +++ b/Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift @@ -101,7 +101,7 @@ final class OriginalDefinedInAttrTests: XCTestCase { ), ], fixedSource: """ - @_originallyDefinedIn(module: "OSX" , <#identifier#>13.13.3) + @_originallyDefinedIn(module: "OSX", <#identifier#> 13.13.3) public class ToplevelClass2 {} """ )