Skip to content

Commit fa31c75

Browse files
committed
Create shared utility Parser::canParseSimpleTypeIdentifier.
Use it in both `Parser::canParseTypeIdentifier` and `Parser::canParseBaseTypeForQualifiedDeclName`.
1 parent c736938 commit fa31c75

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

include/swift/Parse/Parser.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,14 @@ class Parser {
13771377
bool canParseAsGenericArgumentList();
13781378

13791379
bool canParseType();
1380+
1381+
/// Returns true if a simple type identifier can be parsed.
1382+
///
1383+
/// \verbatim
1384+
/// simple-type-identifier: identifier generic-argument-list?
1385+
/// \endverbatim
1386+
bool canParseSimpleTypeIdentifier();
1387+
13801388
bool canParseTypeIdentifier();
13811389
bool canParseTypeIdentifierOrTypeComposition();
13821390
bool canParseOldStyleProtocolComposition();
@@ -1386,13 +1394,11 @@ class Parser {
13861394

13871395
bool canParseTypedPattern();
13881396

1389-
/// Returns true if a base type for a qualified declaration name can be
1390-
/// parsed.
1397+
/// Returns true if a qualified declaration name base type can be parsed.
13911398
///
1392-
/// Examples:
1393-
/// 'Foo.f' -> true
1394-
/// 'Foo.Bar.f' -> true
1395-
/// 'f' -> false
1399+
/// \verbatim
1400+
/// qualified-decl-name-base-type: simple-type-identifier '.'
1401+
/// \endverbatim
13961402
bool canParseBaseTypeForQualifiedDeclName();
13971403

13981404
//===--------------------------------------------------------------------===//

lib/Parse/ParseType.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,16 +1559,24 @@ bool Parser::canParseTypeIdentifierOrTypeComposition() {
15591559
}
15601560
}
15611561

1562+
bool Parser::canParseSimpleTypeIdentifier() {
1563+
// Parse an identifier.
1564+
if (!Tok.isAny(tok::identifier, tok::kw_Self, tok::kw_Any))
1565+
return false;
1566+
consumeToken();
1567+
1568+
// Parse an optional generic argument list.
1569+
if (startsWithLess(Tok))
1570+
if (!canParseGenericArguments())
1571+
return false;
1572+
1573+
return true;
1574+
}
1575+
15621576
bool Parser::canParseTypeIdentifier() {
15631577
while (true) {
1564-
if (!Tok.isAny(tok::identifier, tok::kw_Self, tok::kw_Any))
1578+
if (!canParseSimpleTypeIdentifier())
15651579
return false;
1566-
consumeToken();
1567-
1568-
if (startsWithLess(Tok)) {
1569-
if (!canParseGenericArguments())
1570-
return false;
1571-
}
15721580

15731581
// Treat 'Foo.<anything>' as an attempt to write a dotted type
15741582
// unless <anything> is 'Type' or 'Protocol'.
@@ -1585,14 +1593,9 @@ bool Parser::canParseTypeIdentifier() {
15851593
bool Parser::canParseBaseTypeForQualifiedDeclName() {
15861594
BacktrackingScope backtrack(*this);
15871595

1588-
// First, parse a single type identifier component.
1589-
if (!Tok.isAny(tok::identifier, tok::kw_Self, tok::kw_Any))
1596+
// Parse a simple type identifier.
1597+
if (!canParseSimpleTypeIdentifier())
15901598
return false;
1591-
consumeToken();
1592-
if (startsWithLess(Tok)) {
1593-
if (!canParseGenericArguments())
1594-
return false;
1595-
}
15961599

15971600
// Qualified name base types must be followed by a period.
15981601
// If the next token starts with a period, return true.

0 commit comments

Comments
 (0)