Skip to content

Commit 2035658

Browse files
authored
Merge pull request #27531 from rintaro/syntaxparse-matchingtoken
[SyntaxParse] Adjust parseMatchingToken()
2 parents 18f2b97 + 9f26b56 commit 2035658

File tree

4 files changed

+54
-79
lines changed

4 files changed

+54
-79
lines changed

include/swift/Parse/Parser.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,9 @@ class Parser {
895895
bool parseMatchingToken(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag,
896896
SourceLoc OtherLoc);
897897

898-
llvm::Optional<ParsedTokenSyntax>
899-
parseMatchingTokenSyntax(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag,
900-
SourceLoc OtherLoc);
898+
ParsedSyntaxResult<ParsedTokenSyntax>
899+
parseMatchingTokenSyntax(tok K, Diag<> ErrorDiag, SourceLoc OtherLoc,
900+
bool silenceDiag = false);
901901

902902
/// Returns the proper location for a missing right brace, parenthesis, etc.
903903
SourceLoc getLocForMissingMatchingToken() const;
@@ -919,7 +919,6 @@ class Parser {
919919
llvm::function_ref<ParserStatus()> callback);
920920
ParserStatus parseListSyntax(tok RightK, SourceLoc LeftLoc,
921921
llvm::Optional<ParsedTokenSyntax> &LastComma,
922-
SourceLoc &RightLoc,
923922
llvm::Optional<ParsedTokenSyntax> &Right,
924923
llvm::SmallVectorImpl<ParsedSyntax>& Junk,
925924
bool AllowSepAfterLast, Diag<> ErrorDiag,

lib/Parse/ParseDecl.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,13 +2002,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20022002
}
20032003

20042004
// Parse ')'.
2005-
SourceLoc RParenLoc;
20062005
auto RParen = parseMatchingTokenSyntax(
2007-
tok::r_paren, RParenLoc, diag::convention_attribute_expected_rparen,
2008-
LParenLoc);
2009-
if (!RParen)
2006+
tok::r_paren, diag::convention_attribute_expected_rparen, LParenLoc);
2007+
if (RParen.isError())
20102008
return makeParserError();
2011-
builder.useRightParen(std::move(*RParen));
2009+
builder.useRightParen(RParen.get());
20122010

20132011
return makeParserSuccess();
20142012
}();
@@ -2036,13 +2034,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20362034
builder.useArgument(consumeTokenSyntax(tok::string_literal));
20372035

20382036
// Parse ')'.
2039-
SourceLoc RParenLoc;
20402037
auto RParen = parseMatchingTokenSyntax(
2041-
tok::r_paren, RParenLoc, diag::opened_attribute_expected_rparen,
2042-
LParenLoc);
2043-
if (!RParen)
2038+
tok::r_paren, diag::opened_attribute_expected_rparen, LParenLoc);
2039+
if (RParen.isError())
20442040
return makeParserError();
2045-
builder.useRightParen(std::move(*RParen));
2041+
builder.useRightParen(RParen.get());
20462042

20472043
return makeParserSuccess();
20482044
}();
@@ -2088,12 +2084,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20882084
builder.useArgument(argBuilder.build());
20892085

20902086
// Parse ')'.
2091-
SourceLoc RParenLoc;
20922087
auto RParen = parseMatchingTokenSyntax(
2093-
tok::r_paren, RParenLoc, diag::expected_rparen_expr_list, LParenLoc);
2094-
if (!RParen)
2088+
tok::r_paren, diag::expected_rparen_expr_list, LParenLoc);
2089+
if (RParen.isError())
20952090
return makeParserError();
2096-
builder.useRightParen(std::move(*RParen));
2091+
builder.useRightParen(RParen.get());
20972092

20982093
return makeParserSuccess();
20992094
}();

lib/Parse/ParseType.cpp

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,15 @@ Parser::parseLayoutConstraintSyntax() {
130130
return false;
131131
};
132132

133-
if (parseTrivialConstraintBody()) {
133+
auto hasError = parseTrivialConstraintBody();
134+
if (hasError)
134135
ignoreUntil(tok::r_paren);
135-
if (Tok.is(tok::r_paren))
136-
builder.useRightParen(consumeTokenSyntax(tok::r_paren));
137-
} else {
138-
SourceLoc rParenLoc;
139-
auto rParen = parseMatchingTokenSyntax(tok::r_paren, rParenLoc,
140-
diag::expected_rparen_layout_constraint,
141-
lParenLoc);
142-
if (rParen)
143-
builder.useRightParen(std::move(*rParen));
144-
}
136+
auto rParen = parseMatchingTokenSyntax(
137+
tok::r_paren, diag::expected_rparen_layout_constraint, lParenLoc,
138+
/*silenceDiag=*/hasError);
139+
if (!rParen.isNull())
140+
builder.useRightParen(rParen.get());
141+
145142
return makeParsedResult(builder.build());
146143
}
147144

@@ -979,11 +976,10 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeTupleBody() {
979976

980977
Optional<ParsedTokenSyntax> Comma;
981978

982-
SourceLoc RParenLoc;
983979
Optional<ParsedTokenSyntax> RParen;
984980

985981
ParserStatus Status =
986-
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParenLoc, RParen, Junk,
982+
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParen, Junk,
987983
false, diag::expected_rparen_tuple_type_list, [&]() {
988984
Optional<BacktrackingScope> Backtracking;
989985
SmallVector<ParsedSyntax, 0> LocalJunk;
@@ -1231,11 +1227,11 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12311227
// Ignore integer literal between '[' and ']'
12321228
ignoreIf(tok::integer_literal);
12331229

1234-
SourceLoc RSquareLoc;
1230+
auto RSquareLoc = Tok.getLoc();
12351231
auto RSquare = parseMatchingTokenSyntax(
1236-
tok::r_square, RSquareLoc, diag::expected_rbracket_array_type, LSquareLoc);
1232+
tok::r_square, diag::expected_rbracket_array_type, LSquareLoc);
12371233

1238-
if (RSquare) {
1234+
if (!RSquare.isNull()) {
12391235
// If we parsed something valid, diagnose it with a fixit to rewrite it to
12401236
// Swift syntax.
12411237
diagnose(LSquareLoc, diag::new_array_syntax)
@@ -1247,11 +1243,9 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12471243
ParserStatus status;
12481244

12491245
builder.useElementType(std::move(Base));
1250-
if (RSquare) {
1251-
builder.useRightSquareBracket(std::move(*RSquare));
1252-
} else {
1253-
status.setIsParseError();
1254-
}
1246+
if (!RSquare.isNull())
1247+
builder.useRightSquareBracket(RSquare.get());
1248+
status |= RSquare.getStatus();
12551249

12561250
return makeParsedResult(builder.build(), status);
12571251
}
@@ -1289,27 +1283,24 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeCollection() {
12891283
auto Diag = Colon ? diag::expected_rbracket_dictionary_type
12901284
: diag::expected_rbracket_array_type;
12911285

1292-
SourceLoc RSquareLoc;
1293-
auto RSquare =
1294-
parseMatchingTokenSyntax(tok::r_square, RSquareLoc, Diag, LSquareLoc);
1295-
if (!RSquare)
1296-
Status.setIsParseError();
1286+
auto RSquare = parseMatchingTokenSyntax(tok::r_square, Diag, LSquareLoc);
1287+
Status |= RSquare.getStatus();
12971288

12981289
if (Colon) {
12991290
ParsedDictionaryTypeSyntaxBuilder builder(*SyntaxContext);
13001291
builder.useLeftSquareBracket(std::move(LSquare));
13011292
builder.useKeyType(std::move(*ElementType));
13021293
builder.useColon(std::move(*Colon));
13031294
builder.useValueType(std::move(*ValueType));
1304-
if (RSquare)
1305-
builder.useRightSquareBracket(std::move(*RSquare));
1295+
if (!RSquare.isNull())
1296+
builder.useRightSquareBracket(RSquare.get());
13061297
return makeParsedResult(builder.build(), Status);
13071298
} else {
13081299
ParsedArrayTypeSyntaxBuilder builder(*SyntaxContext);
13091300
builder.useLeftSquareBracket(std::move(LSquare));
13101301
builder.useElementType(std::move(*ElementType));
1311-
if (RSquare)
1312-
builder.useRightSquareBracket(std::move(*RSquare));
1302+
if (!RSquare.isNull())
1303+
builder.useRightSquareBracket(RSquare.get());
13131304
return makeParsedResult(builder.build(), Status);
13141305
}
13151306
}

lib/Parse/Parser.cpp

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,22 +1254,26 @@ Optional<ParsedTokenSyntax> Parser::parseTokenSyntax(tok K, SourceLoc &TokLoc,
12541254
return None;
12551255
}
12561256

1257-
Optional<ParsedTokenSyntax>
1258-
Parser::parseMatchingTokenSyntax(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag, SourceLoc OtherLoc) {
1259-
Diag<> OtherNote;
1260-
switch (K) {
1261-
case tok::r_paren: OtherNote = diag::opening_paren; break;
1262-
case tok::r_square: OtherNote = diag::opening_bracket; break;
1263-
case tok::r_brace: OtherNote = diag::opening_brace; break;
1264-
default: llvm_unreachable("unknown matching token!");
1265-
}
1257+
ParsedSyntaxResult<ParsedTokenSyntax>
1258+
Parser::parseMatchingTokenSyntax(tok K, Diag<> ErrorDiag, SourceLoc OtherLoc,
1259+
bool silenceDiag) {
1260+
if (Tok.is(K))
1261+
return makeParsedResult(consumeTokenSyntax(K));
1262+
checkForInputIncomplete();
12661263

1267-
auto Token = parseTokenSyntax(K, TokLoc, ErrorDiag);
1268-
if (!Token) {
1269-
TokLoc = getLocForMissingMatchingToken();
1264+
if (!silenceDiag) {
1265+
diagnose(Tok, ErrorDiag);
1266+
1267+
Diag<> OtherNote;
1268+
switch (K) {
1269+
case tok::r_paren: OtherNote = diag::opening_paren; break;
1270+
case tok::r_square: OtherNote = diag::opening_bracket; break;
1271+
case tok::r_brace: OtherNote = diag::opening_brace; break;
1272+
default: llvm_unreachable("unknown matching token!");
1273+
}
12701274
diagnose(OtherLoc, OtherNote);
12711275
}
1272-
return Token;
1276+
return makeParserError();
12731277
}
12741278

12751279
SourceLoc Parser::getLocForMissingMatchingToken() const {
@@ -1317,7 +1321,6 @@ static SyntaxKind getListElementKind(SyntaxKind ListKind) {
13171321
ParserStatus
13181322
Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13191323
Optional<ParsedTokenSyntax> &LastComma,
1320-
SourceLoc &RightLoc,
13211324
Optional<ParsedTokenSyntax> &Right,
13221325
SmallVectorImpl<ParsedSyntax>& Junk,
13231326
bool AllowSepAfterLast, Diag<> ErrorDiag,
@@ -1327,13 +1330,11 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13271330
};
13281331

13291332
if (Tok.is(RightK)) {
1330-
RightLoc = Tok.getLoc();
13311333
Right = consumeTokenSyntax(RightK);
13321334
return makeParserSuccess();
13331335
}
13341336
if (TokIsStringInterpolationEOF()) {
13351337
Tok.setKind(RightK);
1336-
RightLoc = Tok.getLoc();
13371338
Right = consumeTokenSyntax();
13381339
return makeParserSuccess();
13391340
}
@@ -1356,7 +1357,6 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13561357
// Just accept the ")" and build the tuple as we usually do.
13571358
if (TokIsStringInterpolationEOF()) {
13581359
Tok.setKind(RightK);
1359-
RightLoc = Tok.getLoc();
13601360
Right = consumeTokenSyntax();
13611361
return Status;
13621362
}
@@ -1393,20 +1393,10 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13931393
Status.setIsParseError();
13941394
}
13951395

1396-
if (Status.isError()) {
1397-
// If we've already got errors, don't emit missing RightK diagnostics.
1398-
if (Tok.is(RightK)) {
1399-
RightLoc = Tok.getLoc();
1400-
Right = consumeTokenSyntax(RightK);
1401-
} else {
1402-
RightLoc = getLocForMissingMatchingToken();
1403-
}
1404-
} else {
1405-
Right = parseMatchingTokenSyntax(RightK, RightLoc, ErrorDiag, LeftLoc);
1406-
if (!Right)
1407-
Status.setIsParseError();
1408-
}
1409-
1396+
auto RightResult = parseMatchingTokenSyntax(RightK, ErrorDiag, LeftLoc,
1397+
Status.isError());
1398+
Status |= RightResult.getStatus();
1399+
Right = RightResult.getOrNull();
14101400
return Status;
14111401
}
14121402

0 commit comments

Comments
 (0)