]> granicus.if.org Git - clang/commitdiff
Reverted clang-check to fully supported CommandLine Library use-case: global
authorAlexander Kornienko <alexfh@google.com>
Wed, 22 Aug 2012 20:52:52 +0000 (20:52 +0000)
committerAlexander Kornienko <alexfh@google.com>
Wed, 22 Aug 2012 20:52:52 +0000 (20:52 +0000)
static variables.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162391 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Tooling/CommandLineClangTool.h [deleted file]
include/clang/Tooling/CommonOptionsParser.h [new file with mode: 0644]
lib/Tooling/CMakeLists.txt
lib/Tooling/CommonOptionsParser.cpp [moved from lib/Tooling/CommandLineClangTool.cpp with 52% similarity]
tools/clang-check/ClangCheck.cpp

diff --git a/include/clang/Tooling/CommandLineClangTool.h b/include/clang/Tooling/CommandLineClangTool.h
deleted file mode 100644 (file)
index c29c302..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-//===- CommandLineClangTool.h - command-line clang tools driver -*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-//  This file implements the CommandLineClangTool class used to run clang
-//  tools as separate command-line applications with a consistent common
-//  interface for handling compilation database and input files.
-//
-//  It provides a common subset of command-line options, common algorithm
-//  for locating a compilation database and source files, and help messages
-//  for the basic command-line interface.
-//
-//  It creates a CompilationDatabase, initializes a ClangTool and runs a
-//  user-specified FrontendAction over all TUs in which the given files are
-//  compiled.
-//
-//  This class uses the Clang Tooling infrastructure, see
-//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
-//  for details on setting it up with LLVM source tree.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
-#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
-
-#include "llvm/Support/CommandLine.h"
-#include "clang/Tooling/CompilationDatabase.h"
-
-namespace clang {
-
-namespace tooling {
-
-class CompilationDatabase;
-class FrontendActionFactory;
-
-/// \brief A common driver for command-line Clang tools.
-///
-/// Parses a common subset of command-line arguments, locates and loads a
-/// compilation commands database, runs a tool with user-specified action. It
-/// also contains a help message for the common command-line options.
-/// An example of usage:
-/// @code
-/// int main(int argc, const char **argv) {
-///   CommandLineClangTool Tool;
-///   cl::extrahelp MoreHelp("\nMore help text...");
-///   Tool.initialize(argc, argv);
-///   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());
-/// }
-/// @endcode
-///
-class CommandLineClangTool {
-public:
-  /// Sets up command-line options and help messages.
-  /// Add your own help messages after constructing this tool.
-  CommandLineClangTool();
-
-  /// Parses command-line, initializes a compilation database.
-  /// This method exits program in case of error.
-  void initialize(int argc, const char **argv);
-
-  /// Runs a clang tool with an action created by \c ActionFactory.
-  int run(FrontendActionFactory *ActionFactory);
-
-private:
-  llvm::OwningPtr<CompilationDatabase> Compilations;
-  llvm::cl::opt<std::string> BuildPath;
-  llvm::cl::list<std::string> SourcePaths;
-  llvm::cl::extrahelp MoreHelp;
-};
-
-} // namespace tooling
-
-} // namespace clang
-
-#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H
diff --git a/include/clang/Tooling/CommonOptionsParser.h b/include/clang/Tooling/CommonOptionsParser.h
new file mode 100644 (file)
index 0000000..9eed3d3
--- /dev/null
@@ -0,0 +1,90 @@
+//===- CommonOptionsParser.h - common options for clang tools -*- C++ -*-=====//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file implements the CommonOptionsParser class used to parse common
+//  command-line options for clang tools, so that they can be run as separate
+//  command-line applications with a consistent common interface for handling
+//  compilation database and input files.
+//
+//  It provides a common subset of command-line options, common algorithm
+//  for locating a compilation database and source files, and help messages
+//  for the basic command-line interface.
+//
+//  It creates a CompilationDatabase and reads common command-line options.
+//
+//  This class uses the Clang Tooling infrastructure, see
+//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+//  for details on setting it up with LLVM source tree.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H
+#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H
+
+#include "clang/Tooling/CompilationDatabase.h"
+#include "clang/Frontend/FrontendActions.h"
+
+namespace clang {
+namespace tooling {
+
+extern const char *const CommonHelpMessage;
+
+/// \brief A parser for options common to all command-line Clang tools.
+///
+/// Parses a common subset of command-line arguments, locates and loads a
+/// compilation commands database and runs a tool with user-specified action. It
+/// also contains a help message for the common command-line options.
+///
+/// An example of usage:
+/// \code
+/// #include "llvm/Support/CommandLine.h"
+/// #include "clang/Tooling/CommonOptionsParser.h"
+///
+/// using namespace clang::tooling;
+/// using namespace llvm;
+///
+/// static cl::extrahelp CommonHelp(CommonHelpMessage);
+/// static cl::extrahelp MoreHelp("\nMore help text...");
+/// static cl:opt<bool> YourOwnOption(...);
+/// ...
+///
+/// int main(int argc, const char **argv) {
+///   CommonOptionsParser OptionsParser(argc, argv);
+///   ClangTool Tool(OptionsParser.GetCompilations(),
+///                  OptionsParser.GetSourcePathListi());
+///   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());
+/// }
+/// \endcode
+class CommonOptionsParser {
+public:
+  /// \brief Parses command-line, initializes a compilation database.
+  /// This constructor can change argc and argv contents, e.g. consume
+  /// command-line options used for creating FixedCompilationDatabase.
+  /// This constructor exits program in case of error.
+  CommonOptionsParser(int &argc, const char **argv);
+
+  /// Returns a reference to the loaded compilations database.
+  CompilationDatabase &GetCompilations() {
+    return *Compilations;
+  }
+
+  /// Returns a list of source file paths to process.
+  std::vector<std::string> GetSourcePathList() {
+    return SourcePathList;
+  }
+
+private:
+  llvm::OwningPtr<CompilationDatabase> Compilations;
+  std::vector<std::string> SourcePathList;
+};
+
+}  // namespace tooling
+}  // namespace clang
+
+#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H
index 49d3101f0e998aa841abb16c1a83bb1683779331..750dcc88a844c253f09cc8779e2dc85a45f4144e 100644 (file)
@@ -2,7 +2,7 @@ set(LLVM_LINK_COMPONENTS support)
 
 add_clang_library(clangTooling
   ArgumentsAdjusters.cpp
-  CommandLineClangTool.cpp
+  CommonOptionsParser.cpp
   CompilationDatabase.cpp
   Refactoring.cpp
   RefactoringCallbacks.cpp
similarity index 52%
rename from lib/Tooling/CommandLineClangTool.cpp
rename to lib/Tooling/CommonOptionsParser.cpp
index 8da2a335a5576339183e0fe96279f1f6f0e720d4..eefd468ac195746fe7a190aada4f92594321c3fc 100644 (file)
@@ -1,4 +1,4 @@
-//===--- CommandLineClangTool.cpp - command-line clang tools driver -------===//
+//===--- CommonOptionsParser.cpp - common options for clang tools ---------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,28 +7,31 @@
 //
 //===----------------------------------------------------------------------===//
 //
-//  This file implements the CommandLineClangTool class used to run clang
-//  tools as separate command-line applications with a consistent common
-//  interface for handling compilation database and input files.
+//  This file implements the CommonOptionsParser class used to parse common
+//  command-line options for clang tools, so that they can be run as separate
+//  command-line applications with a consistent common interface for handling
+//  compilation database and input files.
 //
 //  It provides a common subset of command-line options, common algorithm
 //  for locating a compilation database and source files, and help messages
 //  for the basic command-line interface.
 //
-//  It creates a CompilationDatabase, initializes a ClangTool and runs a
-//  user-specified FrontendAction over all TUs in which the given files are
-//  compiled.
+//  It creates a CompilationDatabase and reads common command-line options.
+//
+//  This class uses the Clang Tooling infrastructure, see
+//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+//  for details on setting it up with LLVM source tree.
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Frontend/FrontendActions.h"
-#include "clang/Tooling/CommandLineClangTool.h"
+#include "llvm/Support/CommandLine.h"
+#include "clang/Tooling/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
 
 using namespace clang::tooling;
 using namespace llvm;
 
-static const char *MoreHelpText =
+const char *const clang::tooling::CommonHelpMessage =
     "\n"
     "-p <build-path> is used to read a compile command database.\n"
     "\n"
@@ -40,26 +43,27 @@ static const char *MoreHelpText =
     "\thttp://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an\n"
     "\texample of setting up Clang Tooling on a source tree.\n"
     "\n"
-    "<source0> ... specify the paths of source files. These paths are looked\n"
-    "\tup in the compile command database. If the path of a file is absolute,\n"
-    "\tit needs to point into CMake's source tree. If the path is relative,\n"
-    "\tthe current working directory needs to be in the CMake source tree and\n"
-    "\tthe file must be in a subdirectory of the current working directory.\n"
-    "\t\"./\" prefixes in the relative files will be automatically removed,\n"
-    "\tbut the rest of a relative path must be a suffix of a path in the\n"
-    "\tcompile command database.\n"
+    "<source0> ... specify the paths of source files. These paths are\n"
+    "\tlooked up in the compile command database. If the path of a file is\n"
+    "\tabsolute, it needs to point into CMake's source tree. If the path is\n"
+    "\trelative, the current working directory needs to be in the CMake\n"
+    "\tsource tree and the file must be in a subdirectory of the current\n"
+    "\tworking directory. \"./\" prefixes in the relative files will be\n"
+    "\tautomatically removed, but the rest of a relative path must be a\n"
+    "\tsuffix of a path in the compile command database.\n"
     "\n";
 
-CommandLineClangTool::CommandLineClangTool() :
-    BuildPath("p", cl::desc("Build path"), cl::Optional),
-    SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"),
-                cl::OneOrMore),
-    MoreHelp(MoreHelpText) {
-}
+static cl::opt<std::string> BuildPath(
+    "p", cl::desc("Build path"), cl::Optional);
+
+static cl::list<std::string> SourcePaths(
+    cl::Positional, cl::desc("<source0> [... <sourceN>]"), cl::OneOrMore);
 
-void CommandLineClangTool::initialize(int argc, const char **argv) {
-  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, argv));
+CommonOptionsParser::CommonOptionsParser(int &argc, const char **argv) {
+  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc,
+                                                                   argv));
   cl::ParseCommandLineOptions(argc, argv);
+  SourcePathList = SourcePaths;
   if (!Compilations) {
     std::string ErrorMessage;
     if (!BuildPath.empty()) {
@@ -73,8 +77,3 @@ void CommandLineClangTool::initialize(int argc, const char **argv) {
       llvm::report_fatal_error(ErrorMessage);
   }
 }
-
-int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) {
-  ClangTool Tool(*Compilations, SourcePaths);
-  return Tool.run(ActionFactory);
-}
index 9e58077b5a0ea204a02929471c7e694b65b3fe71..c02c23da89293844d8a8c381d90dd27b10fe356c 100644 (file)
@@ -1,4 +1,4 @@
-//===- tools/clang-check/ClangCheck.cpp - Clang check tool ----------------===//
+//===--- tools/clang-check/ClangCheck.cpp - Clang check tool --------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
 //
 //===----------------------------------------------------------------------===//
 
-#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/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
+#include "llvm/Support/CommandLine.h"
 
 using namespace clang::driver;
 using namespace clang::tooling;
 using namespace llvm;
 
-static const char *MoreHelpText =
+static cl::extrahelp CommonHelp(CommonHelpMessage);
+static cl::extrahelp MoreHelp(
     "\tFor example, to run clang-check on all files in a subtree of the\n"
     "\tsource tree, use:\n"
     "\n"
@@ -41,26 +41,26 @@ static const char *MoreHelpText =
     "\n"
     "\tNote, that path/in/subtree and current directory should follow the\n"
     "\trules described above.\n"
-    "\n";
+    "\n"
+);
+
+static OwningPtr<OptTable> Options(createDriverOptTable());
+static cl::opt<bool> ASTDump(
+    "ast-dump",
+    cl::desc(Options->getOptionHelpText(options::OPT_ast_dump)));
+static cl::opt<bool> ASTList(
+    "ast-list",
+    cl::desc(Options->getOptionHelpText(options::OPT_ast_list)));
+static cl::opt<bool> ASTPrint(
+    "ast-print",
+    cl::desc(Options->getOptionHelpText(options::OPT_ast_print)));
+static cl::opt<std::string> ASTDumpFilter(
+    "ast-dump-filter",
+    cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter)));
 
 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();
@@ -70,19 +70,13 @@ public:
       return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter);
     return new clang::ASTConsumer();
   }
-private:
-  OwningPtr<OptTable> Options;
-  cl::opt<bool> ASTDump;
-  cl::opt<bool> ASTList;
-  cl::opt<bool> ASTPrint;
-  cl::opt<std::string> ASTDumpFilter;
 };
 }
 
 int main(int argc, const char **argv) {
   ActionFactory Factory;
-  CommandLineClangTool Tool;
-  cl::extrahelp MoreHelp(MoreHelpText);
-  Tool.initialize(argc, argv);
+  CommonOptionsParser OptionsParser(argc, argv);
+  ClangTool Tool(OptionsParser.GetCompilations(),
+                 OptionsParser.GetSourcePathList());
   return Tool.run(newFrontendActionFactory(&Factory));
 }