@@ -134,7 +134,7 @@ public enum EffectSpecifier: TokenSpecSet {
134
134
135
135
/// Raw syntax nodes don't have traits (because usually we don't need them).
136
136
/// Specify the effect specifiers trait manually as a one off.
137
- protocol RawEffectSpecifiersTrait {
137
+ protocol RawMisplacedEffectSpecifiersTrait {
138
138
/// The token kinds that should be consumed as misspelled `asyncSpecifier`.
139
139
/// Should be a subset of ``AsyncEffectSpecifier``.
140
140
associatedtype MisspelledAsyncTokenKinds : TokenSpecSet
@@ -151,10 +151,21 @@ protocol RawEffectSpecifiersTrait {
151
151
/// Should be a subset of ``ThrowsEffectSpecifier``.
152
152
associatedtype CorrectThrowsTokenKinds : TokenSpecSet
153
153
154
- var unexpectedBeforeAsyncSpecifier : RawUnexpectedNodesSyntax ? { get }
155
154
var asyncSpecifier : RawTokenSyntax ? { get }
156
- var unexpectedBetweenAsyncSpecifierAndThrowsSpecifier : RawUnexpectedNodesSyntax ? { get }
157
155
var throwsSpecifier : RawTokenSyntax ? { get }
156
+
157
+ init (
158
+ asyncSpecifier: RawTokenSyntax ? ,
159
+ throwsSpecifier: RawTokenSyntax ? ,
160
+ arena: __shared SyntaxArena
161
+ )
162
+
163
+ func withMisplaced( async misplacedAsyncKeyword: RawTokenSyntax ? , throws misplacedThrowsKeyword: RawTokenSyntax ? , arena: __shared SyntaxArena) -> Self
164
+ }
165
+
166
+ protocol RawEffectSpecifiersTrait : RawMisplacedEffectSpecifiersTrait {
167
+ var unexpectedBeforeAsyncSpecifier : RawUnexpectedNodesSyntax ? { get }
168
+ var unexpectedBetweenAsyncSpecifierAndThrowsSpecifier : RawUnexpectedNodesSyntax ? { get }
158
169
var unexpectedAfterThrowsSpecifier : RawUnexpectedNodesSyntax ? { get }
159
170
160
171
init (
@@ -168,6 +179,21 @@ protocol RawEffectSpecifiersTrait {
168
179
}
169
180
170
181
extension RawEffectSpecifiersTrait {
182
+ init (
183
+ asyncSpecifier: RawTokenSyntax ? ,
184
+ throwsSpecifier: RawTokenSyntax ? ,
185
+ arena: __shared SyntaxArena
186
+ ) {
187
+ self . init (
188
+ nil ,
189
+ asyncSpecifier: asyncSpecifier,
190
+ nil ,
191
+ throwsSpecifier: throwsSpecifier,
192
+ nil ,
193
+ arena: arena
194
+ )
195
+ }
196
+
171
197
func withMisplaced( async misplacedAsyncKeyword: RawTokenSyntax ? , throws misplacedThrowsKeyword: RawTokenSyntax ? , arena: __shared SyntaxArena) -> Self {
172
198
return Self . init (
173
199
self . unexpectedBeforeAsyncSpecifier,
@@ -417,8 +443,7 @@ extension RawAccessorEffectSpecifiersSyntax: RawEffectSpecifiersTrait {
417
443
}
418
444
}
419
445
420
- // This conformance exists solely to parse misplaced specifiers in parseFunctionReturnClause()
421
- extension RawDeinitEffectSpecifiersSyntax : RawEffectSpecifiersTrait {
446
+ extension RawDeinitEffectSpecifiersSyntax : RawMisplacedEffectSpecifiersTrait {
422
447
enum MisspelledAsyncTokenKinds : TokenSpecSet {
423
448
case await
424
449
case reasync
@@ -495,25 +520,32 @@ extension RawDeinitEffectSpecifiersSyntax: RawEffectSpecifiersTrait {
495
520
}
496
521
}
497
522
498
- var unexpectedBetweenAsyncSpecifierAndThrowsSpecifier : RawUnexpectedNodesSyntax ? { unexpectedAfterAsyncSpecifier }
499
523
var throwsSpecifier : RawTokenSyntax ? { nil }
500
- var unexpectedAfterThrowsSpecifier : RawUnexpectedNodesSyntax ? { nil }
501
524
502
525
init (
503
- _ unexpectedBeforeAsyncSpecifier: RawUnexpectedNodesSyntax ? ,
504
526
asyncSpecifier: RawTokenSyntax ? ,
505
- _ unexpectedBetweenAsyncSpecifierAndThrowsSpecifier: RawUnexpectedNodesSyntax ? ,
506
527
throwsSpecifier: RawTokenSyntax ? ,
507
- _ unexpectedAfterThrowsSpecifier: RawUnexpectedNodesSyntax ? ,
508
528
arena: __shared SwiftSyntax. SyntaxArena
509
529
) {
510
530
// Inserted missing throws is discarded
511
- assert ( throwsSpecifier? . isMissing ?? true )
512
- assert ( unexpectedAfterThrowsSpecifier == nil )
531
+ precondition ( throwsSpecifier? . isMissing ?? true )
513
532
self . init (
514
- unexpectedBeforeAsyncSpecifier ,
533
+ nil ,
515
534
asyncSpecifier: asyncSpecifier,
516
- unexpectedBetweenAsyncSpecifierAndThrowsSpecifier,
535
+ nil ,
536
+ arena: arena
537
+ )
538
+ }
539
+
540
+ func withMisplaced( async misplacedAsyncKeyword: RawTokenSyntax ? , throws misplacedThrowsKeyword: RawTokenSyntax ? , arena: SyntaxArena )
541
+ -> RawDeinitEffectSpecifiersSyntax
542
+ {
543
+ // Inserted missing throws is discarded
544
+ precondition ( throwsSpecifier? . isMissing ?? true )
545
+ return Self . init (
546
+ self . unexpectedBeforeAsyncSpecifier,
547
+ asyncSpecifier: self . asyncSpecifier ?? misplacedAsyncKeyword,
548
+ self . unexpectedAfterAsyncSpecifier,
517
549
arena: arena
518
550
)
519
551
}
@@ -672,7 +704,7 @@ extension Parser {
672
704
/// When a misplaced effect specifier is consumed and `effectSpecifiers`
673
705
/// doesn't have an effect specifier of that kind, modify `effectSpecifiers`
674
706
/// to have a missing specifier of that kind.
675
- mutating func parseMisplacedEffectSpecifiers< S: RawEffectSpecifiersTrait > ( _ effectSpecifiers: inout S ? ) -> RawUnexpectedNodesSyntax ? {
707
+ mutating func parseMisplacedEffectSpecifiers< S: RawMisplacedEffectSpecifiersTrait > ( _ effectSpecifiers: inout S ? ) -> RawUnexpectedNodesSyntax ? {
676
708
var synthesizedAsync : RawTokenSyntax ? = nil
677
709
var synthesizedThrows : RawTokenSyntax ? = nil
678
710
var unexpected : [ RawTokenSyntax ] = [ ]
@@ -707,11 +739,8 @@ extension Parser {
707
739
effectSpecifiers = specifiers. withMisplaced ( async : synthesizedAsync, throws: synthesizedThrows, arena: self . arena)
708
740
} else {
709
741
effectSpecifiers = S (
710
- nil ,
711
742
asyncSpecifier: synthesizedAsync,
712
- nil ,
713
743
throwsSpecifier: synthesizedThrows,
714
- nil ,
715
744
arena: self . arena
716
745
)
717
746
}
0 commit comments