From: Axel Naumann Date: Tue, 23 Sep 2014 12:35:33 +0000 (+0200) Subject: Let decls print their decl context. X-Git-Tag: v6-02-00-rc1~25 X-Git-Url: https://root.cern.ch/gitweb?p=root.git;a=commitdiff_plain;h=ec926584982e5f33c052d25bd85838c3b971c6a0 Let decls print their decl context. --- diff --git a/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.cpp b/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.cpp index 4f68d48..54f3d30 100644 --- a/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.cpp +++ b/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.cpp @@ -694,14 +694,10 @@ namespace cling { } if (!haveAnyDecl) { // make sure at least one redecl of this namespace is fwd declared. - if (D == D->getCanonicalDecl()) - haveAnyDecl = true; - } - if (haveAnyDecl) { - std::string output = stream.take(true); - if (D->isInline()) - Out() << "inline "; - Out() << "namespace " << *D << " {\n" << output << "}\n"; + if (D == D->getCanonicalDecl()) { + PrintNamespaceOpen(D); + Out() << "}\n"; + } } } @@ -762,21 +758,12 @@ namespace cling { } void ForwardDeclPrinter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { - const char *l; - if (D->getLanguage() == LinkageSpecDecl::lang_c) - l = "C"; - else { - assert(D->getLanguage() == LinkageSpecDecl::lang_cxx && - "unknown language in linkage specification"); - l = "C++"; - } - - Out() << "extern \"" << l << "\" "; + PrintLinkageOpen(D); if (D->hasBraces()) { - Out() << "{\n"; // VisitDeclContext(D); //To skip weird typedefs and struct definitions for (auto it = D->decls_begin(); it != D->decls_end(); ++it) { Visit(*it); + skipCurrentDecl(false); } Out() << "}"; } else { @@ -1226,4 +1213,41 @@ namespace cling { Log() << bad << " decls skipped out of " << m_Visited.size() << "\n"; } + + void ForwardDeclPrinter::PrintNamespaceOpen(NamespaceDecl* ND) { + if (ND->isInline()) + Out() << "inline "; + Out() << "namespace " << *ND << '{'; + } + + void ForwardDeclPrinter::PrintLinkageOpen(LinkageSpecDecl* LSD) { + assert((LSD->getLanguage() == LinkageSpecDecl::lang_cxx || + LSD->getLanguage() == LinkageSpecDecl::lang_c) && + "Unknown linkage spec!"); + Out() << "extern \"C"; + if (LSD->getLanguage() == LinkageSpecDecl::lang_cxx) { + Out() << "++"; + } + Out() << "\" {"; + } + + + std::string ForwardDeclPrinter::PrintEnclosingDeclContexts(DeclContext* DC) { + // Return closing "} } } }"... + size_t numClose = 0; + for(; DC && !DC->isTranslationUnit(); DC = DC->getParent()) { + if (NamespaceDecl* ND = dyn_cast(DC)) { + PrintNamespaceOpen(ND); + ++numClose; + } else if (LinkageSpecDecl* LSD = dyn_cast(DC)) { + PrintLinkageOpen(LSD); + ++numClose; + } else { + Log() << "Skipping unhandled " << DC->getDeclKindName() << '\n'; + skipCurrentDecl(false); + return ""; + } + } + return std::string(numClose, '}'); + } }//end namespace cling diff --git a/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.h b/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.h index 9194664..cc43a7f 100644 --- a/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.h +++ b/interpreter/cling/lib/Interpreter/ForwardDeclPrinter.h @@ -243,6 +243,9 @@ namespace cling { const clang::Decl* getCanonicalOrNamespace(const clang::NamespaceDecl* D) const { return D; } + std::string PrintEnclosingDeclContexts(clang::DeclContext* DC); + void PrintNamespaceOpen(clang::NamespaceDecl* ND); + void PrintLinkageOpen(clang::LinkageSpecDecl* LSD); class StreamRAII { ForwardDeclPrinter& m_pr;