bool C2Builder::checkModuleImports(ParseHelper& helper, Component* component, Module* module, ImportsQueue& queue, const LibInfo* lib) { if (!module->isLoaded()) { assert(lib); if (options.verbose) log(COL_VERBOSE, "parsing (%s) %s", component->getName().c_str(), lib->c2file.c_str()); if (!helper.parse(*component, module, lib->c2file, (options.printAST0 && options.printASTLib))) { return false; } } if (options.verbose) log(COL_VERBOSE, "checking imports for module (%s) %s", component->getName().c_str(), module->getName().c_str()); bool ok = true; const AstList& files = module->getFiles(); for (unsigned a=0; a<files.size(); a++) { AST* ast = files[a]; for (unsigned u=1; u<ast->numImports(); u++) { // NOTE: first import is module decl ImportDecl* D = ast->getImport(u); const std::string& targetModuleName = D->getModuleName(); // handle c2 pseudo-module if (targetModuleName == "c2") { createC2Module(); D->setModule(c2Mod); continue; } const LibInfo* target = libLoader.findModuleLib(targetModuleName); if (!target) { helper.Diags.Report(D->getLocation(), clang::diag::err_unknown_module) << targetModuleName; ok = false; continue; } D->setModule(target->module); if (target->component != component) { // check that imports are in directly dependent component (no indirect component) if (!component->hasDep(target->component)) { helper.Diags.Report(D->getLocation(), clang::diag::err_indirect_component) << component->getName() << target->component->getName() << targetModuleName; ok = false; continue; } } if (target->module->isLoaded()) continue; queue.push_back(targetModuleName); } } return ok; }
void DepGenerator::writeAST(const AST& ast, StringBuilder& output, unsigned indent) const { if (showExternals) { for (unsigned i=0; i<ast.numImports(); i++) { const ImportDecl* U = ast.getImport(i); QualType Q = U->getType(); const ModuleType* T = cast<ModuleType>(Q.getTypePtr()); const Module* P = T->getModule(); assert(P); if (P->isExternal()) addExternal(P); } } for (unsigned i=0; i<ast.numTypes(); i++) { writeDecl(ast.getType(i), output, indent); } for (unsigned i=0; i<ast.numVars(); i++) { writeDecl(ast.getVar(i), output, indent); } for (unsigned i=0; i<ast.numFunctions(); i++) { writeDecl(ast.getFunction(i), output, indent); } }