Skip to content

Commit 5a01ca6

Browse files
committed
[Parse] Split up canParseType
While here, address the FIXME in `canParseTypeSimpleOrComposition` and only check to see if we can parse a type-simple, including `each`, `some`, and `any` for better recovery.
1 parent cdaa354 commit 5a01ca6

File tree

2 files changed

+65
-32
lines changed

2 files changed

+65
-32
lines changed

include/swift/Parse/Parser.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,8 +1691,13 @@ class Parser {
16911691
/// and the expression will parse with the '<' as an operator.
16921692
bool canParseAsGenericArgumentList();
16931693

1694+
bool canParseTypeSimple();
1695+
bool canParseTypeSimpleOrComposition();
1696+
bool canParseTypeScalar();
16941697
bool canParseType();
16951698

1699+
bool canParseCollectionType();
1700+
16961701
/// Returns true if a simple type identifier can be parsed.
16971702
///
16981703
/// \verbatim

lib/Parse/ParseType.cpp

Lines changed: 60 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,23 +1575,7 @@ bool Parser::canParseGenericArguments() {
15751575
}
15761576
}
15771577

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() {
15951579
switch (Tok.getKind()) {
15961580
case tok::kw_Self:
15971581
case tok::kw_Any:
@@ -1637,14 +1621,7 @@ bool Parser::canParseType() {
16371621
return canParseType();
16381622
}
16391623
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())
16481625
return false;
16491626
break;
16501627
case tok::kw__:
@@ -1685,14 +1662,44 @@ bool Parser::canParseType() {
16851662
}
16861663
break;
16871664
}
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;
16881682

16891683
while (Tok.isContextualPunctuator("&")) {
16901684
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())
16931687
return false;
16941688
}
16951689

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+
16961703
if (isAtFunctionTypeArrow()) {
16971704
// Handle type-function if we have an '->' with optional
16981705
// 'async' and/or 'throws'.
@@ -1707,22 +1714,43 @@ bool Parser::canParseType() {
17071714

17081715
if (!consumeIf(tok::arrow))
17091716
return false;
1710-
1711-
if (!canParseType())
1717+
1718+
if (!canParseTypeScalar())
17121719
return false;
1713-
1714-
return true;
17151720
}
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;
17161730

17171731
// Parse pack expansion 'T...'.
17181732
if (Tok.isEllipsis()) {
17191733
Tok.setKind(tok::ellipsis);
17201734
consumeToken();
17211735
}
1722-
17231736
return true;
17241737
}
17251738

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+
17261754
bool Parser::canParseTypeIdentifier() {
17271755
// Parse an identifier.
17281756
//

0 commit comments

Comments
 (0)