Skip to content

Commit ec8538c

Browse files
committed
Revert "Revert "Merge pull request swiftlang#27531 from rintaro/syntaxparse-matchingtoken""
This reverts commit cd1a299.
1 parent 3e10e62 commit ec8538c

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
@@ -1999,13 +1999,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
19991999
}
20002000

20012001
// Parse ')'.
2002-
SourceLoc RParenLoc;
20032002
auto RParen = parseMatchingTokenSyntax(
2004-
tok::r_paren, RParenLoc, diag::convention_attribute_expected_rparen,
2005-
LParenLoc);
2006-
if (!RParen)
2003+
tok::r_paren, diag::convention_attribute_expected_rparen, LParenLoc);
2004+
if (RParen.isError())
20072005
return makeParserError();
2008-
builder.useRightParen(std::move(*RParen));
2006+
builder.useRightParen(RParen.get());
20092007

20102008
return makeParserSuccess();
20112009
}();
@@ -2033,13 +2031,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20332031
builder.useArgument(consumeTokenSyntax(tok::string_literal));
20342032

20352033
// Parse ')'.
2036-
SourceLoc RParenLoc;
20372034
auto RParen = parseMatchingTokenSyntax(
2038-
tok::r_paren, RParenLoc, diag::opened_attribute_expected_rparen,
2039-
LParenLoc);
2040-
if (!RParen)
2035+
tok::r_paren, diag::opened_attribute_expected_rparen, LParenLoc);
2036+
if (RParen.isError())
20412037
return makeParserError();
2042-
builder.useRightParen(std::move(*RParen));
2038+
builder.useRightParen(RParen.get());
20432039

20442040
return makeParserSuccess();
20452041
}();
@@ -2085,12 +2081,11 @@ ParsedSyntaxResult<ParsedAttributeSyntax> Parser::parseTypeAttributeSyntax() {
20852081
builder.useArgument(argBuilder.build());
20862082

20872083
// Parse ')'.
2088-
SourceLoc RParenLoc;
20892084
auto RParen = parseMatchingTokenSyntax(
2090-
tok::r_paren, RParenLoc, diag::expected_rparen_expr_list, LParenLoc);
2091-
if (!RParen)
2085+
tok::r_paren, diag::expected_rparen_expr_list, LParenLoc);
2086+
if (RParen.isError())
20922087
return makeParserError();
2093-
builder.useRightParen(std::move(*RParen));
2088+
builder.useRightParen(RParen.get());
20942089

20952090
return makeParserSuccess();
20962091
}();

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

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

977974
Optional<ParsedTokenSyntax> Comma;
978975

979-
SourceLoc RParenLoc;
980976
Optional<ParsedTokenSyntax> RParen;
981977

982978
ParserStatus Status =
983-
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParenLoc, RParen, Junk,
979+
parseListSyntax(tok::r_paren, LParenLoc, Comma, RParen, Junk,
984980
false, diag::expected_rparen_tuple_type_list, [&]() {
985981
Optional<BacktrackingScope> Backtracking;
986982
SmallVector<ParsedSyntax, 0> LocalJunk;
@@ -1228,11 +1224,11 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12281224
// Ignore integer literal between '[' and ']'
12291225
ignoreIf(tok::integer_literal);
12301226

1231-
SourceLoc RSquareLoc;
1227+
auto RSquareLoc = Tok.getLoc();
12321228
auto RSquare = parseMatchingTokenSyntax(
1233-
tok::r_square, RSquareLoc, diag::expected_rbracket_array_type, LSquareLoc);
1229+
tok::r_square, diag::expected_rbracket_array_type, LSquareLoc);
12341230

1235-
if (RSquare) {
1231+
if (!RSquare.isNull()) {
12361232
// If we parsed something valid, diagnose it with a fixit to rewrite it to
12371233
// Swift syntax.
12381234
diagnose(LSquareLoc, diag::new_array_syntax)
@@ -1244,11 +1240,9 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12441240
ParserStatus status;
12451241

12461242
builder.useElementType(std::move(Base));
1247-
if (RSquare) {
1248-
builder.useRightSquareBracket(std::move(*RSquare));
1249-
} else {
1250-
status.setIsParseError();
1251-
}
1243+
if (!RSquare.isNull())
1244+
builder.useRightSquareBracket(RSquare.get());
1245+
status |= RSquare.getStatus();
12521246

12531247
return makeParsedResult(builder.build(), status);
12541248
}
@@ -1286,27 +1280,24 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeCollection() {
12861280
auto Diag = Colon ? diag::expected_rbracket_dictionary_type
12871281
: diag::expected_rbracket_array_type;
12881282

1289-
SourceLoc RSquareLoc;
1290-
auto RSquare =
1291-
parseMatchingTokenSyntax(tok::r_square, RSquareLoc, Diag, LSquareLoc);
1292-
if (!RSquare)
1293-
Status.setIsParseError();
1283+
auto RSquare = parseMatchingTokenSyntax(tok::r_square, Diag, LSquareLoc);
1284+
Status |= RSquare.getStatus();
12941285

12951286
if (Colon) {
12961287
ParsedDictionaryTypeSyntaxBuilder builder(*SyntaxContext);
12971288
builder.useLeftSquareBracket(std::move(LSquare));
12981289
builder.useKeyType(std::move(*ElementType));
12991290
builder.useColon(std::move(*Colon));
13001291
builder.useValueType(std::move(*ValueType));
1301-
if (RSquare)
1302-
builder.useRightSquareBracket(std::move(*RSquare));
1292+
if (!RSquare.isNull())
1293+
builder.useRightSquareBracket(RSquare.get());
13031294
return makeParsedResult(builder.build(), Status);
13041295
} else {
13051296
ParsedArrayTypeSyntaxBuilder builder(*SyntaxContext);
13061297
builder.useLeftSquareBracket(std::move(LSquare));
13071298
builder.useElementType(std::move(*ElementType));
1308-
if (RSquare)
1309-
builder.useRightSquareBracket(std::move(*RSquare));
1299+
if (!RSquare.isNull())
1300+
builder.useRightSquareBracket(RSquare.get());
13101301
return makeParsedResult(builder.build(), Status);
13111302
}
13121303
}

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 {
@@ -1315,7 +1319,6 @@ static SyntaxKind getListElementKind(SyntaxKind ListKind) {
13151319
ParserStatus
13161320
Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13171321
Optional<ParsedTokenSyntax> &LastComma,
1318-
SourceLoc &RightLoc,
13191322
Optional<ParsedTokenSyntax> &Right,
13201323
SmallVectorImpl<ParsedSyntax>& Junk,
13211324
bool AllowSepAfterLast, Diag<> ErrorDiag,
@@ -1325,13 +1328,11 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13251328
};
13261329

13271330
if (Tok.is(RightK)) {
1328-
RightLoc = Tok.getLoc();
13291331
Right = consumeTokenSyntax(RightK);
13301332
return makeParserSuccess();
13311333
}
13321334
if (TokIsStringInterpolationEOF()) {
13331335
Tok.setKind(RightK);
1334-
RightLoc = Tok.getLoc();
13351336
Right = consumeTokenSyntax();
13361337
return makeParserSuccess();
13371338
}
@@ -1354,7 +1355,6 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13541355
// Just accept the ")" and build the tuple as we usually do.
13551356
if (TokIsStringInterpolationEOF()) {
13561357
Tok.setKind(RightK);
1357-
RightLoc = Tok.getLoc();
13581358
Right = consumeTokenSyntax();
13591359
return Status;
13601360
}
@@ -1391,20 +1391,10 @@ Parser::parseListSyntax(tok RightK, SourceLoc LeftLoc,
13911391
Status.setIsParseError();
13921392
}
13931393

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

0 commit comments

Comments
 (0)