@@ -1575,23 +1575,7 @@ bool Parser::canParseGenericArguments() {
1575
1575
}
1576
1576
}
1577
1577
1578
- bool Parser::canParseType () {
1579
- // 'repeat' starts a pack expansion type.
1580
- consumeIf (tok::kw_repeat);
1581
-
1582
- // Accept 'inout' at for better recovery.
1583
- consumeIf (tok::kw_inout);
1584
-
1585
- if (Tok.isContextualKeyword (" some" )) {
1586
- consumeToken ();
1587
- } else if (Tok.isContextualKeyword (" any" )) {
1588
- consumeToken ();
1589
- } else if (Tok.isContextualKeyword (" each" )) {
1590
- consumeToken ();
1591
- } else if (Tok.isContextualKeyword (" sending" )) {
1592
- consumeToken ();
1593
- }
1594
-
1578
+ bool Parser::canParseTypeSimple () {
1595
1579
switch (Tok.getKind ()) {
1596
1580
case tok::kw_Self:
1597
1581
case tok::kw_Any:
@@ -1637,14 +1621,7 @@ bool Parser::canParseType() {
1637
1621
return canParseType ();
1638
1622
}
1639
1623
case tok::l_square:
1640
- consumeToken ();
1641
- if (!canParseType ())
1642
- return false ;
1643
- if (consumeIf (tok::colon)) {
1644
- if (!canParseType ())
1645
- return false ;
1646
- }
1647
- if (!consumeIf (tok::r_square))
1624
+ if (!canParseCollectionType ())
1648
1625
return false ;
1649
1626
break ;
1650
1627
case tok::kw__:
@@ -1685,14 +1662,44 @@ bool Parser::canParseType() {
1685
1662
}
1686
1663
break ;
1687
1664
}
1665
+ return true ;
1666
+ }
1667
+
1668
+ bool Parser::canParseTypeSimpleOrComposition () {
1669
+ auto canParseElement = [&]() -> bool {
1670
+ if (Tok.isContextualKeyword (" some" )) {
1671
+ consumeToken ();
1672
+ } else if (Tok.isContextualKeyword (" any" )) {
1673
+ consumeToken ();
1674
+ } else if (Tok.isContextualKeyword (" each" )) {
1675
+ consumeToken ();
1676
+ }
1677
+
1678
+ return canParseTypeSimple ();
1679
+ };
1680
+ if (!canParseElement ())
1681
+ return false ;
1688
1682
1689
1683
while (Tok.isContextualPunctuator (" &" )) {
1690
1684
consumeToken ();
1691
- // FIXME: Should be 'canParseTypeSimple ', but we don't have one .
1692
- if (!canParseType ())
1685
+ // Note we include 'some ', 'any', and 'each' here for better recovery .
1686
+ if (!canParseElement ())
1693
1687
return false ;
1694
1688
}
1695
1689
1690
+ return true ;
1691
+ }
1692
+
1693
+ bool Parser::canParseTypeScalar () {
1694
+ // Accept 'inout' at for better recovery.
1695
+ consumeIf (tok::kw_inout);
1696
+
1697
+ if (Tok.isContextualKeyword (" sending" ))
1698
+ consumeToken ();
1699
+
1700
+ if (!canParseTypeSimpleOrComposition ())
1701
+ return false ;
1702
+
1696
1703
if (isAtFunctionTypeArrow ()) {
1697
1704
// Handle type-function if we have an '->' with optional
1698
1705
// 'async' and/or 'throws'.
@@ -1707,22 +1714,43 @@ bool Parser::canParseType() {
1707
1714
1708
1715
if (!consumeIf (tok::arrow))
1709
1716
return false ;
1710
-
1711
- if (!canParseType ())
1717
+
1718
+ if (!canParseTypeScalar ())
1712
1719
return false ;
1713
-
1714
- return true ;
1715
1720
}
1721
+ return true ;
1722
+ }
1723
+
1724
+ bool Parser::canParseType () {
1725
+ // 'repeat' starts a pack expansion type.
1726
+ consumeIf (tok::kw_repeat);
1727
+
1728
+ if (!canParseTypeScalar ())
1729
+ return false ;
1716
1730
1717
1731
// Parse pack expansion 'T...'.
1718
1732
if (Tok.isEllipsis ()) {
1719
1733
Tok.setKind (tok::ellipsis);
1720
1734
consumeToken ();
1721
1735
}
1722
-
1723
1736
return true ;
1724
1737
}
1725
1738
1739
+ bool Parser::canParseCollectionType () {
1740
+ if (!consumeIf (tok::l_square))
1741
+ return false ;
1742
+
1743
+ if (!canParseType ())
1744
+ return false ;
1745
+
1746
+ if (consumeIf (tok::colon)) {
1747
+ if (!canParseType ())
1748
+ return false ;
1749
+ }
1750
+
1751
+ return consumeIf (tok::r_square);
1752
+ }
1753
+
1726
1754
bool Parser::canParseTypeIdentifier () {
1727
1755
// Parse an identifier.
1728
1756
//
0 commit comments