[clang] e90e455 - [Syntax] Add syntax-tree-dump in clang-check.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 29 05:19:51 PST 2021


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);
 


        


More information about the cfe-commits mailing list