@@ -102,6 +102,9 @@ extension TokenConsumer {
102
102
return false
103
103
case . initKeyword:
104
104
return allowInitDecl
105
+ case . macroContextualKeyword:
106
+ // macro Foo ...
107
+ return subparser. peek ( ) . tokenKind == . identifier
105
108
case . some( _) :
106
109
// All other decl start keywords unconditonally start a decl.
107
110
return true
@@ -149,6 +152,7 @@ extension Parser {
149
152
/// declaration → subscript-declaration
150
153
/// declaration → operator-declaration
151
154
/// declaration → precedence-group-declaration
155
+ /// declaration → macro-declaration
152
156
///
153
157
/// declarations → declaration declarations?
154
158
///
@@ -236,6 +240,8 @@ extension Parser {
236
240
return RawDeclSyntax ( self . parsePrecedenceGroupDeclaration ( attrs, handle) )
237
241
case ( . actorContextualKeyword, let handle) ? :
238
242
return RawDeclSyntax ( self . parseNominalTypeDeclaration ( for: RawActorDeclSyntax . self, attrs: attrs, introucerHandle: handle) )
243
+ case ( . macroContextualKeyword, let handle) ? :
244
+ return RawDeclSyntax ( self . parseMacroDeclaration ( attrs: attrs, introducerHandle: handle) )
239
245
case nil :
240
246
if inMemberDeclList {
241
247
let isProbablyVarDecl = self . at ( any: [ . identifier, . wildcardKeyword] ) && self . peek ( ) . tokenKind. is ( any: [ . colon, . equal, . comma] )
@@ -2007,6 +2013,65 @@ extension Parser {
2007
2013
}
2008
2014
}
2009
2015
2016
+ /// Parse a macro declaration.
2017
+ mutating func parseMacroDeclaration(
2018
+ attrs: DeclAttributes ,
2019
+ introducerHandle: RecoveryConsumptionHandle
2020
+ ) -> RawMacroDeclSyntax {
2021
+ let ( unexpectedBeforeIntroducerKeyword, introducerKeyword) = self . eat ( introducerHandle)
2022
+ let ( unexpectedBeforeName, name) = self . expectIdentifier ( keywordRecovery: true )
2023
+
2024
+ // Optional generic parameters.
2025
+ let genericParams : RawGenericParameterClauseSyntax ?
2026
+ if self . currentToken. starts ( with: " < " ) {
2027
+ genericParams = self . parseGenericParameters ( )
2028
+ } else {
2029
+ genericParams = nil
2030
+ }
2031
+
2032
+ // Macro signature, which is either value-like or function-like.
2033
+ let signature : RawMacroDeclSyntax . Signature
2034
+ if let colon = self . consume ( if: . colon) {
2035
+ let type = self . parseType ( )
2036
+ signature = . valueLike(
2037
+ RawTypeAnnotationSyntax ( colon: colon, type: type, arena: self . arena) )
2038
+ } else {
2039
+ signature = . functionLike( self . parseFunctionSignature ( ) )
2040
+ }
2041
+
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
+ )
2054
+
2055
+ // Parse a 'where' clause if present.
2056
+ let whereClause : RawGenericWhereClauseSyntax ?
2057
+ if self . at ( . whereKeyword) {
2058
+ whereClause = self . parseGenericWhereClause ( )
2059
+ } else {
2060
+ whereClause = nil
2061
+ }
2062
+
2063
+ return RawMacroDeclSyntax (
2064
+ attributes: attrs. attributes, modifiers: attrs. modifiers,
2065
+ unexpectedBeforeIntroducerKeyword, macroKeyword: introducerKeyword,
2066
+ unexpectedBeforeName, identifier: name,
2067
+ genericParameterClause: genericParams,
2068
+ signature: signature, unexpectedBeforeEqual, equal: equal,
2069
+ externalName: externalMacroName,
2070
+ genericWhereClause: whereClause,
2071
+ arena: self . arena
2072
+ )
2073
+ }
2074
+
2010
2075
/// Parse a macro expansion as an declaration.
2011
2076
///
2012
2077
///
0 commit comments