Skip to content

Commit 0705506

Browse files
committed
[Parse] Make parseDecl() return ParserResult instead of ParserStatus
1 parent 2192ca1 commit 0705506

File tree

2 files changed

+23
-36
lines changed

2 files changed

+23
-36
lines changed

include/swift/Parse/Parser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -675,8 +675,8 @@ class Parser {
675675
return AlreadyHandledDecls.erase(D);
676676
}
677677

678-
ParserStatus parseDecl(ParseDeclOptions Flags,
679-
llvm::function_ref<void(Decl*)> Handler);
678+
ParserResult<Decl> parseDecl(ParseDeclOptions Flags,
679+
llvm::function_ref<void(Decl*)> Handler);
680680

681681
void parseDeclDelayed();
682682

lib/Parse/ParseDecl.cpp

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -855,9 +855,9 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
855855
// identifier
856856
if (!Tok.is(tok::identifier) &&
857857
!(Tok.isAnyOperator() && Tok.getText() == "*")) {
858-
if (Tok.is(tok::code_complete) && CodeCompletion) {
859-
CodeCompletion->completeDeclAttrParam(DAK_Available, 0);
860-
consumeToken(tok::code_complete);
858+
if (Tok.is(tok::code_complete) && CodeCompletion) {
859+
CodeCompletion->completeDeclAttrParam(DAK_Available, 0);
860+
consumeToken(tok::code_complete);
861861
}
862862
diagnose(Tok.getLoc(), diag::attr_availability_platform, AttrName)
863863
.highlight(SourceRange(Tok.getLoc()));
@@ -2020,10 +2020,15 @@ void Parser::delayParseFromBeginningToHere(ParserPosition BeginParserPosition,
20202020
/// decl-import
20212021
/// decl-operator
20222022
/// \endverbatim
2023-
ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
2024-
llvm::function_ref<void(Decl*)> Handler) {
2025-
if (Tok.isAny(tok::pound_sourceLocation, tok::pound_line))
2026-
return parseLineDirective(Tok.is(tok::pound_line));
2023+
ParserResult<Decl>
2024+
Parser::parseDecl(ParseDeclOptions Flags,
2025+
llvm::function_ref<void(Decl*)> Handler) {
2026+
if (Tok.isAny(tok::pound_sourceLocation, tok::pound_line)) {
2027+
auto LineDirectiveStatus = parseLineDirective(Tok.is(tok::pound_line));
2028+
if (LineDirectiveStatus.isError())
2029+
return LineDirectiveStatus;
2030+
// If success, go on. line directive never produce decls.
2031+
}
20272032

20282033
if (Tok.is(tok::pound_if)) {
20292034
auto IfConfigResult = parseDeclIfConfig(Flags);
@@ -2065,7 +2070,6 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
20652070
SourceLoc StaticLoc;
20662071
StaticSpellingKind StaticSpelling = StaticSpellingKind::None;
20672072
ParserResult<Decl> DeclResult;
2068-
ParserStatus Status;
20692073

20702074
while (1) {
20712075
// Save the original token, in case code-completion needs it.
@@ -2107,7 +2111,6 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
21072111

21082112
// Otherwise this is the start of a class declaration.
21092113
DeclResult = parseDeclClass(ClassLoc, Flags, Attributes);
2110-
Status = DeclResult;
21112114
break;
21122115
}
21132116

@@ -2230,18 +2233,15 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
22302233
// Unambiguous top level decls.
22312234
case tok::kw_import:
22322235
DeclResult = parseDeclImport(Flags, Attributes);
2233-
Status = DeclResult;
22342236
break;
22352237
case tok::kw_extension:
22362238
DeclResult = parseDeclExtension(Flags, Attributes);
2237-
Status = DeclResult;
22382239
break;
22392240
case tok::kw_let:
22402241
case tok::kw_var: {
22412242
llvm::SmallVector<Decl *, 4> Entries;
22422243
DeclResult = parseDeclVar(Flags, Attributes, Entries, StaticLoc,
22432244
StaticSpelling, tryLoc);
2244-
Status = DeclResult;
22452245
StaticLoc = SourceLoc(); // we handled static if present.
22462246
MayNeedOverrideCompletion = true;
22472247
std::for_each(Entries.begin(), Entries.end(), InternalHandler);
@@ -2251,54 +2251,43 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
22512251
}
22522252
case tok::kw_typealias:
22532253
DeclResult = parseDeclTypeAlias(Flags, Attributes);
2254-
Status = DeclResult;
22552254
MayNeedOverrideCompletion = true;
22562255
break;
22572256
case tok::kw_associatedtype:
22582257
DeclResult = parseDeclAssociatedType(Flags, Attributes);
2259-
Status = DeclResult;
22602258
break;
22612259
case tok::kw_enum:
22622260
DeclResult = parseDeclEnum(Flags, Attributes);
2263-
Status = DeclResult;
22642261
break;
22652262
case tok::kw_case: {
22662263
llvm::SmallVector<Decl *, 4> Entries;
22672264
DeclResult = parseDeclEnumCase(Flags, Attributes, Entries);
2268-
Status = DeclResult;
22692265
std::for_each(Entries.begin(), Entries.end(), InternalHandler);
22702266
if (auto *D = DeclResult.getPtrOrNull())
22712267
markWasHandled(D);
22722268
break;
22732269
}
22742270
case tok::kw_struct:
22752271
DeclResult = parseDeclStruct(Flags, Attributes);
2276-
Status = DeclResult;
22772272
break;
22782273
case tok::kw_init:
22792274
DeclResult = parseDeclInit(Flags, Attributes);
2280-
Status = DeclResult;
22812275
break;
22822276
case tok::kw_deinit:
22832277
DeclResult = parseDeclDeinit(Flags, Attributes);
2284-
Status = DeclResult;
22852278
break;
22862279
case tok::kw_operator:
22872280
DeclResult = parseDeclOperator(Flags, Attributes);
2288-
Status = DeclResult;
22892281
break;
22902282
case tok::kw_precedencegroup:
22912283
DeclResult = parseDeclPrecedenceGroup(Flags, Attributes);
2292-
Status = DeclResult;
22932284
break;
22942285
case tok::kw_protocol:
22952286
DeclResult = parseDeclProtocol(Flags, Attributes);
2296-
Status = DeclResult;
22972287
break;
22982288

22992289
case tok::kw_func:
23002290
DeclResult = parseDeclFunc(StaticLoc, StaticSpelling, Flags, Attributes);
2301-
Status = DeclResult;
23022291
StaticLoc = SourceLoc(); // we handled static if present.
23032292
MayNeedOverrideCompletion = true;
23042293
break;
@@ -2311,7 +2300,6 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
23112300
}
23122301
llvm::SmallVector<Decl *, 4> Entries;
23132302
DeclResult = parseDeclSubscript(Flags, Attributes, Entries);
2314-
Status = DeclResult;
23152303
std::for_each(Entries.begin(), Entries.end(), InternalHandler);
23162304
MayNeedOverrideCompletion = true;
23172305
if (auto *D = DeclResult.getPtrOrNull())
@@ -2321,14 +2309,14 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
23212309

23222310
case tok::code_complete:
23232311
MayNeedOverrideCompletion = true;
2324-
Status.setIsParseError();
2312+
DeclResult = makeParserError();
23252313
// Handled below.
23262314
break;
23272315
}
23282316

2329-
if (Status.isError() && MayNeedOverrideCompletion &&
2317+
if (DeclResult.isParseError() && MayNeedOverrideCompletion &&
23302318
Tok.is(tok::code_complete)) {
2331-
Status = makeParserCodeCompletionStatus();
2319+
DeclResult = makeParserCodeCompletionStatus();
23322320
if (CodeCompletion) {
23332321
// If we need to complete an override, collect the keywords already
23342322
// specified so that we do not duplicate them in code completion
@@ -2372,17 +2360,16 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
23722360
false);
23732361
} else {
23742362
delayParseFromBeginningToHere(BeginParserPosition, Flags);
2375-
return makeParserSuccess();
2363+
return makeParserError();
23762364
}
23772365
}
23782366

2379-
if (Status.hasCodeCompletion() && isCodeCompletionFirstPass() &&
2367+
if (DeclResult.hasCodeCompletion() && isCodeCompletionFirstPass() &&
23802368
!CurDeclContext->isModuleScopeContext()) {
23812369
// Only consume non-toplevel decls.
23822370
consumeDecl(BeginParserPosition, Flags, /*IsTopLevel=*/false);
23832371

2384-
// Pretend that there was no error.
2385-
return makeParserSuccess();
2372+
return makeParserError();
23862373
}
23872374

23882375
if (DeclResult.isNonNull()) {
@@ -2391,16 +2378,16 @@ ParserStatus Parser::parseDecl(ParseDeclOptions Flags,
23912378
InternalHandler(DeclResult.get());
23922379
}
23932380

2394-
if (Status.isSuccess()) {
2381+
if (!DeclResult.isParseError()) {
23952382
// If we parsed 'class' or 'static', but didn't handle it above, complain
23962383
// about it.
23972384
if (StaticLoc.isValid())
2398-
diagnose(LastDecl->getLoc(), diag::decl_not_static,
2385+
diagnose(DeclResult.get()->getLoc(), diag::decl_not_static,
23992386
StaticSpelling)
24002387
.fixItRemove(SourceRange(StaticLoc));
24012388
}
24022389

2403-
return Status;
2390+
return DeclResult;
24042391
}
24052392

24062393
void Parser::parseDeclDelayed() {

0 commit comments

Comments
 (0)