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