Skip to content

Commit 2f09918

Browse files
committed
Tighten up the code.
1 parent 12d6038 commit 2f09918

File tree

1 file changed

+46
-50
lines changed

1 file changed

+46
-50
lines changed

lib/AST/UnqualifiedLookup.cpp

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,12 @@ class UnqualifiedLookupFactory {
222222
#pragma mark ASTScope-based-lookup declarations
223223

224224
// TODO: better name than DC
225-
struct DCAndIsCascadingUse {
225+
struct DCAndResolvedIsCascadingUse {
226226
DeclContext *const DC;
227227
const bool isCascadingUse;
228228
};
229229

230-
Optional<DCAndIsCascadingUse>
230+
Optional<DCAndResolvedIsCascadingUse>
231231
astScopeBasedLookup(DeclContext *dc, Optional<bool> isCascadingUse);
232232

233233
std::pair<const ASTScope *, bool>
@@ -266,26 +266,30 @@ class UnqualifiedLookupFactory {
266266
#pragma mark normal (non-ASTScope-based) lookup declarations
267267

268268
/// Return None if lookup done.
269-
Optional<DCAndIsCascadingUse> operatorLookup(DeclContext *dc,
270-
Optional<bool> isCascadingUse);
269+
Optional<DCAndResolvedIsCascadingUse>
270+
operatorLookup(DeclContext *dc, Optional<bool> isCascadingUse);
271271

272272
/// Return None if lookup done.
273-
Optional<DCAndIsCascadingUse>
273+
Optional<DCAndResolvedIsCascadingUse>
274274
nonASTScopeBasedLookup(DeclContext *const dc,
275275
const Optional<bool> isCascadingUseArg);
276276

277-
struct LookupInOneDeclContextResult {
278-
DeclContext *completedDC;
277+
struct DCAndUnresolvedIsCascadingUse {
278+
DeclContext *whereToLook;
279279
Optional<bool> isCascadingUse;
280+
DCAndResolvedIsCascadingUse resolve(const bool resolution) const {
281+
return DCAndResolvedIsCascadingUse{
282+
whereToLook,
283+
isCascadingUse.hasValue() ? isCascadingUse.getValue() : resolution};
284+
}
280285
};
281286

282287
/// Return the next context to search.
283-
Optional<LookupInOneDeclContextResult>
284-
lookupInOneDeclContext(DeclContext *dc,
285-
const Optional<bool> isCascadingUseArg);
288+
Optional<DCAndUnresolvedIsCascadingUse>
289+
lookupInOneDeclContext(DCAndUnresolvedIsCascadingUse);
286290

287291
Optional<PerDeclInfo>
288-
lookupInAppropriateContext(DeclContext *dc, Optional<bool> isCascadingUse);
292+
lookupInAppropriateContext(DCAndUnresolvedIsCascadingUse);
289293

290294
// TODO: use objects & virtuals
291295

@@ -432,7 +436,7 @@ bool UnqualifiedLookupFactory::shouldUseASTScopeLookup() const {
432436
#pragma mark ASTScope-based-lookup definitions
433437

434438
/// Return None if lookup done
435-
Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse>
439+
Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
436440
UnqualifiedLookupFactory::astScopeBasedLookup(DeclContext *const startDC,
437441
Optional<bool> isCascadingUse) {
438442
const std::pair<const ASTScope *, Optional<bool>>
@@ -455,7 +459,7 @@ UnqualifiedLookupFactory::astScopeBasedLookup(DeclContext *const startDC,
455459
currentIsCascadingUse = r.getValue().isCascadingUse;
456460
const bool isDone = r.getValue().isDone;
457461
if (isDone)
458-
return DCAndIsCascadingUse{dc, currentIsCascadingUse.getValue()};
462+
return DCAndResolvedIsCascadingUse{dc, currentIsCascadingUse.getValue()};
459463
}
460464
llvm_unreachable("impossible");
461465
}
@@ -648,55 +652,44 @@ UnqualifiedLookupFactory::lookIntoDeclarationContextForASTScopeLookup(
648652

649653
#pragma mark normal (non-ASTScope-based) lookup declarations
650654

651-
Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse>
655+
Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
652656
UnqualifiedLookupFactory::operatorLookup(DeclContext *dc,
653657
Optional<bool> isCascadingUse) {
654658
auto *msc = dc->getModuleScopeContext();
655-
return DCAndIsCascadingUse{
659+
return DCAndResolvedIsCascadingUse{
656660
addLocalVariableResults(msc) ? nullptr : msc,
657661
resolveIsCascadingUse(dc, isCascadingUse,
658662
/*onlyCareAboutFunctionBody*/ true)};
659663
}
660664

661-
Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse>
665+
// TODO: Unify with LookupVisibleDecls.cpp::lookupVisibleDeclsImpl
666+
Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
662667
UnqualifiedLookupFactory::nonASTScopeBasedLookup(
663-
DeclContext *const dc, const Optional<bool> isCascadingUseArg) {
668+
DeclContext *const dcArg, const Optional<bool> isCascadingUseArg) {
664669
// If we are inside of a method, check to see if there are any ivars in
665670
// scope, and if so, whether this is a reference to one of them.
666671
// FIXME: We should persist this information between lookups.
667-
DeclContext *nextDC = dc;
668-
auto isCascadingUse = isCascadingUseArg;
669-
DeclContext *priorDC = nullptr;
670-
while (!nextDC->isModuleScopeContext()) {
671-
auto r = lookupInOneDeclContext(nextDC, isCascadingUse);
672-
if (!r.hasValue())
673-
return None;
674-
nextDC = r.getValue().completedDC->getParentForLookup();
675-
isCascadingUse = r.getValue().isCascadingUse;
676-
assert(nextDC != priorDC && "non-termination");
677-
priorDC = nextDC;
678-
}
679-
if (addLocalVariableResults(nextDC))
672+
Optional<DCAndUnresolvedIsCascadingUse> r(
673+
DCAndUnresolvedIsCascadingUse{dcArg, isCascadingUseArg});
674+
while (r.hasValue() && !r.getValue().whereToLook->isModuleScopeContext())
675+
r = lookupInOneDeclContext(r.getValue());
676+
if (!r.hasValue() || addLocalVariableResults(r.getValue().whereToLook))
680677
return None;
681-
return DCAndIsCascadingUse{
682-
nextDC, isCascadingUse.hasValue() ? isCascadingUse.getValue() : true};
678+
return r.getValue().resolve(true);
683679
}
684680

685-
// clang-format off
686-
Optional<UnqualifiedLookupFactory::LookupInOneDeclContextResult>
681+
Optional<UnqualifiedLookupFactory::DCAndUnresolvedIsCascadingUse>
687682
UnqualifiedLookupFactory::lookupInOneDeclContext(
688-
DeclContext *dc,
689-
const Optional<bool> isCascadingUseArg) {
690-
// clang-format on
691-
const auto r = lookupInAppropriateContext(dc, isCascadingUseArg);
683+
const DCAndUnresolvedIsCascadingUse whereAndDependencyInfo) {
684+
const auto r = lookupInAppropriateContext(whereAndDependencyInfo);
692685
if (!r.hasValue())
693686
return None;
694687
breadcrumbs.push_back(r.getValue());
695688
auto lookupContextForThisDecl = r.getValue().lookupContextForThisDecl;
696689
auto placesToSearch = std::move(r.getValue().placesToSearch);
697690
auto isCascadingUse = r.getValue().isCascadingUse;
698691

699-
if (!isa<DefaultArgumentInitializer>(dc) &&
692+
if (!isa<DefaultArgumentInitializer>(whereAndDependencyInfo.whereToLook) &&
700693
addGenericParametersHereAndInEnclosingScopes(lookupContextForThisDecl))
701694
return None;
702695
if (placesToSearch.hasValue() && !placesToSearch.getValue().empty()) {
@@ -707,29 +700,32 @@ UnqualifiedLookupFactory::lookupInOneDeclContext(
707700
if (handleUnavailableInnerResults(startIndexOfInnerResults))
708701
return None;
709702
}
710-
// TODO: What if !BaseDC && lookupDecls non-empty?
711-
return LookupInOneDeclContextResult{lookupContextForThisDecl,
712-
isCascadingUse};
703+
auto *const whereToLookNext = lookupContextForThisDecl->getParentForLookup();
704+
assert(whereToLookNext != whereAndDependencyInfo.whereToLook &&
705+
"non-termination");
706+
return DCAndUnresolvedIsCascadingUse{whereToLookNext, isCascadingUse};
713707
}
714708
// clang-format on
715709

716710
Optional<UnqualifiedLookupFactory::PerDeclInfo>
717711
UnqualifiedLookupFactory::lookupInAppropriateContext(
718-
DeclContext *dc, Optional<bool> isCascadingUse) {
712+
const DCAndUnresolvedIsCascadingUse dcAndIsCasc) {
713+
DeclContext *const dc = dcAndIsCasc.whereToLook;
714+
const auto isCascadingUseSoFar = dcAndIsCasc.isCascadingUse;
719715
if (auto *PBI = dyn_cast<PatternBindingInitializer>(dc))
720-
return lookupInPatternBindingInitializer(PBI, isCascadingUse);
716+
return lookupInPatternBindingInitializer(PBI, isCascadingUseSoFar);
721717
if (auto *AFD = dyn_cast<AbstractFunctionDecl>(dc))
722-
return lookupInFunctionDecl(AFD, isCascadingUse);
718+
return lookupInFunctionDecl(AFD, isCascadingUseSoFar);
723719
if (auto *ACE = dyn_cast<AbstractClosureExpr>(dc))
724-
return lookupInClosure(ACE, isCascadingUse);
720+
return lookupInClosure(ACE, isCascadingUseSoFar);
725721
if (auto *ED = dyn_cast<ExtensionDecl>(dc))
726-
return lookupInNominalTypeOrExtension(ED, isCascadingUse);
722+
return lookupInNominalTypeOrExtension(ED, isCascadingUseSoFar);
727723
if (auto *ND = dyn_cast<NominalTypeDecl>(dc))
728-
return lookupInNominalTypeOrExtension(ND, isCascadingUse);
724+
return lookupInNominalTypeOrExtension(ND, isCascadingUseSoFar);
729725
if (auto I = dyn_cast<DefaultArgumentInitializer>(dc))
730-
return lookupInDefaultArgumentInitializer(I, isCascadingUse);
726+
return lookupInDefaultArgumentInitializer(I, isCascadingUseSoFar);
731727

732-
return lookupInMiscContext(dc, isCascadingUse);
728+
return lookupInMiscContext(dc, isCascadingUseSoFar);
733729
}
734730

735731
Optional<UnqualifiedLookupFactory::PerDeclInfo>

0 commit comments

Comments
 (0)