@@ -582,7 +582,18 @@ extension TokenConsumer {
582
582
// MARK: - Parsing effect specifiers
583
583
584
584
extension Parser {
585
+ /// Parse a throws clause after we've already parsed the 'throws' keyword to introduce it.
585
586
private mutating func parseThrowsClause( after throwsKeyword: RawTokenSyntax ) -> RawThrowsClauseSyntax {
587
+ guard self . at ( . leftParen) && experimentalFeatures. contains ( . typedThrows) else {
588
+ return RawThrowsClauseSyntax (
589
+ throwsSpecifier: throwsKeyword,
590
+ leftParen: nil ,
591
+ type: nil ,
592
+ rightParen: nil ,
593
+ arena: self . arena
594
+ )
595
+ }
596
+
586
597
let ( unexpectedBetweenThrowsSpecifierAndLeftParen, leftParen) = self . expect ( . leftParen)
587
598
let type = self . parseType ( )
588
599
let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
@@ -601,7 +612,6 @@ extension Parser {
601
612
var unexpectedBeforeAsync : [ RawSyntax ] = [ ]
602
613
var asyncKeyword : RawTokenSyntax ? = nil
603
614
var unexpectedBeforeThrows : [ RawSyntax ] = [ ]
604
- var throwsKeyword : RawTokenSyntax ?
605
615
var throwsClause : RawThrowsClauseSyntax ?
606
616
var unexpectedAfterThrowsClause : [ RawSyntax ] = [ ]
607
617
@@ -625,10 +635,10 @@ extension Parser {
625
635
unexpectedBeforeThrows. append ( RawSyntax ( misspelledAsync) )
626
636
} else if let misspelledThrows = self . consume ( ifAnyIn: S . MisspelledThrowsTokenKinds. self) {
627
637
unexpectedBeforeThrows. append ( RawSyntax ( misspelledThrows) )
628
- if throwsKeyword == nil {
638
+ if throwsClause == nil {
629
639
// Let's synthesize a missing 'throws'. If we find a real throws specifier
630
640
// later, we will replace the missing token by the present token.
631
- throwsKeyword = missingToken ( . keyword( . throws) )
641
+ throwsClause = RawThrowsClauseSyntax ( throwsSpecifier : missingToken ( . keyword( . throws) ) , leftParen : nil , type : nil , rightParen : nil , arena : self . arena )
632
642
}
633
643
} else {
634
644
break
@@ -638,11 +648,8 @@ extension Parser {
638
648
if let ( _, handle) = self . canRecoverTo ( anyIn: S . CorrectThrowsTokenKinds. self) {
639
649
let ( unexpected, throwsKw) = self . eat ( handle)
640
650
unexpectedBeforeThrows. append ( contentsOf: unexpected? . elements ?? [ ] )
641
- throwsKeyword = throwsKw
642
651
643
- if self . at ( . leftParen) && experimentalFeatures. contains ( . typedThrows) {
644
- throwsClause = parseThrowsClause ( after: throwsKw)
645
- }
652
+ throwsClause = parseThrowsClause ( after: throwsKw)
646
653
}
647
654
648
655
var unexpectedAfterThrownErrorLoopProgress = LoopProgressCondition ( )
@@ -662,19 +669,12 @@ extension Parser {
662
669
}
663
670
}
664
671
665
- if unexpectedBeforeAsync. isEmpty && asyncKeyword == nil && unexpectedBeforeThrows. isEmpty && throwsKeyword == nil && throwsClause == nil
672
+ if unexpectedBeforeAsync. isEmpty && asyncKeyword == nil && unexpectedBeforeThrows. isEmpty && throwsClause == nil
666
673
&& unexpectedAfterThrowsClause. isEmpty
667
674
{
668
675
return nil
669
676
}
670
677
671
- // If needed, form a throws clause from just the throws keyword.
672
- throwsClause =
673
- throwsClause
674
- ?? throwsKeyword. map {
675
- RawThrowsClauseSyntax ( throwsSpecifier: $0, leftParen: nil , type: nil , rightParen: nil , arena: self . arena)
676
- }
677
-
678
678
return S (
679
679
RawUnexpectedNodesSyntax ( unexpectedBeforeAsync, arena: self . arena) ,
680
680
asyncSpecifier: asyncKeyword,
0 commit comments