Skip to content

Commit af9f087

Browse files
committed
[Macros] Adjust macro declaration syntax to match the latest pitch.
Instead of macro definitions always being defined via `= ModuleName.TypeName`, parse the more general `= expression`, which is already captured by the `InitializerClause` grammar production. Additionally, make the definition optional, which accounts for built-in macros.
1 parent b0fc9a0 commit af9f087

File tree

3 files changed

+14
-26
lines changed

3 files changed

+14
-26
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,18 +2039,16 @@ extension Parser {
20392039
signature = .functionLike(self.parseFunctionSignature())
20402040
}
20412041

2042-
// External macro name
2043-
let (unexpectedBeforeEqual, equal) = self.expect(.equal)
2044-
let (unexpectedBeforeModuleName, moduleName) = self.expectIdentifier()
2045-
let (unexpectedBeforePeriod, period) = self.expect(.period)
2046-
let (unexpectedBeforeMacroTypeName, macroTypeName) = self.expectIdentifier()
2047-
2048-
let externalMacroName = RawExternalMacroNameSyntax(
2049-
unexpectedBeforeModuleName, moduleName: moduleName,
2050-
unexpectedBeforePeriod, period: period,
2051-
unexpectedBeforeMacroTypeName, macroTypeName: macroTypeName,
2052-
arena: self.arena
2053-
)
2042+
// Initializer, if any.
2043+
let definition: RawInitializerClauseSyntax?
2044+
if let equal = self.consume(if: .equal) {
2045+
let expr = self.parseExpression()
2046+
definition = RawInitializerClauseSyntax(
2047+
equal: equal, value: expr, arena: self.arena
2048+
)
2049+
} else {
2050+
definition = nil
2051+
}
20542052

20552053
// Parse a 'where' clause if present.
20562054
let whereClause: RawGenericWhereClauseSyntax?
@@ -2065,8 +2063,7 @@ extension Parser {
20652063
unexpectedBeforeIntroducerKeyword, macroKeyword: introducerKeyword,
20662064
unexpectedBeforeName, identifier: name,
20672065
genericParameterClause: genericParams,
2068-
signature: signature, unexpectedBeforeEqual, equal: equal,
2069-
externalName: externalMacroName,
2066+
signature: signature, definition: definition,
20702067
genericWhereClause: whereClause,
20712068
arena: self.arena
20722069
)

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,15 +1321,14 @@ final class DeclarationTests: XCTestCase {
13211321
macro m2(_: Int) = A.M2
13221322
macro m3(a b: Int) -> Int = A.M3
13231323
macro m4<T>: T = A.M4 where T.Assoc: P
1324-
macro m4<T: P>(_: T) = A.M4
1324+
macro m5<T: P>(_: T)
13251325
""")
13261326

13271327
AssertParse("""
1328-
macro m1 1️⃣= A2️⃣
1328+
macro m1 1️⃣= A
13291329
""",
13301330
diagnostics: [
13311331
DiagnosticSpec(locationMarker: "1️⃣", message: "expected parameter clause in function signature"),
1332-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected '.' and macro type name in external macro name"),
13331332
]
13341333
)
13351334
}

gyb_syntax_support/DeclNodes.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -933,19 +933,11 @@
933933
Child('FunctionLike', kind='FunctionSignature', name_for_diagnostics="macro signature"),
934934
Child('ValueLike', kind='TypeAnnotation', name_for_diagnostics="macro signature"),
935935
]),
936-
Child('Equal', kind='EqualToken'),
937-
Child('ExternalName', kind='ExternalMacroName', name_for_diagnostics='external macro name', is_optional = True),
936+
Child('Definition', kind='InitializerClause', name_for_diagnostics='macro definition', is_optional=True),
938937
Child('GenericWhereClause', kind='GenericWhereClause', name_for_diagnostics='generic where clause',
939938
is_optional=True),
940939
]),
941940

942-
Node('ExternalMacroName', name_for_diagnostics='external macro name', kind='Syntax',
943-
children=[
944-
Child('ModuleName', kind='IdentifierToken', name_for_diagnostics='module name'),
945-
Child('Period', kind='PeriodToken'),
946-
Child('MacroTypeName', kind='IdentifierToken', name_for_diagnostics='macro type name'),
947-
]),
948-
949941
# e.g., "#embed("filename.txt")"
950942
Node('MacroExpansionDecl',
951943
name_for_diagnostics="pound literal declaration", kind='Decl',

0 commit comments

Comments
 (0)