• Home
  • Raw
  • Download

Lines Matching +full:parent +full:- +full:module

1 //===--- Module.cpp - Describe a module -----------------------------------===//
8 //===----------------------------------------------------------------------===//
10 // This file defines the Module class, which describes a module in the source
13 //===----------------------------------------------------------------------===//
15 #include "clang/Basic/Module.h"
27 Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent, in Module() argument
29 : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), Directory(), in Module()
37 if (Parent) { in Module()
38 if (!Parent->isAvailable()) in Module()
40 if (Parent->IsSystem) in Module()
42 if (Parent->IsExternC) in Module()
44 IsMissingRequirement = Parent->IsMissingRequirement; in Module()
46 Parent->SubModuleIndex[Name] = Parent->SubModules.size(); in Module()
47 Parent->SubModules.push_back(this); in Module()
51 Module::~Module() { in ~Module()
80 bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target, in isAvailable()
86 for (const Module *Current = this; Current; Current = Current->Parent) { in isAvailable()
87 for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) { in isAvailable()
88 if (hasFeature(Current->Requirements[I].first, LangOpts, Target) != in isAvailable()
89 Current->Requirements[I].second) { in isAvailable()
90 Req = Current->Requirements[I]; in isAvailable()
94 if (!Current->MissingHeaders.empty()) { in isAvailable()
95 MissingHeader = Current->MissingHeaders.front(); in isAvailable()
100 llvm_unreachable("could not find a reason why module is unavailable"); in isAvailable()
103 bool Module::isSubModuleOf(const Module *Other) const { in isSubModuleOf()
104 const Module *This = this; in isSubModuleOf()
109 This = This->Parent; in isSubModuleOf()
115 const Module *Module::getTopLevelModule() const { in getTopLevelModule()
116 const Module *Result = this; in getTopLevelModule()
117 while (Result->Parent) in getTopLevelModule()
118 Result = Result->Parent; in getTopLevelModule()
123 std::string Module::getFullModuleName() const { in getFullModuleName()
126 // Build up the set of module names (from innermost to outermost). in getFullModuleName()
127 for (const Module *M = this; M; M = M->Parent) in getFullModuleName()
128 Names.push_back(M->Name); in getFullModuleName()
143 bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const { in fullModuleNameIs()
144 for (const Module *M = this; M; M = M->Parent) { in fullModuleNameIs()
145 if (nameParts.empty() || M->Name != nameParts.back()) in fullModuleNameIs()
152 Module::DirectoryName Module::getUmbrellaDir() const { in getUmbrellaDir()
154 return {"", U.Entry->getDir()}; in getUmbrellaDir()
159 ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) { in getTopHeaders()
172 bool Module::directlyUses(const Module *Requested) const { in directlyUses()
175 // A top-level module implicitly uses itself. in directlyUses()
176 if (Requested->isSubModuleOf(Top)) in directlyUses()
179 for (auto *Use : Top->DirectUses) in directlyUses()
180 if (Requested->isSubModuleOf(Use)) in directlyUses()
185 void Module::addRequirement(StringRef Feature, bool RequiredState, in addRequirement()
197 void Module::markUnavailable(bool MissingRequirement) { in markUnavailable()
198 auto needUpdate = [MissingRequirement](Module *M) { in markUnavailable()
199 return M->IsAvailable || (!M->IsMissingRequirement && MissingRequirement); in markUnavailable()
205 SmallVector<Module *, 2> Stack; in markUnavailable()
208 Module *Current = Stack.back(); in markUnavailable()
214 Current->IsAvailable = false; in markUnavailable()
215 Current->IsMissingRequirement |= MissingRequirement; in markUnavailable()
216 for (submodule_iterator Sub = Current->submodule_begin(), in markUnavailable()
217 SubEnd = Current->submodule_end(); in markUnavailable()
225 Module *Module::findSubmodule(StringRef Name) const { in findSubmodule()
230 return SubModules[Pos->getValue()]; in findSubmodule()
241 void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const { in getExportedModules()
242 // All non-explicit submodules are exported. in getExportedModules()
243 for (std::vector<Module *>::const_iterator I = SubModules.begin(), in getExportedModules()
246 Module *Mod = *I; in getExportedModules()
247 if (!Mod->IsExplicit) in getExportedModules()
251 // Find re-exported modules by filtering the list of imported modules. in getExportedModules()
254 SmallVector<Module *, 4> WildcardRestrictions; in getExportedModules()
256 Module *Mod = Exports[I].getPointer(); in getExportedModules()
258 // Export a named module directly; no wildcards involved. in getExportedModules()
270 if (Module *Restriction = Exports[I].getPointer()) in getExportedModules()
279 // re-exported by the wildcard restriction. in getExportedModules()
284 Module *Mod = Imports[I]; in getExportedModules()
287 // Check whether this module meets one of the restrictions. in getExportedModules()
289 Module *Restriction = WildcardRestrictions[R]; in getExportedModules()
290 if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) { in getExportedModules()
304 void Module::buildVisibleModulesCache() const { in buildVisibleModulesCache()
307 // This module is visible to itself. in buildVisibleModulesCache()
310 // Every imported module is visible. in buildVisibleModulesCache()
311 SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end()); in buildVisibleModulesCache()
313 Module *CurrModule = Stack.pop_back_val(); in buildVisibleModulesCache()
315 // Every module transitively exported by an imported module is visible. in buildVisibleModulesCache()
317 CurrModule->getExportedModules(Stack); in buildVisibleModulesCache()
321 void Module::print(raw_ostream &OS, unsigned Indent) const { in print()
327 OS << "module " << Name; in print()
397 // Print inferred subframework modules so that we don't need to re-infer in print()
399 // the module. Regular inferred submodules are OK, as we need to look at all in print()
401 if (!(*MI)->IsInferred || (*MI)->IsFramework) in print()
402 (*MI)->print(OS, Indent + 2); in print()
407 if (Module *Restriction = Exports[I].getPointer()) { in print()
408 OS << Restriction->getFullModuleName(); in print()
429 OS << DirectUses[I]->getFullModuleName(); in print()
462 OS << Conflicts[I].Other->getFullModuleName(); in print()
472 OS << "module * {\n"; in print()
485 LLVM_DUMP_METHOD void Module::dump() const { in dump()
489 void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc, in setVisible()
498 Module *M; in setVisible()
504 if (!V.M->isAvailable()) in setVisible()
507 // Nothing to do for a module that's already visible. in setVisible()
508 unsigned ID = V.M->getVisibilityID(); in setVisible()
518 SmallVector<Module *, 16> Exports; in setVisible()
519 V.M->getExportedModules(Exports); in setVisible()
520 for (Module *E : Exports) in setVisible()
523 for (auto &C : V.M->Conflicts) { in setVisible()
525 llvm::SmallVector<Module*, 8> Path; in setVisible()
526 for (Visiting *I = &V; I; I = I->ExportedBy) in setVisible()
527 Path.push_back(I->M); in setVisible()