[CodeCompletion] Check the module visibility properly to handle the multi-file case. rdar://24818863

Reported: http://stackoverflow.com/questions/36180575/struck-out-module-xcode-7-3
This commit is contained in:
Xi Ge
2016-03-24 17:40:23 -07:00
committed by Michael Ilseman
parent 3a3295f053
commit baff806cf6
3 changed files with 32 additions and 6 deletions

View File

@@ -1604,10 +1604,21 @@ public:
}
}
bool isModuleLoaded(ASTContext &Ctx, clang::Module *M) {
return Ctx.getLoadedModule(llvm::makeArrayRef(
std::make_pair(Ctx.getIdentifier(M->getTopLevelModuleName()),
SourceLoc())));
void collectImportedModules(llvm::StringSet<> &ImportedModules) {
SmallVector<Module::ImportedModule, 16> Imported;
SmallVector<Module::ImportedModule, 16> FurtherImported;
CurrDeclContext->getParentSourceFile()->getImportedModules(Imported,
Module::ImportFilter::All);
while(!Imported.empty()) {
ModuleDecl *MD = Imported.front().second;
Imported.erase(Imported.begin());
ImportedModules.insert(MD->getNameStr());
FurtherImported.clear();
MD->getImportedModules(FurtherImported, Module::ImportFilter::Public);
for (auto SubMod : FurtherImported) {
Imported.push_back(SubMod);
}
}
}
void addImportModuleNames() {
@@ -1619,6 +1630,8 @@ public:
return LHS->getTopLevelModuleName().compare_lower(
RHS->getTopLevelModuleName()) < 0;
});
llvm::StringSet<> ImportedModules;
collectImportedModules(ImportedModules);
for (auto *M : Modules) {
if (M->isAvailable() &&
!M->getTopLevelModuleName().startswith("_") &&
@@ -1636,8 +1649,7 @@ public:
Builder.addTypeAnnotation("Module");
// Imported modules are not recommended.
Builder.setNotRecommended(isModuleLoaded(CurrDeclContext->
getASTContext(), M));
Builder.setNotRecommended(ImportedModules.count(MD->getNameStr()) != 0);
}
}
}