@@ -66,7 +66,7 @@ extension Parser {
66
66
case TokenSpec ( . _specialize) : self = . _specialize
67
67
case TokenSpec ( . _spi_available) : self = . _spi_available
68
68
case TokenSpec ( . `rethrows`) : self = . rethrows
69
- case TokenSpec ( . abi) where experimentalFeatures . contains ( . abiAttribute ) : self = . abi
69
+ case TokenSpec ( . abi) : self = . abi
70
70
case TokenSpec ( . attached) : self = . attached
71
71
case TokenSpec ( . available) : self = . available
72
72
case TokenSpec ( . backDeployed) : self = . backDeployed
@@ -139,8 +139,12 @@ extension Parser {
139
139
/// - parseMissingArguments: If provided, called instead of `parseArgument` when an argument list was required but no opening parenthesis was present.
140
140
mutating func parseAttribute(
141
141
argumentMode: AttributeArgumentMode ,
142
- parseArguments: ( inout Parser ) -> RawAttributeSyntax . Arguments ,
143
- parseMissingArguments: ( ( inout Parser ) -> RawAttributeSyntax . Arguments ) ? = nil
142
+ parseArguments: ( inout Parser ) -> (
143
+ unexpectedBefore: RawUnexpectedNodesSyntax ? , arguments: RawAttributeSyntax . Arguments
144
+ ) ,
145
+ parseMissingArguments: (
146
+ ( inout Parser ) -> ( unexpectedBefore: RawUnexpectedNodesSyntax ? , arguments: RawAttributeSyntax . Arguments )
147
+ ) ? = nil
144
148
) -> RawAttributeListSyntax . Element {
145
149
var ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
146
150
if atSign. trailingTriviaByteLength > 0 || self . currentToken. leadingTriviaByteLength > 0 {
@@ -175,11 +179,12 @@ extension Parser {
175
179
)
176
180
leftParen = leftParen. tokenView. withTokenDiagnostic ( tokenDiagnostic: diagnostic, arena: self . arena)
177
181
}
182
+ let unexpectedBeforeArguments : RawUnexpectedNodesSyntax ?
178
183
let argument : RawAttributeSyntax . Arguments
179
184
if let parseMissingArguments, leftParen. presence == . missing {
180
- argument = parseMissingArguments ( & self )
185
+ ( unexpectedBeforeArguments , argument) = parseMissingArguments ( & self )
181
186
} else {
182
- argument = parseArguments ( & self )
187
+ ( unexpectedBeforeArguments , argument) = parseArguments ( & self )
183
188
}
184
189
let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
185
190
return . attribute(
@@ -189,6 +194,7 @@ extension Parser {
189
194
attributeName: attributeName,
190
195
unexpectedBeforeLeftParen,
191
196
leftParen: leftParen,
197
+ unexpectedBeforeArguments,
192
198
arguments: argument,
193
199
unexpectedBeforeRightParen,
194
200
rightParen: rightParen,
@@ -224,41 +230,41 @@ extension Parser {
224
230
switch peek ( isAtAnyIn: DeclarationAttributeWithSpecialSyntax . self) {
225
231
case . abi:
226
232
return parseAttribute ( argumentMode: . required) { parser in
227
- return . abiArguments ( parser. parseABIAttributeArguments ( ) )
233
+ return parser. parseABIAttributeArguments ( )
228
234
} parseMissingArguments: { parser in
229
- return . abiArguments ( parser. parseABIAttributeArguments ( missingLParen: true ) )
235
+ return parser. parseABIAttributeArguments ( missingLParen: true )
230
236
}
231
237
case . available, . _spi_available:
232
238
return parseAttribute ( argumentMode: . required) { parser in
233
- return . availability( parser. parseAvailabilityArgumentSpecList ( ) )
239
+ return ( nil , . availability( parser. parseAvailabilityArgumentSpecList ( ) ) )
234
240
}
235
241
case . backDeployed, . _backDeploy:
236
242
return parseAttribute ( argumentMode: . required) { parser in
237
- return . backDeployedArguments( parser. parseBackDeployedAttributeArguments ( ) )
243
+ return ( nil , . backDeployedArguments( parser. parseBackDeployedAttributeArguments ( ) ) )
238
244
}
239
245
case . differentiable:
240
246
return parseAttribute ( argumentMode: . required) { parser in
241
- return . differentiableArguments( parser. parseDifferentiableAttributeArguments ( ) )
247
+ return ( nil , . differentiableArguments( parser. parseDifferentiableAttributeArguments ( ) ) )
242
248
}
243
249
case . derivative, . transpose:
244
250
return parseAttribute ( argumentMode: . required) { parser in
245
- return . derivativeRegistrationArguments( parser. parseDerivativeAttributeArguments ( ) )
251
+ return ( nil , . derivativeRegistrationArguments( parser. parseDerivativeAttributeArguments ( ) ) )
246
252
}
247
253
case . objc:
248
254
return parseAttribute ( argumentMode: . optional) { parser in
249
- return . objCName( parser. parseObjectiveCSelector ( ) )
255
+ return ( nil , . objCName( parser. parseObjectiveCSelector ( ) ) )
250
256
}
251
257
case . _specialize:
252
258
return parseAttribute ( argumentMode: . required) { parser in
253
- return . specializeArguments( parser. parseSpecializeAttributeArgumentList ( ) )
259
+ return ( nil , . specializeArguments( parser. parseSpecializeAttributeArgumentList ( ) ) )
254
260
}
255
261
case . _dynamicReplacement:
256
262
return parseAttribute ( argumentMode: . required) { parser in
257
- return . dynamicReplacementArguments( parser. parseDynamicReplacementAttributeArguments ( ) )
263
+ return ( nil , . dynamicReplacementArguments( parser. parseDynamicReplacementAttributeArguments ( ) ) )
258
264
}
259
265
case . _documentation:
260
266
return parseAttribute ( argumentMode: . required) { parser in
261
- return . documentationArguments( parser. parseDocumentationAttributeArguments ( ) )
267
+ return ( nil , . documentationArguments( parser. parseDocumentationAttributeArguments ( ) ) )
262
268
}
263
269
case . _effects:
264
270
return parseAttribute ( argumentMode: . required) { parser in
@@ -268,20 +274,20 @@ extension Parser {
268
274
while !parser. at ( . rightParen, . endOfFile) {
269
275
tokens. append ( parser. consumeAnyToken ( ) )
270
276
}
271
- return . effectsArguments( RawEffectsAttributeArgumentListSyntax ( elements: tokens, arena: parser. arena) )
277
+ return ( nil , . effectsArguments( RawEffectsAttributeArgumentListSyntax ( elements: tokens, arena: parser. arena) ) )
272
278
}
273
279
case . _implements:
274
280
return parseAttribute ( argumentMode: . required) { parser in
275
- return . implementsArguments( parser. parseImplementsAttributeArguments ( ) )
281
+ return ( nil , . implementsArguments( parser. parseImplementsAttributeArguments ( ) ) )
276
282
}
277
283
case . _originallyDefinedIn:
278
284
return parseAttribute ( argumentMode: . required) { parser in
279
- return . originallyDefinedInArguments( parser. parseOriginallyDefinedInAttributeArguments ( ) )
285
+ return ( nil , . originallyDefinedInArguments( parser. parseOriginallyDefinedInAttributeArguments ( ) ) )
280
286
}
281
287
case . attached, . freestanding:
282
288
return parseAttribute ( argumentMode: . customAttribute) { parser in
283
289
let arguments = parser. parseMacroRoleArguments ( )
284
- return . argumentList( RawLabeledExprListSyntax ( elements: arguments, arena: parser. arena) )
290
+ return ( nil , . argumentList( RawLabeledExprListSyntax ( elements: arguments, arena: parser. arena) ) )
285
291
}
286
292
case . rethrows:
287
293
let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
@@ -308,7 +314,7 @@ extension Parser {
308
314
pattern: . none,
309
315
allowTrailingComma: true
310
316
)
311
- return . argumentList( RawLabeledExprListSyntax ( elements: arguments, arena: parser. arena) )
317
+ return ( nil , . argumentList( RawLabeledExprListSyntax ( elements: arguments, arena: parser. arena) ) )
312
318
}
313
319
}
314
320
}
@@ -786,9 +792,11 @@ extension Parser {
786
792
/// Parse the arguments inside an `@abi(...)` attribute.
787
793
///
788
794
/// - Parameter missingLParen: `true` if the opening paren for the argument list was missing.
789
- mutating func parseABIAttributeArguments( missingLParen: Bool = false ) -> RawABIAttributeArgumentsSyntax {
790
- func makeMissingProviderArguments( unexpectedBefore: [ RawSyntax ] ) -> RawABIAttributeArgumentsSyntax {
791
- return RawABIAttributeArgumentsSyntax (
795
+ mutating func parseABIAttributeArguments(
796
+ missingLParen: Bool = false
797
+ ) -> ( RawUnexpectedNodesSyntax ? , RawAttributeSyntax . Arguments ) {
798
+ func makeMissingProviderArguments( unexpectedBefore: [ RawSyntax ] ) -> RawAttributeSyntax . Arguments {
799
+ let args = RawABIAttributeArgumentsSyntax (
792
800
provider: . missing(
793
801
RawMissingDeclSyntax (
794
802
unexpectedBefore. isEmpty ? nil : RawUnexpectedNodesSyntax ( elements: unexpectedBefore, arena: self . arena) ,
@@ -800,6 +808,7 @@ extension Parser {
800
808
) ,
801
809
arena: self . arena
802
810
)
811
+ return . abiArguments( args)
803
812
}
804
813
805
814
// Consider the three kinds of mistakes we might see here:
@@ -815,16 +824,23 @@ extension Parser {
815
824
// In lieu of that, we judge that recovering gracefully from #3 is more important than #2 and therefore do not even
816
825
// attempt to parse the argument unless we've seen a left paren.
817
826
guard !missingLParen && !self . at ( . rightParen) else {
818
- return makeMissingProviderArguments ( unexpectedBefore: [ ] )
827
+ return ( nil , makeMissingProviderArguments ( unexpectedBefore: [ ] ) )
819
828
}
820
829
821
830
let decl = parseDeclaration ( in: . argumentList)
822
831
832
+ guard experimentalFeatures. contains ( . abiAttribute) else {
833
+ return (
834
+ RawUnexpectedNodesSyntax ( [ decl] , arena: self . arena) ,
835
+ . argumentList( RawLabeledExprListSyntax ( elements: [ ] , arena: self . arena) )
836
+ )
837
+ }
838
+
823
839
guard let provider = RawABIAttributeArgumentsSyntax . Provider ( decl) else {
824
- return makeMissingProviderArguments ( unexpectedBefore: [ decl. raw] )
840
+ return ( nil , makeMissingProviderArguments ( unexpectedBefore: [ decl. raw] ) )
825
841
}
826
842
827
- return RawABIAttributeArgumentsSyntax ( provider: provider, arena: self . arena)
843
+ return ( nil , . abiArguments ( RawABIAttributeArgumentsSyntax ( provider: provider, arena: self . arena) ) )
828
844
}
829
845
}
830
846
0 commit comments