Skip to content

Commit c8c722d

Browse files
committed
Add parsing of generic arguments in macro expansions
1 parent 2e72de6 commit c8c722d

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2018,6 +2018,14 @@ extension Parser {
20182018
let poundKeyword = self.consumeAnyToken()
20192019
let (unexpectedBeforeMacro, macro) = self.expectIdentifier()
20202020

2021+
// Parse the optional generic argument list.
2022+
let generics: RawGenericArgumentClauseSyntax?
2023+
if self.lookahead().canParseAsGenericArgumentList() {
2024+
generics = self.parseGenericArguments()
2025+
} else {
2026+
generics = nil
2027+
}
2028+
20212029
// Parse the optional parenthesized argument list.
20222030
let leftParen = self.consume(if: .leftParen, where: { !$0.isAtStartOfLine })
20232031
let args: [RawTupleExprElementSyntax]
@@ -2048,6 +2056,7 @@ extension Parser {
20482056
poundToken: poundKeyword,
20492057
unexpectedBeforeMacro,
20502058
macro: macro,
2059+
genericArguments: generics,
20512060
leftParen: leftParen,
20522061
argumentList: RawTupleExprElementListSyntax(
20532062
elements: args, arena: self.arena

Sources/SwiftParser/Expressions.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,14 @@ extension Parser {
11631163
let poundKeyword = self.consumeAnyToken()
11641164
let (unexpectedBeforeMacro, macro) = self.expectIdentifier()
11651165

1166+
// Parse the optional generic argument list.
1167+
let generics: RawGenericArgumentClauseSyntax?
1168+
if self.lookahead().canParseAsGenericArgumentList() {
1169+
generics = self.parseGenericArguments()
1170+
} else {
1171+
generics = nil
1172+
}
1173+
11661174
// Parse the optional parenthesized argument list.
11671175
let leftParen = self.consume(if: .leftParen, where: { !$0.isAtStartOfLine })
11681176
let args: [RawTupleExprElementSyntax]
@@ -1191,6 +1199,7 @@ extension Parser {
11911199
poundToken: poundKeyword,
11921200
unexpectedBeforeMacro,
11931201
macro: macro,
1202+
genericArguments: generics,
11941203
leftParen: leftParen,
11951204
argumentList: RawTupleExprElementListSyntax(
11961205
elements: args, arena: self.arena

Sources/_SwiftSyntaxMacros/Syntax+MacroEvaluation.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ extension MacroExpansionDeclSyntax {
4949
MacroExpansionExprSyntax(
5050
unexpectedBeforePoundToken, poundToken: poundToken,
5151
unexpectedBetweenPoundTokenAndMacro, macro: macro,
52-
unexpectedBetweenMacroAndLeftParen, leftParen: leftParen,
52+
genericArguments: genericArguments,
53+
unexpectedBetweenGenericArgumentsAndLeftParen, leftParen: leftParen,
5354
unexpectedBetweenLeftParenAndArgumentList, argumentList: argumentList,
5455
unexpectedBetweenArgumentListAndRightParen, rightParen: rightParen,
5556
unexpectedBetweenRightParenAndTrailingClosure,

Tests/SwiftParserTest/ExpressionTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,12 @@ final class ExpressionTests: XCTestCase {
343343
additionalTrailingClosures: nil)),
344344
trailingComma: .commaToken())),
345345
substructureAfterMarker: "1️⃣")
346+
347+
AssertParse(
348+
"""
349+
#fancyMacro<Arg1, Arg2>(hello: "me")
350+
"""
351+
)
346352
}
347353

348354
func testInterpolatedStringLiterals() {

0 commit comments

Comments
 (0)