forked from OSchip/llvm-project
[modules] Refactor code from ASTReader::makeModuleVisible() into a new function,
Module::getExportedModules() so it can be reused. llvm-svn: 175548
This commit is contained in:
parent
d6915b42ff
commit
8739f7b7f6
|
@ -318,7 +318,10 @@ public:
|
|||
submodule_const_iterator submodule_begin() const {return SubModules.begin();}
|
||||
submodule_iterator submodule_end() { return SubModules.end(); }
|
||||
submodule_const_iterator submodule_end() const { return SubModules.end(); }
|
||||
|
||||
|
||||
/// \brief Returns the exported modules based on the wildcard restrictions.
|
||||
void getExportedModules(SmallVectorImpl<Module *> &Exported) const;
|
||||
|
||||
static StringRef getModuleInputBufferName() {
|
||||
return "<module-includes>";
|
||||
}
|
||||
|
|
|
@ -175,6 +175,59 @@ static void printModuleId(raw_ostream &OS, const ModuleId &Id) {
|
|||
}
|
||||
}
|
||||
|
||||
void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const {
|
||||
bool AnyWildcard = false;
|
||||
bool UnrestrictedWildcard = false;
|
||||
SmallVector<Module *, 4> WildcardRestrictions;
|
||||
for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
|
||||
Module *Mod = Exports[I].getPointer();
|
||||
if (!Exports[I].getInt()) {
|
||||
// Export a named module directly; no wildcards involved.
|
||||
Exported.push_back(Mod);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Wildcard export: export all of the imported modules that match
|
||||
// the given pattern.
|
||||
AnyWildcard = true;
|
||||
if (UnrestrictedWildcard)
|
||||
continue;
|
||||
|
||||
if (Module *Restriction = Exports[I].getPointer())
|
||||
WildcardRestrictions.push_back(Restriction);
|
||||
else {
|
||||
WildcardRestrictions.clear();
|
||||
UnrestrictedWildcard = true;
|
||||
}
|
||||
}
|
||||
|
||||
// If there were any wildcards, push any imported modules that were
|
||||
// re-exported by the wildcard restriction.
|
||||
if (!AnyWildcard)
|
||||
return;
|
||||
|
||||
for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
|
||||
Module *Mod = Imports[I];
|
||||
bool Acceptable = UnrestrictedWildcard;
|
||||
if (!Acceptable) {
|
||||
// Check whether this module meets one of the restrictions.
|
||||
for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
|
||||
Module *Restriction = WildcardRestrictions[R];
|
||||
if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) {
|
||||
Acceptable = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Acceptable)
|
||||
continue;
|
||||
|
||||
Exported.push_back(Mod);
|
||||
}
|
||||
}
|
||||
|
||||
void Module::print(raw_ostream &OS, unsigned Indent) const {
|
||||
OS.indent(Indent);
|
||||
if (IsFramework)
|
||||
|
|
|
@ -2703,59 +2703,13 @@ void ASTReader::makeModuleVisible(Module *Mod,
|
|||
}
|
||||
|
||||
// Push any exported modules onto the stack to be marked as visible.
|
||||
bool AnyWildcard = false;
|
||||
bool UnrestrictedWildcard = false;
|
||||
SmallVector<Module *, 4> WildcardRestrictions;
|
||||
for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) {
|
||||
Module *Exported = Mod->Exports[I].getPointer();
|
||||
if (!Mod->Exports[I].getInt()) {
|
||||
// Export a named module directly; no wildcards involved.
|
||||
if (Visited.insert(Exported))
|
||||
Stack.push_back(Exported);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Wildcard export: export all of the imported modules that match
|
||||
// the given pattern.
|
||||
AnyWildcard = true;
|
||||
if (UnrestrictedWildcard)
|
||||
continue;
|
||||
|
||||
if (Module *Restriction = Mod->Exports[I].getPointer())
|
||||
WildcardRestrictions.push_back(Restriction);
|
||||
else {
|
||||
WildcardRestrictions.clear();
|
||||
UnrestrictedWildcard = true;
|
||||
}
|
||||
}
|
||||
|
||||
// If there were any wildcards, push any imported modules that were
|
||||
// re-exported by the wildcard restriction.
|
||||
if (!AnyWildcard)
|
||||
continue;
|
||||
|
||||
for (unsigned I = 0, N = Mod->Imports.size(); I != N; ++I) {
|
||||
Module *Imported = Mod->Imports[I];
|
||||
if (!Visited.insert(Imported))
|
||||
continue;
|
||||
|
||||
bool Acceptable = UnrestrictedWildcard;
|
||||
if (!Acceptable) {
|
||||
// Check whether this module meets one of the restrictions.
|
||||
for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
|
||||
Module *Restriction = WildcardRestrictions[R];
|
||||
if (Imported == Restriction || Imported->isSubModuleOf(Restriction)) {
|
||||
Acceptable = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Acceptable)
|
||||
continue;
|
||||
|
||||
Stack.push_back(Imported);
|
||||
SmallVector<Module *, 16> Exports;
|
||||
Mod->getExportedModules(Exports);
|
||||
for (SmallVectorImpl<Module *>::iterator
|
||||
I = Exports.begin(), E = Exports.end(); I != E; ++I) {
|
||||
Module *Exported = *I;
|
||||
if (Visited.insert(Exported))
|
||||
Stack.push_back(Exported);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue