Skip to content

Commit 6393c8d

Browse files
committed
Partial recurisivication of decl-based name lookup.
1 parent e3e597d commit 6393c8d

File tree

1 file changed

+54
-81
lines changed

1 file changed

+54
-81
lines changed

lib/AST/UnqualifiedLookup.cpp

Lines changed: 54 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -225,33 +225,29 @@ class UnqualifiedLookupFactory {
225225
void performUnqualifiedLookup();
226226

227227
private:
228+
struct DCAndUnresolvedIsCascadingUse {
229+
DeclContext *whereToLook;
230+
Optional<bool> isCascadingUse;
231+
DCAndResolvedIsCascadingUse resolve(const bool resolution) const {
232+
return DCAndResolvedIsCascadingUse{
233+
whereToLook,
234+
isCascadingUse.hasValue() ? isCascadingUse.getValue() : resolution};
235+
}
236+
};
237+
228238
bool useASTScopesForExperimentalLookup() const;
229239

230240
void lookInModuleScopeContext(DCAndResolvedIsCascadingUse dcAndIsCascadingUse);
231241

232242
#pragma mark ASTScope-based-lookup declarations
233243

234-
235-
void
236-
experimentallyLookInASTScopes(DeclContext *dc, Optional<bool> isCascadingUse);
244+
void experimentallyLookInASTScopes(DCAndUnresolvedIsCascadingUse);
237245

238246
std::pair<const ASTScope *, bool>
239-
operatorScopeForASTScopeLookup(DeclContext *dc,
240-
Optional<bool> isCascadingUse);
247+
operatorScopeForASTScopeLookup(DCAndUnresolvedIsCascadingUse);
241248

242249
std::pair<const ASTScope *, Optional<bool>>
243-
nonoperatorScopeForASTScopeLookup(DeclContext *dc,
244-
Optional<bool> isCascadingUse) const;
245-
246-
struct DCAndUnresolvedIsCascadingUse {
247-
DeclContext *whereToLook;
248-
Optional<bool> isCascadingUse;
249-
DCAndResolvedIsCascadingUse resolve(const bool resolution) const {
250-
return DCAndResolvedIsCascadingUse{
251-
whereToLook,
252-
isCascadingUse.hasValue() ? isCascadingUse.getValue() : resolution};
253-
}
254-
};
250+
nonoperatorScopeForASTScopeLookup(DCAndUnresolvedIsCascadingUse) const;
255251

256252
struct ASTScopeLookupState {
257253
const ASTScope *scope;
@@ -290,18 +286,9 @@ class UnqualifiedLookupFactory {
290286

291287
#pragma mark normal (non-ASTScope-based) lookup declarations
292288

293-
void lookInDeclContexts(DeclContext *dc, const Optional <bool> isCascadingUseArg);
294-
295289
void lookupOperatorInDeclContexts(DCAndUnresolvedIsCascadingUse);
296290

297-
/// Return None if lookup done.
298-
Optional<DCAndResolvedIsCascadingUse>
299-
lookupNameInDeclContexts(DeclContext * dc,
300-
const Optional<bool> isCascadingUseArg);
301-
302-
/// Return the next context to search.
303-
Optional<DCAndUnresolvedIsCascadingUse>
304-
lookupNameInOneDeclContext(DCAndUnresolvedIsCascadingUse);
291+
void lookupNameInDeclContexts(const DCAndUnresolvedIsCascadingUse);
305292

306293
Optional<PerDeclInfo>
307294
lookupLocalsInAppropriateContext(DCAndUnresolvedIsCascadingUse);
@@ -412,11 +399,13 @@ void UnqualifiedLookupFactory::performUnqualifiedLookup() {
412399
const Optional<bool> isCascadingUseInitial =
413400
options.contains(Flags::KnownPrivate) ? Optional<bool>(false) : None;
414401

415-
if (useASTScopesForExperimentalLookup()) {
416-
experimentallyLookInASTScopes(DC, isCascadingUseInitial);
417-
return;
418-
}
419-
lookInDeclContexts(DC, isCascadingUseInitial);
402+
DCAndUnresolvedIsCascadingUse dcAndIsCascadingUse{DC, isCascadingUseInitial};
403+
if (useASTScopesForExperimentalLookup())
404+
experimentallyLookInASTScopes(dcAndIsCascadingUse);
405+
else if (Name.isOperator())
406+
lookupOperatorInDeclContexts(dcAndIsCascadingUse);
407+
else
408+
lookupNameInDeclContexts(dcAndIsCascadingUse);
420409
}
421410

422411
void UnqualifiedLookupFactory::lookInModuleScopeContext(
@@ -454,25 +443,27 @@ bool UnqualifiedLookupFactory::useASTScopesForExperimentalLookup() const {
454443

455444
#pragma mark ASTScope-based-lookup definitions
456445

457-
void
458-
UnqualifiedLookupFactory::experimentallyLookInASTScopes(DeclContext *const startDC,
459-
Optional<bool> isCascadingUse) {
446+
void UnqualifiedLookupFactory::experimentallyLookInASTScopes(
447+
const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg) {
460448
const std::pair<const ASTScope *, Optional<bool>>
461449
lookupScopeAndIsCascadingUse =
462450
Name.isOperator()
463-
? operatorScopeForASTScopeLookup(startDC, isCascadingUse)
464-
: nonoperatorScopeForASTScopeLookup(startDC, isCascadingUse);
451+
? operatorScopeForASTScopeLookup(dcAndIsCascadingUseArg)
452+
: nonoperatorScopeForASTScopeLookup(dcAndIsCascadingUseArg);
465453
// Walk scopes outward from the innermost scope until we find something.
466-
467-
ASTScopeLookupState state{lookupScopeAndIsCascadingUse.first, nullptr, startDC, lookupScopeAndIsCascadingUse.second};
454+
455+
ASTScopeLookupState state{lookupScopeAndIsCascadingUse.first, nullptr,
456+
dcAndIsCascadingUseArg.whereToLook,
457+
lookupScopeAndIsCascadingUse.second};
468458
lookInScopeForASTScopeLookup(state);
469459
}
470460

471461
std::pair<const ASTScope *, bool>
472462
UnqualifiedLookupFactory::operatorScopeForASTScopeLookup(
473-
DeclContext *dc, Optional<bool> isCascadingUse) {
463+
const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg) {
474464
// Find the source file in which we are performing the lookup.
475-
SourceFile &sourceFile = *dc->getParentSourceFile();
465+
SourceFile &sourceFile =
466+
*dcAndIsCascadingUseArg.whereToLook->getParentSourceFile();
476467

477468
// Find the scope from which we will initiate unqualified name lookup.
478469
const ASTScope *lookupScope =
@@ -482,21 +473,22 @@ UnqualifiedLookupFactory::operatorScopeForASTScopeLookup(
482473
return std::make_pair(
483474
&sourceFile.getScope(),
484475
resolveIsCascadingUse(lookupScope->getInnermostEnclosingDeclContext(),
485-
isCascadingUse,
476+
dcAndIsCascadingUseArg.isCascadingUse,
486477
/*onlyCareAboutFunctionBody*/ true));
487478
}
488479

489480
std::pair<const ASTScope *, Optional<bool>>
490481
UnqualifiedLookupFactory::nonoperatorScopeForASTScopeLookup(
491-
DeclContext *dc, Optional<bool> isCascadingUse) const {
482+
const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg) const {
492483
// Find the source file in which we are performing the lookup.
493-
SourceFile &sourceFile = *dc->getParentSourceFile();
484+
SourceFile &sourceFile =
485+
*dcAndIsCascadingUseArg.whereToLook->getParentSourceFile();
494486

495487
// Find the scope from which we will initiate unqualified name lookup.
496488
const ASTScope *lookupScope =
497489
sourceFile.getScope().findInnermostEnclosingScope(Loc);
498490

499-
return std::make_pair(lookupScope, isCascadingUse);
491+
return std::make_pair(lookupScope, dcAndIsCascadingUseArg.isCascadingUse);
500492
}
501493

502494
void UnqualifiedLookupFactory::lookInScopeForASTScopeLookup(
@@ -652,21 +644,6 @@ void UnqualifiedLookupFactory::lookIntoDeclarationContextForASTScopeLookup(
652644

653645
#pragma mark context-based lookup definitions
654646

655-
void
656-
UnqualifiedLookupFactory::lookInDeclContexts(DeclContext *dc, const Optional <bool> isCascadingUseArg) {
657-
if (Name.isOperator()) {
658-
lookupOperatorInDeclContexts(
659-
DCAndUnresolvedIsCascadingUse{DC, isCascadingUseArg});
660-
return;
661-
}
662-
auto dcAndIsCascadingUse = lookupNameInDeclContexts(DC, isCascadingUseArg);
663-
if (!dcAndIsCascadingUse.hasValue())
664-
return;
665-
if (addLocalVariableResults(dcAndIsCascadingUse.getValue().DC))
666-
return;
667-
lookInModuleScopeContext(dcAndIsCascadingUse.getValue());
668-
}
669-
670647
void UnqualifiedLookupFactory::lookupOperatorInDeclContexts(
671648
const DCAndUnresolvedIsCascadingUse dcAndUseArg) {
672649
DCAndResolvedIsCascadingUse dcAndResolvedIsCascadingUse{
@@ -678,47 +655,43 @@ void UnqualifiedLookupFactory::lookupOperatorInDeclContexts(
678655
}
679656

680657
// TODO: Unify with LookupVisibleDecls.cpp::lookupVisibleDeclsImpl
681-
Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
682-
UnqualifiedLookupFactory::lookupNameInDeclContexts(
683-
DeclContext *const dcArg, const Optional<bool> isCascadingUseArg) {
658+
void UnqualifiedLookupFactory::lookupNameInDeclContexts(
659+
const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg) {
660+
// TODO: reloc comment
684661
// If we are inside of a method, check to see if there are any ivars in
685662
// scope, and if so, whether this is a reference to one of them.
686663
// FIXME: We should persist this information between lookups.
687-
Optional<DCAndUnresolvedIsCascadingUse> r(
688-
DCAndUnresolvedIsCascadingUse{dcArg, isCascadingUseArg});
689-
while (r.hasValue() && !r.getValue().whereToLook->isModuleScopeContext())
690-
r = lookupNameInOneDeclContext(r.getValue());
691-
if (!r.hasValue())
692-
return None;
693-
return r.getValue().resolve(true);
694-
}
695664

696-
Optional<UnqualifiedLookupFactory::DCAndUnresolvedIsCascadingUse>
697-
UnqualifiedLookupFactory::lookupNameInOneDeclContext(
698-
const DCAndUnresolvedIsCascadingUse whereAndDependencyInfo) {
699-
const auto r = lookupLocalsInAppropriateContext(whereAndDependencyInfo);
665+
if (dcAndIsCascadingUseArg.whereToLook->isModuleScopeContext()) {
666+
if (!addLocalVariableResults(dcAndIsCascadingUseArg.whereToLook))
667+
lookInModuleScopeContext(dcAndIsCascadingUseArg.resolve(true));
668+
return;
669+
}
670+
const auto r = lookupLocalsInAppropriateContext(dcAndIsCascadingUseArg);
700671
if (!r.hasValue())
701-
return None;
672+
return;
702673
breadcrumbs.push_back(r.getValue());
703674
auto lookupContextForThisDecl = r.getValue().lookupContextForThisDecl;
704675
auto placesToSearch = std::move(r.getValue().placesToSearch);
705676
auto isCascadingUse = r.getValue().isCascadingUse;
706677

707-
if (!isa<DefaultArgumentInitializer>(whereAndDependencyInfo.whereToLook) &&
678+
if (!isa<DefaultArgumentInitializer>(dcAndIsCascadingUseArg.whereToLook) &&
708679
addGenericParametersHereAndInEnclosingScopes(lookupContextForThisDecl))
709-
return None;
680+
return;
710681
if (placesToSearch.hasValue() && !placesToSearch.getValue().empty()) {
711682
auto startIndexOfInnerResults = Results.size();
712683
placesToSearch.getValue().addToResults(Name, isCascadingUse.getValue(),
713684
baseNLOptions,
714685
lookupContextForThisDecl, Results);
715686
if (handleUnavailableInnerResults(startIndexOfInnerResults))
716-
return None;
687+
return;
717688
}
718689
auto *const whereToLookNext = lookupContextForThisDecl->getParentForLookup();
719-
assert(whereToLookNext != whereAndDependencyInfo.whereToLook &&
690+
assert(whereToLookNext != dcAndIsCascadingUseArg.whereToLook &&
720691
"non-termination");
721-
return DCAndUnresolvedIsCascadingUse{whereToLookNext, isCascadingUse};
692+
693+
lookupNameInDeclContexts(
694+
DCAndUnresolvedIsCascadingUse{whereToLookNext, isCascadingUse});
722695
}
723696
// clang-format on
724697

0 commit comments

Comments
 (0)