@@ -361,6 +361,42 @@ enum class ConstructorComparison {
361
361
Better,
362
362
};
363
363
364
+ bool swift::removeOutOfModuleDecls (SmallVectorImpl<ValueDecl*> &decls,
365
+ Identifier moduleSelector,
366
+ const DeclContext *dc) {
367
+ if (moduleSelector.empty ())
368
+ return false ;
369
+
370
+ ASTContext &ctx = dc->getASTContext ();
371
+
372
+ // FIXME: Should we look this up relative to dc?
373
+ // We'd need a new ResolutionKind.
374
+ // FIXME: How can we diagnose this?
375
+ ModuleDecl *visibleFrom = ctx.getLoadedModule (moduleSelector);
376
+ if (!visibleFrom) {
377
+ LLVM_DEBUG (llvm::dbgs () << " no module " << moduleSelector << " \n " );
378
+ decls.clear ();
379
+ return true ;
380
+ }
381
+
382
+ bool initialCount = decls.size ();
383
+ decls.erase (
384
+ std::remove_if (decls.begin (), decls.end (), [&](ValueDecl *decl) -> bool {
385
+ bool inScope = ctx.getImportCache ().isImportedBy (decl->getModuleContext (),
386
+ visibleFrom);
387
+
388
+ LLVM_DEBUG (decl->dumpRef (llvm::dbgs ()));
389
+ LLVM_DEBUG (llvm::dbgs () << " : " << decl->getModuleContext ()->getName ()
390
+ << (inScope ? " is " : " is NOT " )
391
+ << " selected by " << visibleFrom->getName ()
392
+ << " \n " );
393
+
394
+ return !inScope;
395
+ }),
396
+ decls.end ());
397
+ return initialCount != decls.size ();
398
+ }
399
+
364
400
// / Determines whether \p ctor1 is a "better" initializer than \p ctor2.
365
401
static ConstructorComparison compareConstructors (ConstructorDecl *ctor1,
366
402
ConstructorDecl *ctor2,
@@ -2466,14 +2502,17 @@ bool namelookup::isInABIAttr(SourceFile *sourceFile, SourceLoc loc) {
2466
2502
}
2467
2503
2468
2504
void namelookup::pruneLookupResultSet (const DeclContext *dc, NLOptions options,
2505
+ Identifier moduleSelector,
2469
2506
SmallVectorImpl<ValueDecl *> &decls) {
2470
2507
// If we're supposed to remove overridden declarations, do so now.
2471
2508
if (options & NL_RemoveOverridden)
2472
2509
removeOverriddenDecls (decls);
2473
2510
2474
2511
// If we're supposed to remove shadowed/hidden declarations, do so now.
2475
- if (options & NL_RemoveNonVisible)
2512
+ if (options & NL_RemoveNonVisible) {
2513
+ removeOutOfModuleDecls (decls, moduleSelector, dc);
2476
2514
removeShadowedDecls (decls, dc);
2515
+ }
2477
2516
2478
2517
ModuleDecl *M = dc->getParentModule ();
2479
2518
filterForDiscriminator (decls, M->getDebugClient ());
@@ -2785,7 +2824,7 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
2785
2824
}
2786
2825
}
2787
2826
2788
- pruneLookupResultSet (DC, options, decls);
2827
+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
2789
2828
if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
2790
2829
debugClient->finishLookupInNominals (DC, typeDecls, member.getFullName (),
2791
2830
options, decls);
@@ -2837,7 +2876,7 @@ ModuleQualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
2837
2876
}
2838
2877
}
2839
2878
2840
- pruneLookupResultSet (DC, options, decls);
2879
+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
2841
2880
2842
2881
if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
2843
2882
debugClient->finishLookupInModule (DC, module , member.getFullName (),
@@ -2905,7 +2944,7 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
2905
2944
decls.push_back (decl);
2906
2945
}
2907
2946
2908
- pruneLookupResultSet (dc, options, decls);
2947
+ pruneLookupResultSet (dc, options, member. getModuleSelector (), decls);
2909
2948
if (auto *debugClient = dc->getParentModule ()->getDebugClient ()) {
2910
2949
debugClient->finishLookupInAnyObject (dc, member.getFullName (), options,
2911
2950
decls);
0 commit comments