From bf4871d3635f67c4cd4cdea61dd0ff0d8f5d49ba Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Mon, 13 Aug 2012 10:50:08 +0000 Subject: [PATCH] Implemented -ast-dump, -ast-print, -ast-dump-filter options in clang-check llvm-svn: 161753 --- clang/test/Tooling/clang-check-ast-dump.cpp | 35 ++++++++++++++++ clang/tools/clang-check/ClangCheck.cpp | 44 ++++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 clang/test/Tooling/clang-check-ast-dump.cpp diff --git a/clang/test/Tooling/clang-check-ast-dump.cpp b/clang/test/Tooling/clang-check-ast-dump.cpp new file mode 100644 index 000000000000..86533af3e11d --- /dev/null +++ b/clang/test/Tooling/clang-check-ast-dump.cpp @@ -0,0 +1,35 @@ +// RUN: clang-check -ast-dump "%s" -- 2>&1 | FileCheck %s +// CHECK: namespace test_namespace +// CHECK-NEXT: class TheClass +// CHECK: int theMethod(int x) (CompoundStmt +// CHECK-NEXT: (ReturnStmt +// CHECK-NEXT: (BinaryOperator +// +// RUN: clang-check -ast-dump -ast-dump-filter test_namespace::TheClass::theMethod "%s" -- 2>&1 | FileCheck -check-prefix CHECK-FILTER %s +// CHECK-FILTER-NOT: namespace test_namespace +// CHECK-FILTER-NOT: class TheClass +// CHECK-FILTER: int theMethod(int x) (CompoundStmt +// CHECK-FILTER-NEXT: (ReturnStmt +// CHECK-FILTER-NEXT: (BinaryOperator +// +// RUN: clang-check -ast-print "%s" -- 2>&1 | FileCheck -check-prefix CHECK-PRINT %s +// CHECK-PRINT: namespace test_namespace +// CHECK-PRINT: class TheClass +// CHECK-PRINT: int theMethod(int x) +// +// RUN: clang-check -ast-list "%s" -- 2>&1 | FileCheck -check-prefix CHECK-LIST %s +// CHECK-LIST: test_namespace +// CHECK-LIST-NEXT: test_namespace::TheClass +// CHECK-LIST-NEXT: test_namespace::TheClass::theMethod +// CHECK-LIST-NEXT: x + +namespace test_namespace { + +class TheClass { +public: + int theMethod(int x) { + return x + x; + } +}; + +} diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index d93c48ab01ed..9e58077b5a0e 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -17,10 +17,15 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/CommandLine.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/Driver/OptTable.h" +#include "clang/Driver/Options.h" +#include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommandLineClangTool.h" #include "clang/Tooling/Tooling.h" +using namespace clang::driver; using namespace clang::tooling; using namespace llvm; @@ -38,9 +43,46 @@ static const char *MoreHelpText = "\trules described above.\n" "\n"; +namespace { +class ActionFactory { +public: + ActionFactory() + : Options(createDriverOptTable()), + ASTDump( + "ast-dump", + cl::desc(Options->getOptionHelpText(options::OPT_ast_dump))), + ASTList( + "ast-list", + cl::desc(Options->getOptionHelpText(options::OPT_ast_list))), + ASTPrint( + "ast-print", + cl::desc(Options->getOptionHelpText(options::OPT_ast_print))), + ASTDumpFilter( + "ast-dump-filter", + cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter))) {} + + clang::ASTConsumer *newASTConsumer() { + if (ASTList) + return clang::CreateASTDeclNodeLister(); + if (ASTDump) + return clang::CreateASTDumper(ASTDumpFilter); + if (ASTPrint) + return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter); + return new clang::ASTConsumer(); + } +private: + OwningPtr Options; + cl::opt ASTDump; + cl::opt ASTList; + cl::opt ASTPrint; + cl::opt ASTDumpFilter; +}; +} + int main(int argc, const char **argv) { + ActionFactory Factory; CommandLineClangTool Tool; cl::extrahelp MoreHelp(MoreHelpText); Tool.initialize(argc, argv); - return Tool.run(newFrontendActionFactory()); + return Tool.run(newFrontendActionFactory(&Factory)); }