Author: Haojian Wu Date: 2021-01-29T14:10:27+01:00 New Revision: e90e455d2a0cc6e04b930a43355c3551e2c6f0e0
URL: https://github.com/llvm/llvm-project/commit/e90e455d2a0cc6e04b930a43355c3551e2c6f0e0 DIFF: https://github.com/llvm/llvm-project/commit/e90e455d2a0cc6e04b930a43355c3551e2c6f0e0.diff LOG: [Syntax] Add syntax-tree-dump in clang-check. This is useful to experiment/develop syntax trees. Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D95526 Added: clang/test/Tooling/clang-check-syntax-tree-dump.cpp Modified: clang/tools/clang-check/CMakeLists.txt clang/tools/clang-check/ClangCheck.cpp Removed: ################################################################################ diff --git a/clang/test/Tooling/clang-check-syntax-tree-dump.cpp b/clang/test/Tooling/clang-check-syntax-tree-dump.cpp new file mode 100644 index 000000000000..026a866eab06 --- /dev/null +++ b/clang/test/Tooling/clang-check-syntax-tree-dump.cpp @@ -0,0 +1,9 @@ +// RUN: clang-check -syntax-tree-dump "%s" -- 2>&1 | FileCheck %s +int abc; +// CHECK: TranslationUnit Detached +// CHECK-NEXT: `-SimpleDeclaration +// CHECK-NEXT: |-'int' +// CHECK-NEXT: |-DeclaratorList Declarators +// CHECK-NEXT: | `-SimpleDeclarator ListElement +// CHECK-NEXT: | `-'abc' +// CHECK-NEXT: `-';' diff --git a/clang/tools/clang-check/CMakeLists.txt b/clang/tools/clang-check/CMakeLists.txt index 6d2fc196631d..5493aa4237ae 100644 --- a/clang/tools/clang-check/CMakeLists.txt +++ b/clang/tools/clang-check/CMakeLists.txt @@ -18,4 +18,5 @@ clang_target_link_libraries(clang-check clangSerialization clangStaticAnalyzerFrontend clangTooling + clangToolingSyntax ) diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index a04936478eb3..4be3ce980c81 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -24,6 +24,9 @@ #include "clang/Rewrite/Frontend/FrontendActions.h" #include "clang/StaticAnalyzer/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" +#include "clang/Tooling/Syntax/BuildTree.h" +#include "clang/Tooling/Syntax/Tokens.h" +#include "clang/Tooling/Syntax/Tree.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Option/OptTable.h" @@ -82,6 +85,10 @@ static cl::opt<bool> FixWhatYouCan( cl::desc(Options.getOptionHelpText(options::OPT_fix_what_you_can)), cl::cat(ClangCheckCategory)); +static cl::opt<bool> SyntaxTreeDump("syntax-tree-dump", + cl::desc("dump the syntax tree"), + cl::cat(ClangCheckCategory)); + namespace { // FIXME: Move FixItRewriteInPlace from lib/Rewrite/Frontend/FrontendActions.cpp @@ -131,6 +138,28 @@ class ClangCheckFixItAction : public clang::FixItAction { } }; +class DumpSyntaxTree : public clang::ASTFrontendAction { +public: + std::unique_ptr<clang::ASTConsumer> + CreateASTConsumer(clang::CompilerInstance &CI, StringRef InFile) override { + class Consumer : public clang::ASTConsumer { + public: + Consumer(clang::CompilerInstance &CI) : Collector(CI.getPreprocessor()) {} + + void HandleTranslationUnit(clang::ASTContext &AST) override { + clang::syntax::TokenBuffer TB = std::move(Collector).consume(); + clang::syntax::Arena A(AST.getSourceManager(), AST.getLangOpts(), TB); + llvm::outs() << clang::syntax::buildSyntaxTree(A, AST)->dump( + AST.getSourceManager()); + } + + private: + clang::syntax::TokenCollector Collector; + }; + return std::make_unique<Consumer>(CI); + } +}; + class ClangCheckActionFactory { public: std::unique_ptr<clang::ASTConsumer> newASTConsumer() { @@ -188,6 +217,8 @@ int main(int argc, const char **argv) { FrontendFactory = newFrontendActionFactory<clang::ento::AnalysisAction>(); else if (Fixit) FrontendFactory = newFrontendActionFactory<ClangCheckFixItAction>(); + else if (SyntaxTreeDump) + FrontendFactory = newFrontendActionFactory<DumpSyntaxTree>(); else FrontendFactory = newFrontendActionFactory(&CheckFactory); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits