|
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
13 | 13 | #if compiler(>=6) |
14 | | -@_spi(RawSyntax) public import SwiftSyntax |
| 14 | +@_spi(ExperimentalLanguageFeatures) @_spi(RawSyntax) public import SwiftSyntax |
15 | 15 | #else |
16 | | -@_spi(RawSyntax) import SwiftSyntax |
| 16 | +@_spi(ExperimentalLanguageFeatures) @_spi(RawSyntax) import SwiftSyntax |
17 | 17 | #endif |
18 | 18 |
|
19 | 19 | // MARK: - TokenSpecSet |
@@ -620,7 +620,39 @@ extension Parser { |
620 | 620 | ) |
621 | 621 | } |
622 | 622 |
|
623 | | - private mutating func parseEffectSpecifiers<S: RawEffectSpecifiersTrait>(_: S.Type) -> S? { |
| 623 | + mutating func parseYields() -> RawYieldsClauseSyntax? { |
| 624 | + let (unexpectedBeforeYields, yieldsKeyword) = self.expect(.keyword(.yields)) |
| 625 | + // If there is no `yields` at all, then let result type parsing handle everything else |
| 626 | + if yieldsKeyword.isMissing { |
| 627 | + return nil |
| 628 | + } |
| 629 | + |
| 630 | + guard let leftParen = self.consume(if: .leftParen) else { |
| 631 | + return RawYieldsClauseSyntax( |
| 632 | + unexpectedBeforeYields, |
| 633 | + yieldsKeyword: yieldsKeyword, |
| 634 | + leftParen: nil, |
| 635 | + type: nil, |
| 636 | + rightParen: nil, |
| 637 | + arena: self.arena |
| 638 | + ) |
| 639 | + } |
| 640 | + |
| 641 | + let type = self.parseType() |
| 642 | + let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen) |
| 643 | + |
| 644 | + return RawYieldsClauseSyntax( |
| 645 | + unexpectedBeforeYields, |
| 646 | + yieldsKeyword: yieldsKeyword, |
| 647 | + leftParen: leftParen, |
| 648 | + type: type, |
| 649 | + unexpectedBeforeRightParen, |
| 650 | + rightParen: rightParen, |
| 651 | + arena: self.arena |
| 652 | + ) |
| 653 | + } |
| 654 | + |
| 655 | + private mutating func parseEffectSpecifiers<S: RawEffectSpecifiersTrait>(_: S.Type) -> (S?, RawYieldsClauseSyntax?) { |
624 | 656 | var unexpectedBeforeAsync: [RawSyntax] = [] |
625 | 657 | var asyncKeyword: RawTokenSyntax? = nil |
626 | 658 | var unexpectedBeforeThrows: [RawSyntax] = [] |
@@ -690,32 +722,37 @@ extension Parser { |
690 | 722 | } |
691 | 723 | } |
692 | 724 |
|
| 725 | + let yields = parseYields() |
| 726 | + |
693 | 727 | if unexpectedBeforeAsync.isEmpty && asyncKeyword == nil && unexpectedBeforeThrows.isEmpty && throwsClause == nil |
694 | 728 | && unexpectedAfterThrowsClause.isEmpty |
695 | 729 | { |
696 | | - return nil |
| 730 | + return (nil, yields) |
697 | 731 | } |
698 | 732 |
|
699 | | - return S( |
700 | | - RawUnexpectedNodesSyntax(unexpectedBeforeAsync, arena: self.arena), |
701 | | - asyncSpecifier: asyncKeyword, |
702 | | - RawUnexpectedNodesSyntax(unexpectedBeforeThrows, arena: self.arena), |
703 | | - throwsClause: throwsClause, |
704 | | - RawUnexpectedNodesSyntax(unexpectedAfterThrowsClause, arena: self.arena), |
705 | | - arena: self.arena |
| 733 | + return ( |
| 734 | + S( |
| 735 | + RawUnexpectedNodesSyntax(unexpectedBeforeAsync, arena: self.arena), |
| 736 | + asyncSpecifier: asyncKeyword, |
| 737 | + RawUnexpectedNodesSyntax(unexpectedBeforeThrows, arena: self.arena), |
| 738 | + throwsClause: throwsClause, |
| 739 | + RawUnexpectedNodesSyntax(unexpectedAfterThrowsClause, arena: self.arena), |
| 740 | + arena: self.arena |
| 741 | + ), |
| 742 | + yields |
706 | 743 | ) |
707 | 744 | } |
708 | 745 |
|
709 | | - mutating func parseTypeEffectSpecifiers() -> RawTypeEffectSpecifiersSyntax? { |
| 746 | + mutating func parseTypeEffectSpecifiers() -> (RawTypeEffectSpecifiersSyntax?, RawYieldsClauseSyntax?) { |
710 | 747 | return parseEffectSpecifiers(RawTypeEffectSpecifiersSyntax.self) |
711 | 748 | } |
712 | 749 |
|
713 | | - mutating func parseFunctionEffectSpecifiers() -> RawFunctionEffectSpecifiersSyntax? { |
| 750 | + mutating func parseFunctionEffectSpecifiers() -> (RawFunctionEffectSpecifiersSyntax?, RawYieldsClauseSyntax?) { |
714 | 751 | return parseEffectSpecifiers(RawFunctionEffectSpecifiersSyntax.self) |
715 | 752 | } |
716 | 753 |
|
717 | 754 | mutating func parseAccessorEffectSpecifiers() -> RawAccessorEffectSpecifiersSyntax? { |
718 | | - return parseEffectSpecifiers(RawAccessorEffectSpecifiersSyntax.self) |
| 755 | + return parseEffectSpecifiers(RawAccessorEffectSpecifiersSyntax.self).0 |
719 | 756 | } |
720 | 757 |
|
721 | 758 | mutating func parseDeinitEffectSpecifiers() -> RawDeinitializerEffectSpecifiersSyntax? { |
|
0 commit comments