@@ -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,
@@ -2471,14 +2507,17 @@ bool namelookup::isInABIAttr(SourceFile *sourceFile, SourceLoc loc) {
2471
2507
}
2472
2508
2473
2509
void namelookup::pruneLookupResultSet (const DeclContext *dc, NLOptions options,
2510
+ Identifier moduleSelector,
2474
2511
SmallVectorImpl<ValueDecl *> &decls) {
2475
2512
// If we're supposed to remove overridden declarations, do so now.
2476
2513
if (options & NL_RemoveOverridden)
2477
2514
removeOverriddenDecls (decls);
2478
2515
2479
2516
// If we're supposed to remove shadowed/hidden declarations, do so now.
2480
- if (options & NL_RemoveNonVisible)
2517
+ if (options & NL_RemoveNonVisible) {
2518
+ removeOutOfModuleDecls (decls, moduleSelector, dc);
2481
2519
removeShadowedDecls (decls, dc);
2520
+ }
2482
2521
2483
2522
ModuleDecl *M = dc->getParentModule ();
2484
2523
filterForDiscriminator (decls, M->getDebugClient ());
@@ -2790,7 +2829,7 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
2790
2829
}
2791
2830
}
2792
2831
2793
- pruneLookupResultSet (DC, options, decls);
2832
+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
2794
2833
if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
2795
2834
debugClient->finishLookupInNominals (DC, typeDecls, member.getFullName (),
2796
2835
options, decls);
@@ -2842,7 +2881,7 @@ ModuleQualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
2842
2881
}
2843
2882
}
2844
2883
2845
- pruneLookupResultSet (DC, options, decls);
2884
+ pruneLookupResultSet (DC, options, member. getModuleSelector (), decls);
2846
2885
2847
2886
if (auto *debugClient = DC->getParentModule ()->getDebugClient ()) {
2848
2887
debugClient->finishLookupInModule (DC, module , member.getFullName (),
@@ -2910,7 +2949,7 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
2910
2949
decls.push_back (decl);
2911
2950
}
2912
2951
2913
- pruneLookupResultSet (dc, options, decls);
2952
+ pruneLookupResultSet (dc, options, member. getModuleSelector (), decls);
2914
2953
if (auto *debugClient = dc->getParentModule ()->getDebugClient ()) {
2915
2954
debugClient->finishLookupInAnyObject (dc, member.getFullName (), options,
2916
2955
decls);
0 commit comments