Skip to content

Commit d449bac

Browse files
committed
improve generics tests; prevent out of bounds access
formatting
1 parent 87176ef commit d449bac

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

Sources/SwiftSyntaxMacroExpansion/MacroReplacement.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,10 @@ private final class MacroExpansionRewriter: SyntaxRewriter {
331331
return super.visit(node)
332332
}
333333

334+
guard parameterIndex < genericArguments.count else {
335+
return super.visit(node)
336+
}
337+
334338
// Swap in the argument for type parameter
335339
return GenericArgumentSyntax(
336340
leadingTrivia: node.leadingTrivia,
@@ -339,9 +343,9 @@ private final class MacroExpansionRewriter: SyntaxRewriter {
339343
node.unexpectedBetweenArgumentAndTrailingComma,
340344
trailingComma: node.trailingComma,
341345
node.unexpectedAfterTrailingComma
342-
// TODO: seems we're getting spurious trailing " " here,
343-
// skipping trailing trivia for now
344-
// trailingTrivia: node.trailingTrivia
346+
// TODO: seems we're getting spurious trailing " " here,
347+
// skipping trailing trivia for now
348+
// trailingTrivia: node.trailingTrivia
345349
)
346350
}
347351
}
@@ -359,27 +363,25 @@ extension MacroDeclSyntax {
359363
// FIXME: Do real call-argument matching between the argument list and the
360364
// macro parameter list, porting over from the compiler.
361365
let parameterReplacements = Dictionary(
362-
uniqueKeysWithValues: replacements.map { replacement in
363-
(replacement.reference, replacement.parameterIndex)
364-
}
365-
)
366+
uniqueKeysWithValues: replacements.map { replacement in
367+
(replacement.reference, replacement.parameterIndex)
368+
}
369+
)
366370
let arguments: [ExprSyntax] =
367371
argumentList?.map { element in
368372
element.expression
369373
} ?? []
370374

371-
372375
let genericReplacements = Dictionary(
373376
uniqueKeysWithValues: genericReplacements.map { replacement in
374377
(replacement.reference, replacement.parameterIndex)
375378
}
376379
)
377380
let genericArguments: [TypeSyntax] =
378-
genericArgumentList?.arguments.map { element in
381+
genericArgumentList?.arguments.map { element in
379382
element.argument
380383
} ?? []
381384

382-
383385
let rewriter: MacroExpansionRewriter = MacroExpansionRewriter(
384386
parameterReplacements: parameterReplacements,
385387
arguments: arguments,

Tests/SwiftSyntaxMacroExpansionTest/MacroReplacementTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ final class MacroReplacementTests: XCTestCase {
132132
XCTFail("not a normal expansion")
133133
return
134134
}
135-
135+
136136
let replacementA = try XCTUnwrap(genericReplacements.first)
137137
let replacementB = try XCTUnwrap(genericReplacements.dropFirst().first)
138138

@@ -237,12 +237,12 @@ final class MacroReplacementTests: XCTestCase {
237237
func testMacroGenericArgumentExpansion_replaceInner() throws {
238238
let macro: DeclSyntax =
239239
"""
240-
macro gen<A>(a: Array<A>) = #otherMacro(first: a)
240+
macro gen<A>(a: Array<A>) = #reduce<A>(first: a)
241241
"""
242242

243243
let use: ExprSyntax =
244244
"""
245-
#gen(a: [1, 2, 3])
245+
#gen<Int>(a: [1, 2, 3])
246246
"""
247247

248248
let macroDecl = macro.as(MacroDeclSyntax.self)!
@@ -252,7 +252,7 @@ final class MacroReplacementTests: XCTestCase {
252252
return
253253
}
254254

255-
XCTAssertEqual(genericReplacements.count, 0)
255+
XCTAssertEqual(genericReplacements.count, 1)
256256

257257
let expandedSyntax = macroDecl.expand(
258258
use.as(MacroExpansionExprSyntax.self)!,
@@ -263,7 +263,7 @@ final class MacroReplacementTests: XCTestCase {
263263
assertStringsEqualWithDiff(
264264
expandedSyntax.description,
265265
"""
266-
#otherMacro(first: [1, 2, 3])
266+
#reduce<Int>(first: [1, 2, 3])
267267
"""
268268
)
269269
}

0 commit comments

Comments
 (0)