Skip to content

Commit 09f5c92

Browse files
committed
cleanup baseName and use concrete .text instead
1 parent a70c3d5 commit 09f5c92

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

Sources/SwiftSyntaxMacroExpansion/MacroReplacement.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ enum MacroExpanderError: DiagnosticMessage {
1818
case undefined
1919
case definitionNotMacroExpansion
2020
case nonParameterReference(TokenSyntax)
21-
case nonTypeReference(TypeSyntax)
21+
case nonTypeReference(TokenSyntax)
2222
case nonLiteralOrParameter(ExprSyntax)
2323

2424
var message: String {
@@ -187,13 +187,17 @@ fileprivate class ParameterReplacementVisitor: SyntaxAnyVisitor {
187187
}
188188

189189
override func visit(_ node: GenericArgumentSyntax) -> SyntaxVisitorContinueKind {
190-
let baseName = node.argument
190+
guard let baseName = node.argument.as(IdentifierTypeSyntax.self)?.name else {
191+
// Handle error
192+
return .visitChildren
193+
}
194+
191195
guard let genericParameterClause = macro.genericParameterClause else {
192196
return .skipChildren
193197
}
194198

195-
let parameterIndex = genericParameterClause.parameters.firstIndex { (index, parameter) in
196-
return parameter.name.text == "\(baseName)"
199+
let matchedParameter = genericParameterClause.parameters.enumerated().first { (index, parameter) in
200+
return parameter.name.text == baseName.text
197201
}
198202

199203
guard let (parameterIndex, _) = matchedParameter else {

Tests/SwiftSyntaxMacroExpansionTest/MacroReplacementTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,54 @@ final class MacroReplacementTests: XCTestCase {
163163
)
164164
}
165165

166+
func testMacroGenericArgumentExpansion_ignoreTrivia() throws {
167+
let macro: DeclSyntax =
168+
"""
169+
macro gen<A, B /* some comment */>(a: A, b: B) = #otherMacro<A, B>(first: a, second: b)
170+
"""
171+
172+
let use: ExprSyntax =
173+
"""
174+
#gen<Int, String>(a: 5, b: "Hello")
175+
"""
176+
177+
let macroDecl = macro.as(MacroDeclSyntax.self)!
178+
let definition = try macroDecl.checkDefinition()
179+
guard case let .expansion(expansion, replacements, genericReplacements) = definition else {
180+
XCTFail("not a normal expansion")
181+
return
182+
}
183+
184+
guard let replacementA = genericReplacements.first else {
185+
XCTFail("Expected generic replacement for A")
186+
return
187+
}
188+
guard let replacementB = genericReplacements.dropFirst().first else {
189+
XCTFail("Expected generic replacement for B")
190+
return
191+
}
192+
XCTAssertEqual(genericReplacements.count, 2)
193+
194+
XCTAssertEqual(replacementA.parameterIndex, 0)
195+
XCTAssertEqual("\(replacementA.reference.argument)", "A")
196+
197+
XCTAssertEqual(replacementB.parameterIndex, 1)
198+
XCTAssertEqual("\(replacementB.reference.argument)", "B")
199+
200+
let expandedSyntax = macroDecl.expand(
201+
use.as(MacroExpansionExprSyntax.self)!,
202+
definition: expansion,
203+
replacements: replacements,
204+
genericReplacements: genericReplacements
205+
)
206+
assertStringsEqualWithDiff(
207+
expandedSyntax.description,
208+
"""
209+
#otherMacro<A, B>(first: 5, second: "Hello")
210+
"""
211+
)
212+
}
213+
166214
func testMacroGenericArgumentExpansion_notVisitGenericParameterArguments() throws {
167215
let macro: DeclSyntax =
168216
"""

0 commit comments

Comments
 (0)