mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-30 17:21:10 +00:00
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
This commit is contained in:
parent
5334a2c571
commit
d10d790044
@ -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();
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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(),
|
||||
|
Loading…
Reference in New Issue
Block a user