[cfe-commits] r160265 - in /cfe/trunk: include/clang/Tooling/CommandLineClangTool.h lib/Tooling/CMakeLists.txt lib/Tooling/CommandLineClangTool.cpp test/CMakeLists.txt test/Tooling/clang-ast-dump.cpp tools/CMakeLists.txt tools/Makefile tools/clang-ast-dump/ tools/clang-ast-dump/CMakeLists.txt tools/clang-ast-dump/ClangASTDump.cpp tools/clang-ast-dump/Makefile tools/clang-check/ClangCheck.cpp

Douglas Gregor dgregor at apple.com
Mon Jul 16 22:22:22 PDT 2012


On Jul 16, 2012, at 5:46 AM, Alexander Kornienko <alexfh at google.com> wrote:

> Author: alexfh
> Date: Mon Jul 16 07:46:48 2012
> New Revision: 160265
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=160265&view=rev
> Log:
> The new clang-ast-dump tool for selective AST dumping. Moved common command-line tool stuff to CommandLineClangTool

I don't think this belongs in the Clang repository because:

	1) It's built on a *debugging* option, the XML dumper, which is neither actively maintained nor complete enough to build any tool upon
	2) It provides no value for users of Clang
	3) It provides very little value for developers of Clang tools, since it does little more than clang + grep
	4) It fails nearly all of the criteria for a Clang extension outlined in http://clang.llvm.org/get_involved.html

I'll be happy to hear opinions to the contrary (Manuel?), but barring some killer argument for this feature, I'd like it reverted.

Sorry I couldn't chime in during the review; I just returned from a vacation during which I was not reading cfe-commits.

	- Doug

> Added:
>    cfe/trunk/include/clang/Tooling/CommandLineClangTool.h
>    cfe/trunk/lib/Tooling/CommandLineClangTool.cpp
>    cfe/trunk/test/Tooling/clang-ast-dump.cpp
>    cfe/trunk/tools/clang-ast-dump/
>    cfe/trunk/tools/clang-ast-dump/CMakeLists.txt
>    cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp
>    cfe/trunk/tools/clang-ast-dump/Makefile
> Modified:
>    cfe/trunk/lib/Tooling/CMakeLists.txt
>    cfe/trunk/test/CMakeLists.txt
>    cfe/trunk/tools/CMakeLists.txt
>    cfe/trunk/tools/Makefile
>    cfe/trunk/tools/clang-check/ClangCheck.cpp
> 
> Added: cfe/trunk/include/clang/Tooling/CommandLineClangTool.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/CommandLineClangTool.h?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/include/clang/Tooling/CommandLineClangTool.h (added)
> +++ cfe/trunk/include/clang/Tooling/CommandLineClangTool.h Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,80 @@
> +//===- 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
> 
> Modified: cfe/trunk/lib/Tooling/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Tooling/CMakeLists.txt (original)
> +++ cfe/trunk/lib/Tooling/CMakeLists.txt Mon Jul 16 07:46:48 2012
> @@ -1,6 +1,7 @@
> set(LLVM_LINK_COMPONENTS support)
> 
> add_clang_library(clangTooling
> +  CommandLineClangTool.cpp
>   CompilationDatabase.cpp
>   Refactoring.cpp
>   Tooling.cpp
> 
> Added: cfe/trunk/lib/Tooling/CommandLineClangTool.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CommandLineClangTool.cpp?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Tooling/CommandLineClangTool.cpp (added)
> +++ cfe/trunk/lib/Tooling/CommandLineClangTool.cpp Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,80 @@
> +//===--- CommandLineClangTool.cpp - command-line clang tools driver -------===//
> +//
> +//                     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.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Frontend/FrontendActions.h"
> +#include "clang/Tooling/CommandLineClangTool.h"
> +#include "clang/Tooling/Tooling.h"
> +
> +using namespace clang::tooling;
> +using namespace llvm;
> +
> +static const char *MoreHelpText =
> +    "\n"
> +    "-p <build-path> is used to read a compile command database.\n"
> +    "\n"
> +    "\tFor example, it can be a CMake build directory in which a file named\n"
> +    "\tcompile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n"
> +    "\tCMake option to get this output). When no build path is specified,\n"
> +    "\tclang-check will attempt to locate it automatically using all parent\n"
> +    "\tpaths of the first input file. See:\n"
> +    "\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"
> +    "\n";
> +
> +CommandLineClangTool::CommandLineClangTool() :
> +    BuildPath("p", cl::desc("Build path"), cl::Optional),
> +    SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"),
> +                cl::OneOrMore),
> +    MoreHelp(MoreHelpText) {
> +}
> +
> +void CommandLineClangTool::initialize(int argc, const char **argv) {
> +  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, argv));
> +  cl::ParseCommandLineOptions(argc, argv);
> +  if (!Compilations) {
> +    std::string ErrorMessage;
> +    if (!BuildPath.empty()) {
> +      Compilations.reset(CompilationDatabase::autoDetectFromDirectory(
> +                              BuildPath, ErrorMessage));
> +    } else {
> +      Compilations.reset(CompilationDatabase::autoDetectFromSource(
> +                              SourcePaths[0], ErrorMessage));
> +    }
> +    if (!Compilations)
> +      llvm::report_fatal_error(ErrorMessage);
> +  }
> +}
> +
> +int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) {
> +  ClangTool Tool(*Compilations, SourcePaths);
> +  return Tool.run(ActionFactory);
> +}
> 
> Modified: cfe/trunk/test/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
> ==============================================================================
> --- cfe/trunk/test/CMakeLists.txt (original)
> +++ cfe/trunk/test/CMakeLists.txt Mon Jul 16 07:46:48 2012
> @@ -31,7 +31,7 @@
>   set(CLANG_TEST_DEPS
>     clang clang-headers
>     c-index-test diagtool arcmt-test c-arcmt-test
> -    clang-check
> +    clang-check clang-ast-dump
>     llvm-dis llc opt FileCheck count not
>     )
>   set(CLANG_TEST_PARAMS
> @@ -80,7 +80,7 @@
>       COMMENT "Running Clang regression tests"
>       DEPENDS clang clang-headers
>               c-index-test diagtool arcmt-test c-arcmt-test
> -              clang-check
> +              clang-check clang-ast-dump
>       )
>     set_target_properties(check-clang PROPERTIES FOLDER "Clang tests")
>   endif()
> 
> Added: cfe/trunk/test/Tooling/clang-ast-dump.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-ast-dump.cpp?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/test/Tooling/clang-ast-dump.cpp (added)
> +++ cfe/trunk/test/Tooling/clang-ast-dump.cpp Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,22 @@
> +// RUN: clang-ast-dump "%t/test.cpp" -f test_namespace::TheClass::theMethod -- -c 2>&1|FileCheck %s
> +// FIXME: Make the above easier.
> +
> +// CHECK: <CXXMethod ptr="0x{{[0-9a-f]+}}" name="theMethod" prototype="true">
> +// CHECK:  <ParmVar ptr="0x{{[0-9a-f]+}}" name="x" initstyle="c">
> +// CHECK: (CompoundStmt
> +// CHECK-NEXT:   (ReturnStmt
> +// CHECK-NEXT:     (BinaryOperator
> +
> +namespace test_namespace {
> +
> +class TheClass {
> +public:
> +  int theMethod(int x) {
> +    return x + x;
> +  }
> +};
> +
> +}
> +
> +// FIXME: This is incompatible to -fms-compatibility.
> +// XFAIL: win32
> 
> Modified: cfe/trunk/tools/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff
> ==============================================================================
> --- cfe/trunk/tools/CMakeLists.txt (original)
> +++ cfe/trunk/tools/CMakeLists.txt Mon Jul 16 07:46:48 2012
> @@ -5,3 +5,4 @@
> add_subdirectory(diagtool)
> add_subdirectory(driver)
> add_subdirectory(clang-check)
> +add_subdirectory(clang-ast-dump)
> 
> Modified: cfe/trunk/tools/Makefile
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/Makefile?rev=160265&r1=160264&r2=160265&view=diff
> ==============================================================================
> --- cfe/trunk/tools/Makefile (original)
> +++ cfe/trunk/tools/Makefile Mon Jul 16 07:46:48 2012
> @@ -9,7 +9,7 @@
> 
> CLANG_LEVEL := ..
> DIRS := driver libclang c-index-test arcmt-test c-arcmt-test diagtool \
> -        clang-check
> +        clang-check clang-ast-dump
> 
> include $(CLANG_LEVEL)/../../Makefile.config
> 
> 
> Added: cfe/trunk/tools/clang-ast-dump/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/CMakeLists.txt?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/tools/clang-ast-dump/CMakeLists.txt (added)
> +++ cfe/trunk/tools/clang-ast-dump/CMakeLists.txt Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,8 @@
> +add_clang_executable(clang-ast-dump
> +  ClangASTDump.cpp
> +  )
> +
> +target_link_libraries(clang-ast-dump
> +  clangTooling
> +  clangBasic
> +  )
> 
> Added: cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp (added)
> +++ cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,141 @@
> +//===- tools/clang-ast-dump/ClangASTDump.cpp - Clang AST Dump tool --------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +//  This file implements a clang-ast-dump tool that dumps specified parts
> +//  of an AST of a number of translation units.
> +//
> +//  Run with '-help' for details.
> +//
> +//  This tool uses the Clang Tooling infrastructure, see
> +//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
> +//  for details on setting it up with LLVM source tree.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/Support/CommandLine.h"
> +#include "clang/AST/ASTContext.h"
> +#include "clang/AST/ASTConsumer.h"
> +#include "clang/AST/RecursiveASTVisitor.h"
> +#include "clang/Frontend/FrontendActions.h"
> +#include "clang/Tooling/CommandLineClangTool.h"
> +#include "clang/Tooling/Tooling.h"
> +
> +using namespace clang::tooling;
> +using namespace llvm;
> +
> +cl::opt<std::string> FilterString(
> +  "f",
> +  cl::desc("Filter string"),
> +  cl::Optional);
> +
> +cl::opt<bool> ListAll(
> +  "l",
> +  cl::desc("List all filterable nodes"),
> +  cl::init(false),
> +  cl::Optional);
> +
> +static const char *MoreHelpText =
> +    "-f <filter-string> can be used to dump only AST declaration nodes having\n"
> +    "\ta certain substring in a qualified name.\n"
> +    "\n"
> +    "-l \tlists qualified names of all filterable declaration nodes.\n"
> +    "\n";
> +
> +namespace {
> +
> +using namespace clang;
> +
> +class SelectiveDumpVisitor :
> +     public RecursiveASTVisitor<SelectiveDumpVisitor> {
> +  typedef RecursiveASTVisitor<SelectiveDumpVisitor> base;
> +public:
> +  SelectiveDumpVisitor(const std::string &FilterString, bool ListAll)
> +      : FilterString(FilterString), ListAll(ListAll) {}
> +
> +  ASTConsumer* newASTConsumer() {
> +    return new DumpConsumer(this);
> +  }
> +
> +  bool shouldWalkTypesOfTypeLocs() const { return false; }
> +
> +  void Run(TranslationUnitDecl *D) {
> +    if (ListAll) {
> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
> +          "Listing all filterable nodes:\n";
> +      llvm::outs().resetColor();
> +      TraverseDecl(D);
> +      return;
> +    }
> +
> +    if (FilterString.empty()) {
> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
> +          "Dumping translation unit:\n";
> +      llvm::outs().resetColor();
> +      D->dumpXML(llvm::outs());
> +      return;
> +    }
> +
> +    TraverseDecl(D);
> +  }
> +
> +  bool TraverseDecl(Decl *D) {
> +    if (ListAll) {
> +      std::string Name = getName(D);
> +      if (!Name.empty())
> +        llvm::outs() << Name << "\n";
> +      return base::TraverseDecl(D);
> +    }
> +
> +    if (filterMatches(D)) {
> +      llvm::outs().changeColor(llvm::raw_ostream::BLUE) <<
> +          "Dumping " << getName(D) << ":\n";
> +      llvm::outs().resetColor();
> +      D->dumpXML(llvm::outs());
> +      return true;
> +    }
> +    return base::TraverseDecl(D);
> +  }
> +
> +private:
> +  std::string getName(Decl *D) {
> +    if (isa<NamedDecl>(D))
> +      return cast<NamedDecl>(D)->getQualifiedNameAsString();
> +    return "";
> +  }
> +  bool filterMatches(Decl *D) {
> +    return getName(D).find(FilterString) != std::string::npos;
> +  }
> +
> +  class DumpConsumer : public ASTConsumer {
> +  public:
> +    DumpConsumer(SelectiveDumpVisitor *Visitor) : Visitor(Visitor) {}
> +
> +    virtual void HandleTranslationUnit(ASTContext &Context) {
> +      Visitor->Context = &Context;
> +      Visitor->Run(Context.getTranslationUnitDecl());
> +    }
> +
> +  private:
> +    SelectiveDumpVisitor *Visitor;
> +  };
> +
> +  ASTContext *Context;
> +  std::string FilterString;
> +  bool ListAll;
> +};
> +
> +} // namespace
> +
> +int main(int argc, const char **argv) {
> +  CommandLineClangTool Tool;
> +  cl::extrahelp MoreHelp(MoreHelpText);
> +  Tool.initialize(argc, argv);
> +  SelectiveDumpVisitor Dumper(FilterString, ListAll);
> +  return Tool.run(newFrontendActionFactory(&Dumper));
> +}
> 
> Added: cfe/trunk/tools/clang-ast-dump/Makefile
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/Makefile?rev=160265&view=auto
> ==============================================================================
> --- cfe/trunk/tools/clang-ast-dump/Makefile (added)
> +++ cfe/trunk/tools/clang-ast-dump/Makefile Mon Jul 16 07:46:48 2012
> @@ -0,0 +1,23 @@
> +##===- tools/clang-check/Makefile --------------------------*- Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +
> +CLANG_LEVEL := ../..
> +
> +TOOLNAME = clang-ast-dump
> +NO_INSTALL = 1
> +
> +# No plugins, optimize startup time.
> +TOOL_NO_EXPORTS = 1
> +
> +LINK_COMPONENTS := support mc
> +USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \
> +           clangTooling.a clangParse.a clangSema.a clangAnalysis.a \
> +           clangEdit.a clangAST.a clangLex.a clangBasic.a
> +
> +include $(CLANG_LEVEL)/Makefile
> 
> Modified: cfe/trunk/tools/clang-check/ClangCheck.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-check/ClangCheck.cpp?rev=160265&r1=160264&r2=160265&view=diff
> ==============================================================================
> --- cfe/trunk/tools/clang-check/ClangCheck.cpp (original)
> +++ cfe/trunk/tools/clang-check/ClangCheck.cpp Mon Jul 16 07:46:48 2012
> @@ -1,4 +1,4 @@
> -//===- examples/Tooling/ClangCheck.cpp - Clang check tool -----------------===//
> +//===- tools/clang-check/ClangCheck.cpp - Clang check tool ----------------===//
> //
> //                     The LLVM Compiler Infrastructure
> //
> @@ -10,75 +10,37 @@
> //  This file implements a clang-check tool that runs the
> //  clang::SyntaxOnlyAction over a number of translation units.
> //
> +//  This tool uses the Clang Tooling infrastructure, see
> +//    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
> +//  for details on setting it up with LLVM source tree.
> +//
> //===----------------------------------------------------------------------===//
> 
> #include "llvm/Support/CommandLine.h"
> #include "clang/Frontend/FrontendActions.h"
> -#include "clang/Tooling/CompilationDatabase.h"
> +#include "clang/Tooling/CommandLineClangTool.h"
> #include "clang/Tooling/Tooling.h"
> 
> using namespace clang::tooling;
> using namespace llvm;
> 
> -cl::opt<std::string> BuildPath(
> -  "p",
> -  cl::desc("<build-path>"),
> -  cl::Optional);
> -
> -cl::list<std::string> SourcePaths(
> -  cl::Positional,
> -  cl::desc("<source0> [... <sourceN>]"),
> -  cl::OneOrMore);
> -
> -static cl::extrahelp MoreHelp(
> -    "\n"
> -    "<build-path> is used to read a compile command database.\n"
> -    "\n"
> -    "For example, it can be a CMake build directory in which a file named\n"
> -    "compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n"
> -    "CMake option to get this output). When no build path is specified,\n"
> -    "clang-check will attempt to locate it automatically using all parent\n"
> -    "paths of the first input file.\n"
> -    "\n"
> -    "<source0> ... specify the paths of source files. These paths are looked\n"
> -    "up in the compile command database. If the path of a file is absolute,\n"
> -    "it needs to point into CMake's source tree. If the path is relative,\n"
> -    "the current working directory needs to be in the CMake source tree and\n"
> -    "the file must be in a subdirectory of the current working directory.\n"
> -    "\"./\" prefixes in the relative files will be automatically removed,\n"
> -    "but the rest of a relative path must be a suffix of a path in the\n"
> -    "compile command database.\n"
> -    "\n"
> -    "For example, to use clang-check on all files in a subtree of the source\n"
> -    "tree, use:\n"
> -    "\n"
> -    "  find path/in/subtree -name '*.cpp'|xargs clang-check\n"
> +static const char *MoreHelpText =
> +    "\tFor example, to run clang-check on all files in a subtree of the\n"
> +    "\tsource tree, use:\n"
>     "\n"
> -    "or using a specific build path:\n"
> +    "\t  find path/in/subtree -name '*.cpp'|xargs clang-check\n"
>     "\n"
> -    "  find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
> +    "\tor using a specific build path:\n"
>     "\n"
> -    "Note, that path/in/subtree and current directory should follow the\n"
> -    "rules described above.\n"
> +    "\t  find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n"
>     "\n"
> -);
> +    "\tNote, that path/in/subtree and current directory should follow the\n"
> +    "\trules described above.\n"
> +    "\n";
> 
> int main(int argc, const char **argv) {
> -  llvm::OwningPtr<CompilationDatabase> Compilations(
> -    FixedCompilationDatabase::loadFromCommandLine(argc, argv));
> -  cl::ParseCommandLineOptions(argc, argv);
> -  if (!Compilations) {
> -    std::string ErrorMessage;
> -    if (!BuildPath.empty()) {
> -      Compilations.reset(
> -         CompilationDatabase::autoDetectFromDirectory(BuildPath, ErrorMessage));
> -    } else {
> -      Compilations.reset(CompilationDatabase::autoDetectFromSource(
> -          SourcePaths[0], ErrorMessage));
> -    }
> -    if (!Compilations)
> -      llvm::report_fatal_error(ErrorMessage);
> -  }
> -  ClangTool Tool(*Compilations, SourcePaths);
> +  CommandLineClangTool Tool;
> +  cl::extrahelp MoreHelp(MoreHelpText);
> +  Tool.initialize(argc, argv);
>   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());
> }
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list