@@ -361,6 +361,43 @@ enum class ConstructorComparison {
361361 Better,
362362};
363363
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+ bool clearedAny = !decls.empty ();
379+ decls.clear ();
380+ return clearedAny;
381+ }
382+
383+ size_t initialCount = decls.size ();
384+ decls.erase (
385+ std::remove_if (decls.begin (), decls.end (), [&](ValueDecl *decl) -> bool {
386+ bool inScope = ctx.getImportCache ().isImportedBy (decl->getModuleContext (),
387+ visibleFrom);
388+
389+ LLVM_DEBUG (decl->dumpRef (llvm::dbgs ()));
390+ LLVM_DEBUG (llvm::dbgs () << " : " << decl->getModuleContext ()->getName ()
391+ << (inScope ? " is " : " is NOT " )
392+ << " selected by " << visibleFrom->getName ()
393+ << " \n " );
394+
395+ return !inScope;
396+ }),
397+ decls.end ());
398+ return initialCount != decls.size ();
399+ }
400+
364401// / Determines whether \p ctor1 is a "better" initializer than \p ctor2.
365402static ConstructorComparison compareConstructors (ConstructorDecl *ctor1,
366403 ConstructorDecl *ctor2,
@@ -2471,14 +2508,17 @@ bool namelookup::isInABIAttr(SourceFile *sourceFile, SourceLoc loc) {
24712508}
24722509
24732510void namelookup::pruneLookupResultSet (const DeclContext *dc, NLOptions options,
2511+ Identifier moduleSelector,
24742512 SmallVectorImpl<ValueDecl *> &decls) {
24752513 // If we're supposed to remove overridden declarations, do so now.
24762514 if (options & NL_RemoveOverridden)
24772515 removeOverriddenDecls (decls);
24782516
24792517 // If we're supposed to remove shadowed/hidden declarations, do so now.
2480- if (options & NL_RemoveNonVisible)
2518+ if (options & NL_RemoveNonVisible) {
2519+ removeOutOfModuleDecls (decls, moduleSelector, dc);
24812520 removeShadowedDecls (decls, dc);
2521+ }
24822522
24832523 ModuleDecl *M = dc->getParentModule ();
24842524 filterForDiscriminator (decls, M->getDebugClient ());
@@ -2790,7 +2830,7 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
27902830 }
27912831 }
27922832
2793- pruneLookupResultSet (DC, options, decls);
2833+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
27942834 if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
27952835 debugClient->finishLookupInNominals (DC, typeDecls, member.getFullName (),
27962836 options, decls);
@@ -2842,7 +2882,7 @@ ModuleQualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
28422882 }
28432883 }
28442884
2845- pruneLookupResultSet (DC, options, decls);
2885+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
28462886
28472887 if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
28482888 debugClient->finishLookupInModule (DC, module , member.getFullName (),
@@ -2910,7 +2950,7 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
29102950 decls.push_back (decl);
29112951 }
29122952
2913- pruneLookupResultSet (dc, options, decls);
2953+ pruneLookupResultSet (dc, options, member. getModuleSelector (), decls);
29142954 if (auto *debugClient = dc->getParentModule ()->getDebugClient ()) {
29152955 debugClient->finishLookupInAnyObject (dc, member.getFullName (), options,
29162956 decls);
0 commit comments