1d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko//===- CommonOptionsParser.h - common options for clang tools -*- C++ -*-=====// 2d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 3d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// The LLVM Compiler Infrastructure 4d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 5d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// This file is distributed under the University of Illinois Open Source 6d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// License. See LICENSE.TXT for details. 7d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 8d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko//===----------------------------------------------------------------------===// 9d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 10d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// This file implements the CommonOptionsParser class used to parse common 11d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// command-line options for clang tools, so that they can be run as separate 12d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// command-line applications with a consistent common interface for handling 13d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// compilation database and input files. 14d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 15d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// It provides a common subset of command-line options, common algorithm 16d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// for locating a compilation database and source files, and help messages 17d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// for the basic command-line interface. 18d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 19d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// It creates a CompilationDatabase and reads common command-line options. 20d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 21d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// This class uses the Clang Tooling infrastructure, see 22d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html 23d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// for details on setting it up with LLVM source tree. 24d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko// 25d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko//===----------------------------------------------------------------------===// 26d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 27d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 28d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 29d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 30d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#include "clang/Tooling/CompilationDatabase.h" 31d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 32d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienkonamespace clang { 33d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienkonamespace tooling { 34d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// \brief A parser for options common to all command-line Clang tools. 35d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// 36d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// Parses a common subset of command-line arguments, locates and loads a 37d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// compilation commands database and runs a tool with user-specified action. It 38d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// also contains a help message for the common command-line options. 39d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// 40d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// An example of usage: 41d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// \code 426fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienko/// #include "clang/Frontend/FrontendActions.h" 43d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// #include "clang/Tooling/CommonOptionsParser.h" 446fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienko/// #include "llvm/Support/CommandLine.h" 45d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// 46d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// using namespace clang::tooling; 47d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// using namespace llvm; 48d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// 496fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienko/// static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage); 50d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// static cl::extrahelp MoreHelp("\nMore help text..."); 51d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// static cl:opt<bool> YourOwnOption(...); 52d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// ... 53d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// 54d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// int main(int argc, const char **argv) { 55d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// CommonOptionsParser OptionsParser(argc, argv); 56d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// ClangTool Tool(OptionsParser.GetCompilations(), 57d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// OptionsParser.GetSourcePathListi()); 58d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>()); 59d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// } 60d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko/// \endcode 61d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienkoclass CommonOptionsParser { 62d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienkopublic: 63d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// \brief Parses command-line, initializes a compilation database. 64d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// This constructor can change argc and argv contents, e.g. consume 65d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// command-line options used for creating FixedCompilationDatabase. 66d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// This constructor exits program in case of error. 67d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko CommonOptionsParser(int &argc, const char **argv); 68d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 69d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// Returns a reference to the loaded compilations database. 70d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko CompilationDatabase &GetCompilations() { 71d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko return *Compilations; 72d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko } 73d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 74d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko /// Returns a list of source file paths to process. 75d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko std::vector<std::string> GetSourcePathList() { 76d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko return SourcePathList; 77d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko } 78d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 796fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienko static const char *const HelpMessage; 806fbe982bb487931feb3f1ceb9eec8f7f1961393aAlexander Kornienko 81d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienkoprivate: 82d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko llvm::OwningPtr<CompilationDatabase> Compilations; 83d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko std::vector<std::string> SourcePathList; 84d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko}; 85d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 86d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko} // namespace tooling 87d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko} // namespace clang 88d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko 89d7166b01df14173b7f26620c5a89f9934a968f85Alexander Kornienko#endif // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H 90