Skip to content

Commit 079a1a4

Browse files
authored
Merge pull request #27290 from rintaro/parse-identifierdeclname-simple
[Parse] Simplify parseIdentifierDeclName()
2 parents d6a5c6f + a42bdf4 commit 079a1a4

File tree

1 file changed

+34
-64
lines changed

1 file changed

+34
-64
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -3518,16 +3518,10 @@ ParserStatus Parser::parseInheritance(SmallVectorImpl<TypeLoc> &Inherited,
35183518
return Status;
35193519
}
35203520

3521-
enum class TokenProperty {
3522-
None,
3523-
StartsWithLess,
3524-
};
3525-
35263521
static ParserStatus
35273522
parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &Loc,
3528-
StringRef DeclKindName, tok ResyncT1, tok ResyncT2,
3529-
tok ResyncT3, tok ResyncT4,
3530-
TokenProperty ResyncP1) {
3523+
StringRef DeclKindName,
3524+
llvm::function_ref<bool(const Token &)> canRecover) {
35313525
if (P.Tok.is(tok::identifier)) {
35323526
Loc = P.consumeIdentifier(&Result);
35333527

@@ -3566,9 +3560,7 @@ parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &Loc,
35663560
.fixItReplace(P.Tok.getLoc(), "`" + P.Tok.getText().str() + "`");
35673561

35683562
// Recover if the next token is one of the expected tokens.
3569-
auto Next = P.peekToken();
3570-
if (Next.isAny(ResyncT1, ResyncT2, ResyncT3, ResyncT4) ||
3571-
(ResyncP1 != TokenProperty::None && P.startsWithLess(Next))) {
3563+
if (canRecover(P.peekToken())) {
35723564
llvm::SmallString<32> Name(P.Tok.getText());
35733565
// Append an invalid character so that nothing can resolve to this name.
35743566
Name += "#";
@@ -3585,38 +3577,6 @@ parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &Loc,
35853577
return makeParserError();
35863578
}
35873579

3588-
static ParserStatus
3589-
parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &L,
3590-
StringRef DeclKindName, tok ResyncT1, tok ResyncT2) {
3591-
return parseIdentifierDeclName(P, Result, L, DeclKindName, ResyncT1, ResyncT2,
3592-
tok::NUM_TOKENS, tok::NUM_TOKENS,
3593-
TokenProperty::None);
3594-
}
3595-
3596-
static ParserStatus
3597-
parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &L,
3598-
StringRef DeclKindName, tok ResyncT1, tok ResyncT2,
3599-
tok ResyncT3, tok ResyncT4) {
3600-
return parseIdentifierDeclName(P, Result, L, DeclKindName, ResyncT1, ResyncT2,
3601-
ResyncT3, ResyncT4, TokenProperty::None);
3602-
}
3603-
3604-
static ParserStatus
3605-
parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &L,
3606-
StringRef DeclKindName, tok ResyncT1, tok ResyncT2,
3607-
TokenProperty ResyncP1) {
3608-
return parseIdentifierDeclName(P, Result, L, DeclKindName, ResyncT1, ResyncT2,
3609-
tok::NUM_TOKENS, tok::NUM_TOKENS, ResyncP1);
3610-
}
3611-
3612-
static ParserStatus
3613-
parseIdentifierDeclName(Parser &P, Identifier &Result, SourceLoc &L,
3614-
StringRef DeclKindName, tok ResyncT1, tok ResyncT2,
3615-
tok ResyncT3, TokenProperty ResyncP1) {
3616-
return parseIdentifierDeclName(P, Result, L, DeclKindName, ResyncT1, ResyncT2,
3617-
ResyncT3, tok::NUM_TOKENS, ResyncP1);
3618-
}
3619-
36203580
/// Add a fix-it to remove the space in consecutive identifiers.
36213581
/// Add a camel-cased option if it is different than the first option.
36223582
void Parser::diagnoseConsecutiveIDs(StringRef First, SourceLoc FirstLoc,
@@ -4135,8 +4095,9 @@ parseDeclTypeAlias(Parser::ParseDeclOptions Flags, DeclAttributes &Attributes) {
41354095
SourceLoc IdLoc;
41364096
ParserStatus Status;
41374097

4138-
Status |= parseIdentifierDeclName(*this, Id, IdLoc, "typealias",
4139-
tok::colon, tok::equal);
4098+
Status |= parseIdentifierDeclName(
4099+
*this, Id, IdLoc, "typealias",
4100+
[](const Token &next) { return next.isAny(tok::colon, tok::equal); });
41404101
if (Status.isError()) {
41414102
TmpCtxt->setTransparent();
41424103
return nullptr;
@@ -4250,9 +4211,10 @@ ParserResult<TypeDecl> Parser::parseDeclAssociatedType(Parser::ParseDeclOptions
42504211
} else {
42514212
AssociatedTypeLoc = consumeToken(tok::kw_associatedtype);
42524213
}
4253-
4254-
Status = parseIdentifierDeclName(*this, Id, IdLoc, "associatedtype",
4255-
tok::colon, tok::equal);
4214+
4215+
Status = parseIdentifierDeclName(
4216+
*this, Id, IdLoc, "associatedtype",
4217+
[](const Token &next) { return next.isAny(tok::colon, tok::equal); });
42564218
if (Status.isError())
42574219
return nullptr;
42584220

@@ -5473,8 +5435,10 @@ ParserResult<FuncDecl> Parser::parseDeclFunc(SourceLoc StaticLoc,
54735435
// because we're aggressive about recovering/providing good diagnostics for
54745436
// beginners.
54755437
auto NameStatus = parseIdentifierDeclName(
5476-
*this, SimpleName, NameLoc, "function", tok::l_paren, tok::arrow,
5477-
tok::l_brace, TokenProperty::StartsWithLess);
5438+
*this, SimpleName, NameLoc, "function", [&](const Token &next) {
5439+
return next.isAny(tok::l_paren, tok::arrow, tok::l_brace) ||
5440+
startsWithLess(next);
5441+
});
54785442
if (NameStatus.isError())
54795443
return nullptr;
54805444
}
@@ -5717,9 +5681,10 @@ ParserResult<EnumDecl> Parser::parseDeclEnum(ParseDeclOptions Flags,
57175681
SourceLoc EnumNameLoc;
57185682
ParserStatus Status;
57195683

5720-
Status |= parseIdentifierDeclName(*this, EnumName, EnumNameLoc, "enum",
5721-
tok::colon, tok::l_brace,
5722-
TokenProperty::StartsWithLess);
5684+
Status |= parseIdentifierDeclName(
5685+
*this, EnumName, EnumNameLoc, "enum", [&](const Token &next) {
5686+
return next.isAny(tok::colon, tok::l_brace) || startsWithLess(next);
5687+
});
57235688
if (Status.isError())
57245689
return nullptr;
57255690

@@ -5823,9 +5788,11 @@ Parser::parseDeclEnumCase(ParseDeclOptions Flags,
58235788
}
58245789

58255790
if (Tok.is(tok::identifier)) {
5826-
Status |= parseIdentifierDeclName(*this, Name, NameLoc, "enum 'case'",
5827-
tok::l_paren, tok::kw_case, tok::colon,
5828-
tok::r_brace);
5791+
Status |= parseIdentifierDeclName(
5792+
*this, Name, NameLoc, "enum 'case'", [](const Token &next) {
5793+
return next.isAny(tok::l_paren, tok::kw_case, tok::colon,
5794+
tok::r_brace);
5795+
});
58295796
assert(Status.isSuccess());
58305797
if (DotLoc.isValid())
58315798
diagnose(DotLoc, diag::enum_case_dot_prefix)
@@ -5997,9 +5964,10 @@ ParserResult<StructDecl> Parser::parseDeclStruct(ParseDeclOptions Flags,
59975964
SourceLoc StructNameLoc;
59985965
ParserStatus Status;
59995966

6000-
Status |= parseIdentifierDeclName(*this, StructName, StructNameLoc, "struct",
6001-
tok::colon, tok::l_brace,
6002-
TokenProperty::StartsWithLess);
5967+
Status |= parseIdentifierDeclName(
5968+
*this, StructName, StructNameLoc, "struct", [&](const Token &next) {
5969+
return next.isAny(tok::colon, tok::l_brace) || startsWithLess(next);
5970+
});
60035971
if (Status.isError())
60045972
return nullptr;
60055973

@@ -6088,9 +6056,10 @@ ParserResult<ClassDecl> Parser::parseDeclClass(ParseDeclOptions Flags,
60886056
SourceLoc ClassNameLoc;
60896057
ParserStatus Status;
60906058

6091-
Status |= parseIdentifierDeclName(*this, ClassName, ClassNameLoc, "class",
6092-
tok::colon, tok::l_brace,
6093-
TokenProperty::StartsWithLess);
6059+
Status |= parseIdentifierDeclName(
6060+
*this, ClassName, ClassNameLoc, "class", [&](const Token &next) {
6061+
return next.isAny(tok::colon, tok::l_brace) || startsWithLess(next);
6062+
});
60946063
if (Status.isError())
60956064
return nullptr;
60966065

@@ -6207,8 +6176,9 @@ parseDeclProtocol(ParseDeclOptions Flags, DeclAttributes &Attributes) {
62076176
Identifier ProtocolName;
62086177
ParserStatus Status;
62096178

6210-
Status |= parseIdentifierDeclName(*this, ProtocolName, NameLoc, "protocol",
6211-
tok::colon, tok::l_brace);
6179+
Status |= parseIdentifierDeclName(
6180+
*this, ProtocolName, NameLoc, "protocol",
6181+
[&](const Token &next) { return next.isAny(tok::colon, tok::l_brace); });
62126182
if (Status.isError())
62136183
return nullptr;
62146184

0 commit comments

Comments
 (0)