blob: 9e58077b5a0ea204a02929471c7e694b65b3fe71 [file] [log] [blame]
Alexander Kornienkodea8fba2012-07-16 12:46:48 +00001//===- tools/clang-check/ClangCheck.cpp - Clang check tool ----------------===//
Manuel Klimekcb971c62012-04-04 12:07:46 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a clang-check tool that runs the
11// clang::SyntaxOnlyAction over a number of translation units.
12//
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000013// This tool uses the Clang Tooling infrastructure, see
14// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
15// for details on setting it up with LLVM source tree.
16//
Manuel Klimekcb971c62012-04-04 12:07:46 +000017//===----------------------------------------------------------------------===//
18
19#include "llvm/Support/CommandLine.h"
Alexander Kornienko48464702012-08-13 10:50:08 +000020#include "clang/AST/ASTConsumer.h"
21#include "clang/Driver/OptTable.h"
22#include "clang/Driver/Options.h"
23#include "clang/Frontend/ASTConsumers.h"
Manuel Klimekcb971c62012-04-04 12:07:46 +000024#include "clang/Frontend/FrontendActions.h"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000025#include "clang/Tooling/CommandLineClangTool.h"
Manuel Klimekcb971c62012-04-04 12:07:46 +000026#include "clang/Tooling/Tooling.h"
27
Alexander Kornienko48464702012-08-13 10:50:08 +000028using namespace clang::driver;
Manuel Klimekcb971c62012-04-04 12:07:46 +000029using namespace clang::tooling;
30using namespace llvm;
31
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000032static const char *MoreHelpText =
33 "\tFor example, to run clang-check on all files in a subtree of the\n"
34 "\tsource tree, use:\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000035 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000036 "\t find path/in/subtree -name '*.cpp'|xargs clang-check\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000037 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000038 "\tor using a specific build path:\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000039 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000040 "\t find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
Alexander Kornienko140d5132012-07-12 14:34:23 +000041 "\n"
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000042 "\tNote, that path/in/subtree and current directory should follow the\n"
43 "\trules described above.\n"
44 "\n";
Alexander Kornienko140d5132012-07-12 14:34:23 +000045
Alexander Kornienko48464702012-08-13 10:50:08 +000046namespace {
47class ActionFactory {
48public:
49 ActionFactory()
50 : Options(createDriverOptTable()),
51 ASTDump(
52 "ast-dump",
53 cl::desc(Options->getOptionHelpText(options::OPT_ast_dump))),
54 ASTList(
55 "ast-list",
56 cl::desc(Options->getOptionHelpText(options::OPT_ast_list))),
57 ASTPrint(
58 "ast-print",
59 cl::desc(Options->getOptionHelpText(options::OPT_ast_print))),
60 ASTDumpFilter(
61 "ast-dump-filter",
62 cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter))) {}
63
64 clang::ASTConsumer *newASTConsumer() {
65 if (ASTList)
66 return clang::CreateASTDeclNodeLister();
67 if (ASTDump)
68 return clang::CreateASTDumper(ASTDumpFilter);
69 if (ASTPrint)
70 return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter);
71 return new clang::ASTConsumer();
72 }
73private:
74 OwningPtr<OptTable> Options;
75 cl::opt<bool> ASTDump;
76 cl::opt<bool> ASTList;
77 cl::opt<bool> ASTPrint;
78 cl::opt<std::string> ASTDumpFilter;
79};
80}
81
Manuel Klimek30318e62012-04-18 07:41:50 +000082int main(int argc, const char **argv) {
Alexander Kornienko48464702012-08-13 10:50:08 +000083 ActionFactory Factory;
Alexander Kornienkodea8fba2012-07-16 12:46:48 +000084 CommandLineClangTool Tool;
85 cl::extrahelp MoreHelp(MoreHelpText);
86 Tool.initialize(argc, argv);
Alexander Kornienko48464702012-08-13 10:50:08 +000087 return Tool.run(newFrontendActionFactory(&Factory));
Manuel Klimekcb971c62012-04-04 12:07:46 +000088}