@@ -299,17 +299,21 @@ extension MacroDeclSyntax {
299
299
/// uses of macro parameters with their corresponding arguments.
300
300
private final class MacroExpansionRewriter : SyntaxRewriter {
301
301
let parameterReplacements : [ DeclReferenceExprSyntax : Int ]
302
- let genericParameterReplacements : [ DeclReferenceExprSyntax : Int ]
303
302
let arguments : [ ExprSyntax ]
303
+ // let genericParameterReplacements: [DeclReferenceExprSyntax: Int]
304
+ let genericParameterReplacements : [ GenericArgumentSyntax : Int ]
305
+ let genericArguments : [ TypeSyntax ]
304
306
305
307
init (
306
308
parameterReplacements: [ DeclReferenceExprSyntax : Int ] ,
307
- genericReplacements: [ DeclReferenceExprSyntax : Int ] ,
308
- arguments: [ ExprSyntax ]
309
+ arguments: [ ExprSyntax ] ,
310
+ genericReplacements: [ GenericArgumentSyntax : Int ] ,
311
+ genericArguments: [ TypeSyntax ]
309
312
) {
310
313
self . parameterReplacements = parameterReplacements
311
- self . genericParameterReplacements = genericReplacements
312
314
self . arguments = arguments
315
+ self . genericParameterReplacements = genericReplacements
316
+ self . genericArguments = genericArguments
313
317
super. init ( viewMode: . sourceAccurate)
314
318
}
315
319
@@ -321,37 +325,68 @@ private final class MacroExpansionRewriter: SyntaxRewriter {
321
325
// Swap in the argument for this parameter
322
326
return arguments [ parameterIndex] . trimmed
323
327
}
328
+
329
+ override func visit( _ node: GenericArgumentSyntax ) -> GenericArgumentSyntax {
330
+ guard let parameterIndex = genericParameterReplacements [ node] else {
331
+ return super. visit ( node)
332
+ }
333
+
334
+ // Swap in the argument for type parameter
335
+ return GenericArgumentSyntax (
336
+ leadingTrivia: node. leadingTrivia,
337
+ node. unexpectedBeforeArgument,
338
+ argument: genericArguments [ parameterIndex] . trimmed,
339
+ node. unexpectedBetweenArgumentAndTrailingComma,
340
+ trailingComma: node. trailingComma,
341
+ node. unexpectedAfterTrailingComma
342
+ // TODO: seems we're getting spurious trailing " " here,
343
+ // skipping trailing trivia for now
344
+ // trailingTrivia: node.trailingTrivia
345
+ )
346
+ }
324
347
}
325
348
326
349
extension MacroDeclSyntax {
327
350
/// Expand the definition of this macro when provided with the given
328
351
/// argument list.
329
352
private func expand(
330
353
argumentList: LabeledExprListSyntax ? ,
354
+ genericArgumentList: GenericArgumentClauseSyntax ? ,
331
355
definition: MacroExpansionExprSyntax ,
332
356
replacements: [ MacroDefinition . Replacement ] ,
333
- genericReplacements: [ MacroDefinition . GenericArgumentReplacement ]
357
+ genericReplacements: [ MacroDefinition . GenericArgumentReplacement ] = [ ]
334
358
) -> ExprSyntax {
335
359
// FIXME: Do real call-argument matching between the argument list and the
336
360
// macro parameter list, porting over from the compiler.
361
+ let parameterReplacements = Dictionary (
362
+ uniqueKeysWithValues: replacements. map { replacement in
363
+ ( replacement. reference, replacement. parameterIndex)
364
+ }
365
+ )
337
366
let arguments : [ ExprSyntax ] =
338
367
argumentList? . map { element in
339
368
element. expression
340
369
} ?? [ ]
341
370
342
- return MacroExpansionRewriter (
343
- parameterReplacements: Dictionary (
344
- uniqueKeysWithValues: replacements. map { replacement in
345
- ( replacement. reference, replacement. parameterIndex)
346
- }
347
- ) ,
348
- genericReplacements: Dictionary (
349
- uniqueKeysWithValues: replacements. map { replacement in
350
- ( replacement. reference, replacement. parameterIndex)
351
- }
352
- ) ,
353
- arguments: arguments
354
- ) . visit ( definition)
371
+
372
+ let genericReplacements = Dictionary (
373
+ uniqueKeysWithValues: genericReplacements. map { replacement in
374
+ ( replacement. reference, replacement. parameterIndex)
375
+ }
376
+ )
377
+ let genericArguments : [ TypeSyntax ] =
378
+ genericArgumentList? . arguments. map { element in
379
+ element. argument
380
+ } ?? [ ]
381
+
382
+
383
+ let rewriter : MacroExpansionRewriter = MacroExpansionRewriter (
384
+ parameterReplacements: parameterReplacements,
385
+ arguments: arguments,
386
+ genericReplacements: genericReplacements,
387
+ genericArguments: genericArguments
388
+ )
389
+ return rewriter. visit ( definition)
355
390
}
356
391
357
392
/// Given a freestanding macro expansion syntax node that references this
@@ -365,6 +400,7 @@ extension MacroDeclSyntax {
365
400
) -> ExprSyntax {
366
401
return expand (
367
402
argumentList: node. arguments,
403
+ genericArgumentList: node. genericArgumentClause,
368
404
definition: definition,
369
405
replacements: replacements,
370
406
genericReplacements: genericReplacements
@@ -390,6 +426,7 @@ extension MacroDeclSyntax {
390
426
391
427
return expand (
392
428
argumentList: argumentList,
429
+ genericArgumentList: . init( arguments: [ ] ) ,
393
430
definition: definition,
394
431
replacements: replacements,
395
432
genericReplacements: genericReplacements
0 commit comments