Skip to content

Commit c022ff2

Browse files
committed
[SyntaxParse] Adjust parseMatchingToken()
1 parent a2e0d08 commit c022ff2

File tree

4 files changed

+61
-54
lines changed

4 files changed

+61
-54
lines changed

include/swift/Parse/Parser.h

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

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

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: 20 additions & 28 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

@@ -1231,11 +1228,11 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12311228
// Ignore integer literal between '[' and ']'
12321229
ignoreIf(tok::integer_literal);
12331230

1234-
SourceLoc RSquareLoc;
1231+
auto RSquareLoc = Tok.getLoc();
12351232
auto RSquare = parseMatchingTokenSyntax(
1236-
tok::r_square, RSquareLoc, diag::expected_rbracket_array_type, LSquareLoc);
1233+
tok::r_square, diag::expected_rbracket_array_type, LSquareLoc);
12371234

1238-
if (RSquare) {
1235+
if (!RSquare.isNull()) {
12391236
// If we parsed something valid, diagnose it with a fixit to rewrite it to
12401237
// Swift syntax.
12411238
diagnose(LSquareLoc, diag::new_array_syntax)
@@ -1247,11 +1244,9 @@ Parser::parseTypeArray(ParsedTypeSyntax Base, SourceLoc BaseLoc) {
12471244
ParserStatus status;
12481245

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

12561251
return makeParsedResult(builder.build(), status);
12571252
}
@@ -1289,27 +1284,24 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeCollection() {
12891284
auto Diag = Colon ? diag::expected_rbracket_dictionary_type
12901285
: diag::expected_rbracket_array_type;
12911286

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

12981290
if (Colon) {
12991291
ParsedDictionaryTypeSyntaxBuilder builder(*SyntaxContext);
13001292
builder.useLeftSquareBracket(std::move(LSquare));
13011293
builder.useKeyType(std::move(*ElementType));
13021294
builder.useColon(std::move(*Colon));
13031295
builder.useValueType(std::move(*ValueType));
1304-
if (RSquare)
1305-
builder.useRightSquareBracket(std::move(*RSquare));
1296+
if (!RSquare.isNull())
1297+
builder.useRightSquareBracket(RSquare.get());
13061298
return makeParsedResult(builder.build(), Status);
13071299
} else {
13081300
ParsedArrayTypeSyntaxBuilder builder(*SyntaxContext);
13091301
builder.useLeftSquareBracket(std::move(LSquare));
13101302
builder.useElementType(std::move(*ElementType));
1311-
if (RSquare)
1312-
builder.useRightSquareBracket(std::move(*RSquare));
1303+
if (!RSquare.isNull())
1304+
builder.useRightSquareBracket(RSquare.get());
13131305
return makeParsedResult(builder.build(), Status);
13141306
}
13151307
}

lib/Parse/Parser.cpp

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,22 +1254,38 @@ 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!");
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();
1263+
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+
}
1274+
diagnose(OtherLoc, OtherNote);
12651275
}
1276+
return makeParserError();
1277+
}
12661278

1267-
auto Token = parseTokenSyntax(K, TokLoc, ErrorDiag);
1268-
if (!Token) {
1279+
Optional<ParsedTokenSyntax>
1280+
Parser::parseMatchingTokenSyntax(tok K, SourceLoc &TokLoc, Diag<> ErrorDiag,
1281+
SourceLoc OtherLoc) {
1282+
TokLoc = Tok.getLoc();
1283+
auto result = parseMatchingTokenSyntax(K, ErrorDiag, OtherLoc);
1284+
if (result.isNull()) {
12691285
TokLoc = getLocForMissingMatchingToken();
1270-
diagnose(OtherLoc, OtherNote);
1286+
return None;
12711287
}
1272-
return Token;
1288+
return result.get();
12731289
}
12741290

12751291
SourceLoc Parser::getLocForMissingMatchingToken() const {

0 commit comments

Comments
 (0)