@@ -222,12 +222,12 @@ class UnqualifiedLookupFactory {
222
222
#pragma mark ASTScope-based-lookup declarations
223
223
224
224
// TODO: better name than DC
225
- struct DCAndIsCascadingUse {
225
+ struct DCAndResolvedIsCascadingUse {
226
226
DeclContext *const DC;
227
227
const bool isCascadingUse;
228
228
};
229
229
230
- Optional<DCAndIsCascadingUse >
230
+ Optional<DCAndResolvedIsCascadingUse >
231
231
astScopeBasedLookup (DeclContext *dc, Optional<bool > isCascadingUse);
232
232
233
233
std::pair<const ASTScope *, bool >
@@ -266,26 +266,30 @@ class UnqualifiedLookupFactory {
266
266
#pragma mark normal (non-ASTScope-based) lookup declarations
267
267
268
268
// / 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);
271
271
272
272
// / Return None if lookup done.
273
- Optional<DCAndIsCascadingUse >
273
+ Optional<DCAndResolvedIsCascadingUse >
274
274
nonASTScopeBasedLookup (DeclContext *const dc,
275
275
const Optional<bool > isCascadingUseArg);
276
276
277
- struct LookupInOneDeclContextResult {
278
- DeclContext *completedDC ;
277
+ struct DCAndUnresolvedIsCascadingUse {
278
+ DeclContext *whereToLook ;
279
279
Optional<bool > isCascadingUse;
280
+ DCAndResolvedIsCascadingUse resolve (const bool resolution) const {
281
+ return DCAndResolvedIsCascadingUse{
282
+ whereToLook,
283
+ isCascadingUse.hasValue () ? isCascadingUse.getValue () : resolution};
284
+ }
280
285
};
281
286
282
287
// / Return the next context to search.
283
- Optional<LookupInOneDeclContextResult>
284
- lookupInOneDeclContext (DeclContext *dc,
285
- const Optional<bool > isCascadingUseArg);
288
+ Optional<DCAndUnresolvedIsCascadingUse>
289
+ lookupInOneDeclContext (DCAndUnresolvedIsCascadingUse);
286
290
287
291
Optional<PerDeclInfo>
288
- lookupInAppropriateContext (DeclContext *dc, Optional< bool > isCascadingUse );
292
+ lookupInAppropriateContext (DCAndUnresolvedIsCascadingUse );
289
293
290
294
// TODO: use objects & virtuals
291
295
@@ -432,7 +436,7 @@ bool UnqualifiedLookupFactory::shouldUseASTScopeLookup() const {
432
436
#pragma mark ASTScope-based-lookup definitions
433
437
434
438
// / Return None if lookup done
435
- Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse >
439
+ Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse >
436
440
UnqualifiedLookupFactory::astScopeBasedLookup (DeclContext *const startDC,
437
441
Optional<bool > isCascadingUse) {
438
442
const std::pair<const ASTScope *, Optional<bool >>
@@ -455,7 +459,7 @@ UnqualifiedLookupFactory::astScopeBasedLookup(DeclContext *const startDC,
455
459
currentIsCascadingUse = r.getValue ().isCascadingUse ;
456
460
const bool isDone = r.getValue ().isDone ;
457
461
if (isDone)
458
- return DCAndIsCascadingUse {dc, currentIsCascadingUse.getValue ()};
462
+ return DCAndResolvedIsCascadingUse {dc, currentIsCascadingUse.getValue ()};
459
463
}
460
464
llvm_unreachable (" impossible" );
461
465
}
@@ -648,55 +652,44 @@ UnqualifiedLookupFactory::lookIntoDeclarationContextForASTScopeLookup(
648
652
649
653
#pragma mark normal (non-ASTScope-based) lookup declarations
650
654
651
- Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse >
655
+ Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse >
652
656
UnqualifiedLookupFactory::operatorLookup (DeclContext *dc,
653
657
Optional<bool > isCascadingUse) {
654
658
auto *msc = dc->getModuleScopeContext ();
655
- return DCAndIsCascadingUse {
659
+ return DCAndResolvedIsCascadingUse {
656
660
addLocalVariableResults (msc) ? nullptr : msc,
657
661
resolveIsCascadingUse (dc, isCascadingUse,
658
662
/* onlyCareAboutFunctionBody*/ true )};
659
663
}
660
664
661
- Optional<UnqualifiedLookupFactory::DCAndIsCascadingUse>
665
+ // TODO: Unify with LookupVisibleDecls.cpp::lookupVisibleDeclsImpl
666
+ Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
662
667
UnqualifiedLookupFactory::nonASTScopeBasedLookup (
663
- DeclContext *const dc , const Optional<bool > isCascadingUseArg) {
668
+ DeclContext *const dcArg , const Optional<bool > isCascadingUseArg) {
664
669
// If we are inside of a method, check to see if there are any ivars in
665
670
// scope, and if so, whether this is a reference to one of them.
666
671
// 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 ))
680
677
return None;
681
- return DCAndIsCascadingUse{
682
- nextDC, isCascadingUse.hasValue () ? isCascadingUse.getValue () : true };
678
+ return r.getValue ().resolve (true );
683
679
}
684
680
685
- // clang-format off
686
- Optional<UnqualifiedLookupFactory::LookupInOneDeclContextResult>
681
+ Optional<UnqualifiedLookupFactory::DCAndUnresolvedIsCascadingUse>
687
682
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);
692
685
if (!r.hasValue ())
693
686
return None;
694
687
breadcrumbs.push_back (r.getValue ());
695
688
auto lookupContextForThisDecl = r.getValue ().lookupContextForThisDecl ;
696
689
auto placesToSearch = std::move (r.getValue ().placesToSearch );
697
690
auto isCascadingUse = r.getValue ().isCascadingUse ;
698
691
699
- if (!isa<DefaultArgumentInitializer>(dc ) &&
692
+ if (!isa<DefaultArgumentInitializer>(whereAndDependencyInfo. whereToLook ) &&
700
693
addGenericParametersHereAndInEnclosingScopes (lookupContextForThisDecl))
701
694
return None;
702
695
if (placesToSearch.hasValue () && !placesToSearch.getValue ().empty ()) {
@@ -707,29 +700,32 @@ UnqualifiedLookupFactory::lookupInOneDeclContext(
707
700
if (handleUnavailableInnerResults (startIndexOfInnerResults))
708
701
return None;
709
702
}
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};
713
707
}
714
708
// clang-format on
715
709
716
710
Optional<UnqualifiedLookupFactory::PerDeclInfo>
717
711
UnqualifiedLookupFactory::lookupInAppropriateContext (
718
- DeclContext *dc, Optional<bool > isCascadingUse) {
712
+ const DCAndUnresolvedIsCascadingUse dcAndIsCasc) {
713
+ DeclContext *const dc = dcAndIsCasc.whereToLook ;
714
+ const auto isCascadingUseSoFar = dcAndIsCasc.isCascadingUse ;
719
715
if (auto *PBI = dyn_cast<PatternBindingInitializer>(dc))
720
- return lookupInPatternBindingInitializer (PBI, isCascadingUse );
716
+ return lookupInPatternBindingInitializer (PBI, isCascadingUseSoFar );
721
717
if (auto *AFD = dyn_cast<AbstractFunctionDecl>(dc))
722
- return lookupInFunctionDecl (AFD, isCascadingUse );
718
+ return lookupInFunctionDecl (AFD, isCascadingUseSoFar );
723
719
if (auto *ACE = dyn_cast<AbstractClosureExpr>(dc))
724
- return lookupInClosure (ACE, isCascadingUse );
720
+ return lookupInClosure (ACE, isCascadingUseSoFar );
725
721
if (auto *ED = dyn_cast<ExtensionDecl>(dc))
726
- return lookupInNominalTypeOrExtension (ED, isCascadingUse );
722
+ return lookupInNominalTypeOrExtension (ED, isCascadingUseSoFar );
727
723
if (auto *ND = dyn_cast<NominalTypeDecl>(dc))
728
- return lookupInNominalTypeOrExtension (ND, isCascadingUse );
724
+ return lookupInNominalTypeOrExtension (ND, isCascadingUseSoFar );
729
725
if (auto I = dyn_cast<DefaultArgumentInitializer>(dc))
730
- return lookupInDefaultArgumentInitializer (I, isCascadingUse );
726
+ return lookupInDefaultArgumentInitializer (I, isCascadingUseSoFar );
731
727
732
- return lookupInMiscContext (dc, isCascadingUse );
728
+ return lookupInMiscContext (dc, isCascadingUseSoFar );
733
729
}
734
730
735
731
Optional<UnqualifiedLookupFactory::PerDeclInfo>
0 commit comments