@@ -225,33 +225,29 @@ class UnqualifiedLookupFactory {
225
225
void performUnqualifiedLookup ();
226
226
227
227
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
+
228
238
bool useASTScopesForExperimentalLookup () const ;
229
239
230
240
void lookInModuleScopeContext (DCAndResolvedIsCascadingUse dcAndIsCascadingUse);
231
241
232
242
#pragma mark ASTScope-based-lookup declarations
233
243
234
-
235
- void
236
- experimentallyLookInASTScopes (DeclContext *dc, Optional<bool > isCascadingUse);
244
+ void experimentallyLookInASTScopes (DCAndUnresolvedIsCascadingUse);
237
245
238
246
std::pair<const ASTScope *, bool >
239
- operatorScopeForASTScopeLookup (DeclContext *dc,
240
- Optional<bool > isCascadingUse);
247
+ operatorScopeForASTScopeLookup (DCAndUnresolvedIsCascadingUse);
241
248
242
249
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 ;
255
251
256
252
struct ASTScopeLookupState {
257
253
const ASTScope *scope;
@@ -290,18 +286,9 @@ class UnqualifiedLookupFactory {
290
286
291
287
#pragma mark normal (non-ASTScope-based) lookup declarations
292
288
293
- void lookInDeclContexts (DeclContext *dc, const Optional <bool > isCascadingUseArg);
294
-
295
289
void lookupOperatorInDeclContexts (DCAndUnresolvedIsCascadingUse);
296
290
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);
305
292
306
293
Optional<PerDeclInfo>
307
294
lookupLocalsInAppropriateContext (DCAndUnresolvedIsCascadingUse);
@@ -412,11 +399,13 @@ void UnqualifiedLookupFactory::performUnqualifiedLookup() {
412
399
const Optional<bool > isCascadingUseInitial =
413
400
options.contains (Flags::KnownPrivate) ? Optional<bool >(false ) : None;
414
401
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);
420
409
}
421
410
422
411
void UnqualifiedLookupFactory::lookInModuleScopeContext (
@@ -454,25 +443,27 @@ bool UnqualifiedLookupFactory::useASTScopesForExperimentalLookup() const {
454
443
455
444
#pragma mark ASTScope-based-lookup definitions
456
445
457
- void
458
- UnqualifiedLookupFactory::experimentallyLookInASTScopes (DeclContext *const startDC,
459
- Optional<bool > isCascadingUse) {
446
+ void UnqualifiedLookupFactory::experimentallyLookInASTScopes (
447
+ const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg) {
460
448
const std::pair<const ASTScope *, Optional<bool >>
461
449
lookupScopeAndIsCascadingUse =
462
450
Name.isOperator ()
463
- ? operatorScopeForASTScopeLookup (startDC, isCascadingUse )
464
- : nonoperatorScopeForASTScopeLookup (startDC, isCascadingUse );
451
+ ? operatorScopeForASTScopeLookup (dcAndIsCascadingUseArg )
452
+ : nonoperatorScopeForASTScopeLookup (dcAndIsCascadingUseArg );
465
453
// 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 };
468
458
lookInScopeForASTScopeLookup (state);
469
459
}
470
460
471
461
std::pair<const ASTScope *, bool >
472
462
UnqualifiedLookupFactory::operatorScopeForASTScopeLookup (
473
- DeclContext *dc, Optional< bool > isCascadingUse ) {
463
+ const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg ) {
474
464
// Find the source file in which we are performing the lookup.
475
- SourceFile &sourceFile = *dc->getParentSourceFile ();
465
+ SourceFile &sourceFile =
466
+ *dcAndIsCascadingUseArg.whereToLook ->getParentSourceFile ();
476
467
477
468
// Find the scope from which we will initiate unqualified name lookup.
478
469
const ASTScope *lookupScope =
@@ -482,21 +473,22 @@ UnqualifiedLookupFactory::operatorScopeForASTScopeLookup(
482
473
return std::make_pair (
483
474
&sourceFile.getScope (),
484
475
resolveIsCascadingUse (lookupScope->getInnermostEnclosingDeclContext (),
485
- isCascadingUse,
476
+ dcAndIsCascadingUseArg. isCascadingUse ,
486
477
/* onlyCareAboutFunctionBody*/ true ));
487
478
}
488
479
489
480
std::pair<const ASTScope *, Optional<bool >>
490
481
UnqualifiedLookupFactory::nonoperatorScopeForASTScopeLookup (
491
- DeclContext *dc, Optional< bool > isCascadingUse ) const {
482
+ const DCAndUnresolvedIsCascadingUse dcAndIsCascadingUseArg ) const {
492
483
// Find the source file in which we are performing the lookup.
493
- SourceFile &sourceFile = *dc->getParentSourceFile ();
484
+ SourceFile &sourceFile =
485
+ *dcAndIsCascadingUseArg.whereToLook ->getParentSourceFile ();
494
486
495
487
// Find the scope from which we will initiate unqualified name lookup.
496
488
const ASTScope *lookupScope =
497
489
sourceFile.getScope ().findInnermostEnclosingScope (Loc);
498
490
499
- return std::make_pair (lookupScope, isCascadingUse);
491
+ return std::make_pair (lookupScope, dcAndIsCascadingUseArg. isCascadingUse );
500
492
}
501
493
502
494
void UnqualifiedLookupFactory::lookInScopeForASTScopeLookup (
@@ -652,21 +644,6 @@ void UnqualifiedLookupFactory::lookIntoDeclarationContextForASTScopeLookup(
652
644
653
645
#pragma mark context-based lookup definitions
654
646
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
-
670
647
void UnqualifiedLookupFactory::lookupOperatorInDeclContexts (
671
648
const DCAndUnresolvedIsCascadingUse dcAndUseArg) {
672
649
DCAndResolvedIsCascadingUse dcAndResolvedIsCascadingUse{
@@ -678,47 +655,43 @@ void UnqualifiedLookupFactory::lookupOperatorInDeclContexts(
678
655
}
679
656
680
657
// 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
684
661
// If we are inside of a method, check to see if there are any ivars in
685
662
// scope, and if so, whether this is a reference to one of them.
686
663
// 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
- }
695
664
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);
700
671
if (!r.hasValue ())
701
- return None ;
672
+ return ;
702
673
breadcrumbs.push_back (r.getValue ());
703
674
auto lookupContextForThisDecl = r.getValue ().lookupContextForThisDecl ;
704
675
auto placesToSearch = std::move (r.getValue ().placesToSearch );
705
676
auto isCascadingUse = r.getValue ().isCascadingUse ;
706
677
707
- if (!isa<DefaultArgumentInitializer>(whereAndDependencyInfo .whereToLook ) &&
678
+ if (!isa<DefaultArgumentInitializer>(dcAndIsCascadingUseArg .whereToLook ) &&
708
679
addGenericParametersHereAndInEnclosingScopes (lookupContextForThisDecl))
709
- return None ;
680
+ return ;
710
681
if (placesToSearch.hasValue () && !placesToSearch.getValue ().empty ()) {
711
682
auto startIndexOfInnerResults = Results.size ();
712
683
placesToSearch.getValue ().addToResults (Name, isCascadingUse.getValue (),
713
684
baseNLOptions,
714
685
lookupContextForThisDecl, Results);
715
686
if (handleUnavailableInnerResults (startIndexOfInnerResults))
716
- return None ;
687
+ return ;
717
688
}
718
689
auto *const whereToLookNext = lookupContextForThisDecl->getParentForLookup ();
719
- assert (whereToLookNext != whereAndDependencyInfo .whereToLook &&
690
+ assert (whereToLookNext != dcAndIsCascadingUseArg .whereToLook &&
720
691
" non-termination" );
721
- return DCAndUnresolvedIsCascadingUse{whereToLookNext, isCascadingUse};
692
+
693
+ lookupNameInDeclContexts (
694
+ DCAndUnresolvedIsCascadingUse{whereToLookNext, isCascadingUse});
722
695
}
723
696
// clang-format on
724
697
0 commit comments