diff options
author | Alexander Kornienko <alexfh@google.com> | 2018-04-06 13:01:12 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2018-04-06 13:01:12 +0000 |
commit | d10d7900449db3a9d12cea2e670199aceec6ec3a (patch) | |
tree | fc60bfc10f6d25ecc54880be3121fb9ae5cb7438 /clang | |
parent | 5334a2c5715b772b67eeb33165e5a3654a81f011 (diff) | |
download | bcm5719-llvm-d10d7900449db3a9d12cea2e670199aceec6ec3a.tar.gz bcm5719-llvm-d10d7900449db3a9d12cea2e670199aceec6ec3a.zip |
Allow the creation of human-friendly ASTDumper to arbitrary output stream
Summary:
`ASTPrinter` allows setting the ouput to any O-Stream, but that printer creates source-code-like syntax (and is also marked with a `FIXME`). The nice, colourful, mostly human-readable `ASTDumper` only works on the standard output, which is not feasible in case a user wants to see the AST of a file through a code navigation/comprehension tool.
This small addition of an overload solves generating a nice colourful AST block for the users of a tool I'm working on, [[ http://github.com/Ericsson/CodeCompass | CodeCompass ]], as opposed to having to duplicate the behaviour of definitions that only exist in the anonymous namespace of implementation TUs related to this module.
Reviewers: alexfh, klimek, rsmith
Reviewed By: alexfh
Subscribers: rnkovacs, dkrupp, gsd, xazax.hun, cfe-commits, #clang
Tags: #clang
Patch by Whisperity!
Differential Revision: https://reviews.llvm.org/D45096
llvm-svn: 329391
Diffstat (limited to 'clang')
-rw-r--r-- | clang/docs/HowToSetupToolingForLLVM.rst | 3 | ||||
-rw-r--r-- | clang/include/clang/Frontend/ASTConsumers.h | 7 | ||||
-rw-r--r-- | clang/lib/Frontend/ASTConsumers.cpp | 12 | ||||
-rw-r--r-- | clang/lib/Frontend/FrontendActions.cpp | 3 | ||||
-rw-r--r-- | clang/tools/clang-check/ClangCheck.cpp | 4 | ||||
-rw-r--r-- | clang/tools/clang-import-test/clang-import-test.cpp | 3 |
6 files changed, 20 insertions, 12 deletions
diff --git a/clang/docs/HowToSetupToolingForLLVM.rst b/clang/docs/HowToSetupToolingForLLVM.rst index 3812fc9f46e..686aca840ad 100644 --- a/clang/docs/HowToSetupToolingForLLVM.rst +++ b/clang/docs/HowToSetupToolingForLLVM.rst @@ -133,7 +133,8 @@ Examples: if (this->ASTList.operator _Bool()) return clang::CreateASTDeclNodeLister(); if (this->ASTDump.operator _Bool()) - return clang::CreateASTDumper(this->ASTDumpFilter); + return clang::CreateASTDumper(nullptr /*Dump to stdout.*/, + this->ASTDumpFilter); if (this->ASTPrint.operator _Bool()) return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter); return new clang::ASTConsumer(); diff --git a/clang/include/clang/Frontend/ASTConsumers.h b/clang/include/clang/Frontend/ASTConsumers.h index 53975a07ea9..2a13527df13 100644 --- a/clang/include/clang/Frontend/ASTConsumers.h +++ b/clang/include/clang/Frontend/ASTConsumers.h @@ -34,9 +34,10 @@ class TargetOptions; std::unique_ptr<ASTConsumer> CreateASTPrinter(std::unique_ptr<raw_ostream> OS, StringRef FilterString); -// AST dumper: dumps the raw AST in human-readable form to stderr; this is -// intended for debugging. -std::unique_ptr<ASTConsumer> CreateASTDumper(StringRef FilterString, +// AST dumper: dumps the raw AST in human-readable form to the given output +// stream, or stdout if OS is nullptr. +std::unique_ptr<ASTConsumer> CreateASTDumper(std::unique_ptr<raw_ostream> OS, + StringRef FilterString, bool DumpDecls, bool Deserialize, bool DumpLookups); diff --git a/clang/lib/Frontend/ASTConsumers.cpp b/clang/lib/Frontend/ASTConsumers.cpp index 7dc475e26f7..a51d5b4a151 100644 --- a/clang/lib/Frontend/ASTConsumers.cpp +++ b/clang/lib/Frontend/ASTConsumers.cpp @@ -138,12 +138,14 @@ clang::CreateASTPrinter(std::unique_ptr<raw_ostream> Out, FilterString); } -std::unique_ptr<ASTConsumer> clang::CreateASTDumper(StringRef FilterString, - bool DumpDecls, - bool Deserialize, - bool DumpLookups) { +std::unique_ptr<ASTConsumer> +clang::CreateASTDumper(std::unique_ptr<raw_ostream> Out, + StringRef FilterString, + bool DumpDecls, + bool Deserialize, + bool DumpLookups) { assert((DumpDecls || Deserialize || DumpLookups) && "nothing to dump"); - return llvm::make_unique<ASTPrinter>(nullptr, + return llvm::make_unique<ASTPrinter>(std::move(Out), Deserialize ? ASTPrinter::DumpFull : DumpDecls ? ASTPrinter::Dump : ASTPrinter::None, diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 1eff566f0f4..8cb6a04224d 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -74,7 +74,8 @@ ASTPrintAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { std::unique_ptr<ASTConsumer> ASTDumpAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { - return CreateASTDumper(CI.getFrontendOpts().ASTDumpFilter, + return CreateASTDumper(nullptr /*Dump to stdout.*/, + CI.getFrontendOpts().ASTDumpFilter, CI.getFrontendOpts().ASTDumpDecls, CI.getFrontendOpts().ASTDumpAll, CI.getFrontendOpts().ASTDumpLookups); diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index e190c0721af..c970ac5adc7 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -138,7 +138,9 @@ public: if (ASTList) return clang::CreateASTDeclNodeLister(); if (ASTDump) - return clang::CreateASTDumper(ASTDumpFilter, /*DumpDecls=*/true, + return clang::CreateASTDumper(nullptr /*Dump to stdout.*/, + ASTDumpFilter, + /*DumpDecls=*/true, /*Deserialize=*/false, /*DumpLookups=*/false); if (ASTPrint) diff --git a/clang/tools/clang-import-test/clang-import-test.cpp b/clang/tools/clang-import-test/clang-import-test.cpp index d218d4107ed..106f3d1d150 100644 --- a/clang/tools/clang-import-test/clang-import-test.cpp +++ b/clang/tools/clang-import-test/clang-import-test.cpp @@ -313,7 +313,8 @@ llvm::Expected<CIAndOrigins> Parse(const std::string &Path, auto &CG = *static_cast<CodeGenerator *>(ASTConsumers.back().get()); if (ShouldDumpAST) - ASTConsumers.push_back(CreateASTDumper("", true, false, false)); + ASTConsumers.push_back(CreateASTDumper(nullptr /*Dump to stdout.*/, + "", true, false, false)); CI.getDiagnosticClient().BeginSourceFile( CI.getCompilerInstance().getLangOpts(), |