Skip to content

Commit 5862d34

Browse files
committed
[Parse] Remove 'ParseDeclOptions' parameter from 'parseDecl' function
'ParseDeclOptions' can be trivially calculated solely from the current decl context. To reduce the number of the contextual parameters, calculate it inside the function.
1 parent b7d8a9b commit 5862d34

File tree

4 files changed

+58
-70
lines changed

4 files changed

+58
-70
lines changed

include/swift/Parse/Parser.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -956,10 +956,9 @@ class Parser {
956956
void consumeDecl(ParserPosition BeginParserPosition, ParseDeclOptions Flags,
957957
bool IsTopLevel);
958958

959-
ParserResult<Decl> parseDecl(ParseDeclOptions Flags,
960-
bool IsAtStartOfLineOrPreviousHadSemi,
959+
ParserResult<Decl> parseDecl(bool IsAtStartOfLineOrPreviousHadSemi,
961960
bool IfConfigsAreDeclAttrs,
962-
llvm::function_ref<void(Decl*)> Handler);
961+
llvm::function_ref<void(Decl *)> Handler);
963962

964963
std::pair<std::vector<Decl *>, llvm::Optional<Fingerprint>>
965964
parseDeclListDelayed(IterableDeclContext *IDC);
@@ -1235,11 +1234,9 @@ class Parser {
12351234
bool allowAnyObject,
12361235
SourceLoc *parseTildeCopyable = nullptr);
12371236
ParserStatus parseDeclItem(bool &PreviousHadSemi,
1238-
ParseDeclOptions Options,
1239-
llvm::function_ref<void(Decl*)> handler);
1237+
llvm::function_ref<void(Decl *)> handler);
12401238
std::pair<std::vector<Decl *>, llvm::Optional<Fingerprint>>
12411239
parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc, Diag<> ErrorDiag,
1242-
ParseDeclOptions Options, IterableDeclContext *IDC,
12431240
bool &hadError);
12441241
ParserResult<ExtensionDecl> parseDeclExtension(ParseDeclOptions Flags,
12451242
DeclAttributes &Attributes);

lib/Parse/ParseDecl.cpp

Lines changed: 50 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5743,6 +5743,41 @@ setOriginalDeclarationForDifferentiableAttributes(DeclAttributes attrs,
57435743
const_cast<DerivativeAttr *>(attr)->setOriginalDeclaration(D);
57445744
}
57455745

5746+
/// Determine the declaration parsing options to use when parsing the decl in
5747+
/// the given context.
5748+
static Parser::ParseDeclOptions getParseDeclOptions(DeclContext *DC) {
5749+
using ParseDeclOptions = Parser::ParseDeclOptions;
5750+
5751+
if (DC->isModuleScopeContext())
5752+
return Parser::PD_AllowTopLevel;
5753+
5754+
if (DC->isLocalContext())
5755+
return Parser::PD_Default;
5756+
5757+
auto decl = DC->getAsDecl();
5758+
switch (decl->getKind()) {
5759+
case DeclKind::Extension:
5760+
return ParseDeclOptions(Parser::PD_HasContainerType |
5761+
Parser::PD_InExtension);
5762+
case DeclKind::Enum:
5763+
return ParseDeclOptions(Parser::PD_HasContainerType |
5764+
Parser::PD_AllowEnumElement | Parser::PD_InEnum);
5765+
5766+
case DeclKind::Protocol:
5767+
return ParseDeclOptions(Parser::PD_HasContainerType |
5768+
Parser::PD_DisallowInit | Parser::PD_InProtocol);
5769+
5770+
case DeclKind::Class:
5771+
return ParseDeclOptions(Parser::PD_HasContainerType | Parser::PD_InClass);
5772+
5773+
case DeclKind::Struct:
5774+
return ParseDeclOptions(Parser::PD_HasContainerType | Parser::PD_InStruct);
5775+
5776+
default:
5777+
llvm_unreachable("Bad iterable decl context kinds.");
5778+
}
5779+
}
5780+
57465781
/// Parse a single syntactic declaration and return a list of decl
57475782
/// ASTs. This can return multiple results for var decls that bind to multiple
57485783
/// values, structs that define a struct decl and a constructor, etc.
@@ -5760,11 +5795,10 @@ setOriginalDeclarationForDifferentiableAttributes(DeclAttributes attrs,
57605795
/// decl-import
57615796
/// decl-operator
57625797
/// \endverbatim
5763-
ParserResult<Decl>
5764-
Parser::parseDecl(ParseDeclOptions Flags,
5765-
bool IsAtStartOfLineOrPreviousHadSemi,
5766-
bool IfConfigsAreDeclAttrs,
5767-
llvm::function_ref<void(Decl*)> Handler) {
5798+
ParserResult<Decl> Parser::parseDecl(bool IsAtStartOfLineOrPreviousHadSemi,
5799+
bool IfConfigsAreDeclAttrs,
5800+
llvm::function_ref<void(Decl *)> Handler) {
5801+
ParseDeclOptions Flags = getParseDeclOptions(CurDeclContext);
57685802
ParserPosition BeginParserPosition;
57695803
if (isIDEInspectionFirstPass())
57705804
BeginParserPosition = getParserPosition();
@@ -5784,8 +5818,8 @@ Parser::parseDecl(ParseDeclOptions Flags,
57845818
skipUntilConditionalBlockClose();
57855819
break;
57865820
}
5787-
Status |= parseDeclItem(PreviousHadSemi, Flags,
5788-
[&](Decl *D) {Decls.emplace_back(D);});
5821+
Status |= parseDeclItem(PreviousHadSemi,
5822+
[&](Decl *D) { Decls.emplace_back(D); });
57895823
}
57905824
});
57915825
if (IfConfigResult.hasCodeCompletion() && isIDEInspectionFirstPass()) {
@@ -6165,38 +6199,6 @@ Parser::parseDecl(ParseDeclOptions Flags,
61656199
return DeclResult;
61666200
}
61676201

6168-
/// Determine the declaration parsing options to use when parsing the members
6169-
/// of the given context.
6170-
static Parser::ParseDeclOptions getMemberParseDeclOptions(
6171-
IterableDeclContext *idc) {
6172-
using ParseDeclOptions = Parser::ParseDeclOptions;
6173-
6174-
auto decl = idc->getDecl();
6175-
switch (decl->getKind()) {
6176-
case DeclKind::Extension:
6177-
return ParseDeclOptions(
6178-
Parser::PD_HasContainerType | Parser::PD_InExtension);
6179-
case DeclKind::Enum:
6180-
return ParseDeclOptions(
6181-
Parser::PD_HasContainerType | Parser::PD_AllowEnumElement |
6182-
Parser::PD_InEnum);
6183-
6184-
case DeclKind::Protocol:
6185-
return ParseDeclOptions(
6186-
Parser::PD_HasContainerType | Parser::PD_DisallowInit |
6187-
Parser::PD_InProtocol);
6188-
6189-
case DeclKind::Class:
6190-
return ParseDeclOptions(Parser::PD_HasContainerType | Parser::PD_InClass);
6191-
6192-
case DeclKind::Struct:
6193-
return ParseDeclOptions(Parser::PD_HasContainerType | Parser::PD_InStruct);
6194-
6195-
default:
6196-
llvm_unreachable("Bad iterable decl context kinds.");
6197-
}
6198-
}
6199-
62006202
std::pair<std::vector<Decl *>, llvm::Optional<Fingerprint>>
62016203
Parser::parseDeclListDelayed(IterableDeclContext *IDC) {
62026204
Decl *D = const_cast<Decl*>(IDC->getDecl());
@@ -6256,8 +6258,7 @@ Parser::parseDeclListDelayed(IterableDeclContext *IDC) {
62566258
llvm_unreachable("Bad iterable decl context kinds.");
62576259
}
62586260
bool hadError = false;
6259-
ParseDeclOptions Options = getMemberParseDeclOptions(IDC);
6260-
return parseDeclList(LBLoc, RBLoc, Id, Options, IDC, hadError);
6261+
return parseDeclList(LBLoc, RBLoc, Id, hadError);
62616262
}
62626263

62636264
/// Parse an 'import' declaration, doing no token skipping on error.
@@ -6654,8 +6655,7 @@ void Parser::diagnoseConsecutiveIDs(StringRef First, SourceLoc FirstLoc,
66546655

66556656
/// Parse a Decl item in decl list.
66566657
ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
6657-
ParseDeclOptions Options,
6658-
llvm::function_ref<void(Decl*)> handler) {
6658+
llvm::function_ref<void(Decl *)> handler) {
66596659
if (Tok.is(tok::semi)) {
66606660
// Consume ';' without preceding decl.
66616661
diagnose(Tok, diag::unexpected_separator, ";")
@@ -6682,9 +6682,9 @@ ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
66826682
return LineDirectiveStatus;
66836683
}
66846684

6685-
ParserResult<Decl> Result = parseDecl(
6686-
Options, IsAtStartOfLineOrPreviousHadSemi,
6687-
/* IfConfigsAreDeclAttrs=*/false, handler);
6685+
ParserResult<Decl> Result =
6686+
parseDecl(IsAtStartOfLineOrPreviousHadSemi,
6687+
/* IfConfigsAreDeclAttrs=*/false, handler);
66886688
if (Result.isParseErrorOrHasCompletion())
66896689
skipUntilDeclRBrace(tok::semi, tok::pound_endif);
66906690
SourceLoc SemiLoc;
@@ -6727,9 +6727,7 @@ bool Parser::parseMemberDeclList(SourceLoc &LBLoc, SourceLoc &RBLoc,
67276727
// When forced to eagerly parse, do so and cache the results in the
67286728
// evaluator.
67296729
bool hadError = false;
6730-
ParseDeclOptions Options = getMemberParseDeclOptions(IDC);
6731-
auto membersAndHash =
6732-
parseDeclList(LBLoc, RBLoc, RBraceDiag, Options, IDC, hadError);
6730+
auto membersAndHash = parseDeclList(LBLoc, RBLoc, RBraceDiag, hadError);
67336731
IDC->setMaybeHasOperatorDeclarations();
67346732
IDC->setMaybeHasNestedClassDeclarations();
67356733
Context.evaluator.cacheOutput(
@@ -6752,7 +6750,6 @@ bool Parser::parseMemberDeclList(SourceLoc &LBLoc, SourceLoc &RBLoc,
67526750
/// \endverbatim
67536751
std::pair<std::vector<Decl *>, llvm::Optional<Fingerprint>>
67546752
Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc, Diag<> ErrorDiag,
6755-
ParseDeclOptions Options, IterableDeclContext *IDC,
67566753
bool &hadError) {
67576754

67586755
// Hash the type body separately.
@@ -6767,8 +6764,8 @@ Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc, Diag<> ErrorDiag,
67676764
bool PreviousHadSemi = true;
67686765
{
67696766
while (Tok.isNot(tok::r_brace)) {
6770-
Status |= parseDeclItem(PreviousHadSemi, Options,
6771-
[&](Decl *D) { decls.push_back(D); });
6767+
Status |=
6768+
parseDeclItem(PreviousHadSemi, [&](Decl *D) { decls.push_back(D); });
67726769
if (Tok.isAny(tok::eof, tok::pound_endif, tok::pound_else,
67736770
tok::pound_elseif)) {
67746771
IsInputIncomplete = true;
@@ -8048,9 +8045,7 @@ void Parser::parseExpandedMemberList(SmallVectorImpl<ASTNode> &items) {
80488045

80498046
SourceLoc startingLoc = Tok.getLoc();
80508047
while (!Tok.is(tok::eof)) {
8051-
parseDeclItem(previousHadSemi,
8052-
getMemberParseDeclOptions(idc),
8053-
[&](Decl *d) { items.push_back(d); });
8048+
parseDeclItem(previousHadSemi, [&](Decl *d) { items.push_back(d); });
80548049

80558050
if (Tok.getLoc() == startingLoc)
80568051
break;

lib/Parse/ParseStmt.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,11 +407,9 @@ ParserStatus Parser::parseBraceItems(SmallVectorImpl<ASTNode> &Entries,
407407
NeedParseErrorRecovery = Status.isErrorOrHasCompletion();
408408
} else if (isStartOfSwiftDecl()) {
409409
SmallVector<Decl*, 8> TmpDecls;
410-
ParserResult<Decl> DeclResult =
411-
parseDecl(IsTopLevel ? PD_AllowTopLevel : PD_Default,
412-
IsAtStartOfLineOrPreviousHadSemi,
413-
/*IfConfigsAreDeclAttrs=*/true,
414-
[&](Decl *D) {
410+
ParserResult<Decl> DeclResult =
411+
parseDecl(IsAtStartOfLineOrPreviousHadSemi,
412+
/*IfConfigsAreDeclAttrs=*/true, [&](Decl *D) {
415413
TmpDecls.push_back(D);
416414

417415
// Any function after a 'guard' statement is marked as

lib/Parse/Parser.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,8 @@ void Parser::performIDEInspectionSecondPassImpl(
179179
"Delayed decl must be a type member or a top-level decl");
180180
ContextChange CC(*this, DC);
181181

182-
parseDecl(ParseDeclOptions(info.Flags),
183-
/*IsAtStartOfLineOrPreviousHadSemi=*/true,
184-
/*IfConfigsAreDeclAttrs=*/false,
185-
[&](Decl *D) {
182+
parseDecl(/*IsAtStartOfLineOrPreviousHadSemi=*/true,
183+
/*IfConfigsAreDeclAttrs=*/false, [&](Decl *D) {
186184
if (auto *NTD = dyn_cast<NominalTypeDecl>(DC)) {
187185
NTD->addMemberPreservingSourceOrder(D);
188186
} else if (auto *ED = dyn_cast<ExtensionDecl>(DC)) {

0 commit comments

Comments
 (0)