Parse inferred submodules in module maps, track their contents in

Module, and (de-)serialize this information. Semantics of inferred
submodules to follow.

llvm-svn: 145864
This commit is contained in:
Douglas Gregor
2011-12-05 22:27:44 +00:00
parent b8c719ccc6
commit 734410916a
7 changed files with 197 additions and 17 deletions

View File

@@ -37,6 +37,14 @@ bool Module::isSubModuleOf(Module *Other) const {
return false;
}
const Module *Module::getTopLevelModule() const {
const Module *Result = this;
while (Result->Parent)
Result = Result->Parent;
return Result;
}
std::string Module::getFullModuleName() const {
llvm::SmallVector<StringRef, 2> Names;
@@ -57,14 +65,6 @@ std::string Module::getFullModuleName() const {
return Result;
}
StringRef Module::getTopLevelModuleName() const {
const Module *Top = this;
while (Top->Parent)
Top = Top->Parent;
return Top->Name;
}
static void printModuleId(llvm::raw_ostream &OS, const ModuleId &Id) {
for (unsigned I = 0, N = Id.size(); I != N; ++I) {
if (I)
@@ -96,7 +96,7 @@ void Module::print(llvm::raw_ostream &OS, unsigned Indent) const {
}
for (llvm::StringMap<Module *>::const_iterator MI = SubModules.begin(),
MIEnd = SubModules.end();
MIEnd = SubModules.end();
MI != MIEnd; ++MI)
MI->getValue()->print(OS, Indent + 2);
@@ -126,6 +126,19 @@ void Module::print(llvm::raw_ostream &OS, unsigned Indent) const {
OS << "\n";
}
if (InferSubmodules) {
OS.indent(Indent + 2);
if (InferExplicitSubmodules)
OS << "explicit ";
OS << "module * {\n";
if (InferExportWildcard) {
OS.indent(Indent + 4);
OS << "export *\n";
}
OS.indent(Indent + 2);
OS << "}\n";
}
OS.indent(Indent);
OS << "}\n";
}