1 //===- CommonOptionsParser.h - common options for clang tools -*- C++ -*-=====// 2 // 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 the CommonOptionsParser class used to parse common 11 // command-line options for clang tools, so that they can be run as separate 12 // command-line applications with a consistent common interface for handling 13 // compilation database and input files. 14 // 15 // It provides a common subset of command-line options, common algorithm 16 // for locating a compilation database and source files, and help messages 17 // for the basic command-line interface. 18 // 19 // It creates a CompilationDatabase and reads common command-line options. 20 // 21 // This class uses the Clang Tooling infrastructure, see 22 // http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html 23 // for details on setting it up with LLVM source tree. 24 // 25 //===----------------------------------------------------------------------===// 26 27 #ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 28 #define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 29 30 #include "clang/Tooling/CompilationDatabase.h" 31 #include "llvm/Support/CommandLine.h" 32 33 namespace clang { 34 namespace tooling { 35 /// \brief A parser for options common to all command-line Clang tools. 36 /// 37 /// Parses a common subset of command-line arguments, locates and loads a 38 /// compilation commands database and runs a tool with user-specified action. It 39 /// also contains a help message for the common command-line options. 40 /// 41 /// An example of usage: 42 /// \code 43 /// #include "clang/Frontend/FrontendActions.h" 44 /// #include "clang/Tooling/CommonOptionsParser.h" 45 /// #include "llvm/Support/CommandLine.h" 46 /// 47 /// using namespace clang::tooling; 48 /// using namespace llvm; 49 /// 50 /// static cl::OptionCategory MyToolCategory("My tool options"); 51 /// static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage); 52 /// static cl::extrahelp MoreHelp("\nMore help text..."); 53 /// static cl::opt<bool> YourOwnOption(...); 54 /// ... 55 /// 56 /// int main(int argc, const char **argv) { 57 /// CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); 58 /// ClangTool Tool(OptionsParser.getCompilations(), 59 /// OptionsParser.getSourcePathListi()); 60 /// return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>()); 61 /// } 62 /// \endcode 63 class CommonOptionsParser { 64 public: 65 /// \brief Parses command-line, initializes a compilation database. 66 /// 67 /// This constructor can change argc and argv contents, e.g. consume 68 /// command-line options used for creating FixedCompilationDatabase. 69 /// 70 /// All options not belonging to \p Category become hidden. 71 /// 72 /// This constructor exits program in case of error. 73 CommonOptionsParser(int &argc, const char **argv, 74 llvm::cl::OptionCategory &Category, 75 const char *Overview = nullptr); 76 77 /// Returns a reference to the loaded compilations database. getCompilations()78 CompilationDatabase &getCompilations() { 79 return *Compilations; 80 } 81 82 /// Returns a list of source file paths to process. getSourcePathList()83 std::vector<std::string> getSourcePathList() { 84 return SourcePathList; 85 } 86 87 static const char *const HelpMessage; 88 89 private: 90 std::unique_ptr<CompilationDatabase> Compilations; 91 std::vector<std::string> SourcePathList; 92 }; 93 94 } // namespace tooling 95 } // namespace clang 96 97 #endif // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 98