Home | History | Annotate | Line # | Download | only in Tooling
      1 //===- CommonOptionsParser.h - common options for clang tools -*- C++ -*-=====//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 //  This file implements the CommonOptionsParser class used to parse common
     10 //  command-line options for clang tools, so that they can be run as separate
     11 //  command-line applications with a consistent common interface for handling
     12 //  compilation database and input files.
     13 //
     14 //  It provides a common subset of command-line options, common algorithm
     15 //  for locating a compilation database and source files, and help messages
     16 //  for the basic command-line interface.
     17 //
     18 //  It creates a CompilationDatabase and reads common command-line options.
     19 //
     20 //  This class uses the Clang Tooling infrastructure, see
     21 //    http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
     22 //  for details on setting it up with LLVM source tree.
     23 //
     24 //===----------------------------------------------------------------------===//
     25 
     26 #ifndef LLVM_CLANG_TOOLING_COMMONOPTIONSPARSER_H
     27 #define LLVM_CLANG_TOOLING_COMMONOPTIONSPARSER_H
     28 
     29 #include "clang/Tooling/ArgumentsAdjusters.h"
     30 #include "clang/Tooling/CompilationDatabase.h"
     31 #include "llvm/Support/CommandLine.h"
     32 #include "llvm/Support/Error.h"
     33 
     34 namespace clang {
     35 namespace tooling {
     36 /// A parser for options common to all command-line Clang tools.
     37 ///
     38 /// Parses a common subset of command-line arguments, locates and loads a
     39 /// compilation commands database and runs a tool with user-specified action. It
     40 /// also contains a help message for the common command-line options.
     41 ///
     42 /// An example of usage:
     43 /// \code
     44 /// #include "clang/Frontend/FrontendActions.h"
     45 /// #include "clang/Tooling/CommonOptionsParser.h"
     46 /// #include "clang/Tooling/Tooling.h"
     47 /// #include "llvm/Support/CommandLine.h"
     48 ///
     49 /// using namespace clang::tooling;
     50 /// using namespace llvm;
     51 ///
     52 /// static cl::OptionCategory MyToolCategory("My tool options");
     53 /// static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
     54 /// static cl::extrahelp MoreHelp("\nMore help text...\n");
     55 /// static cl::opt<bool> YourOwnOption(...);
     56 /// ...
     57 ///
     58 /// int main(int argc, const char **argv) {
     59 ///   CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
     60 ///   ClangTool Tool(OptionsParser.getCompilations(),
     61 ///                  OptionsParser.getSourcePathList());
     62 ///   return Tool.run(newFrontendActionFactory<SyntaxOnlyAction>().get());
     63 /// }
     64 /// \endcode
     65 class CommonOptionsParser {
     66 
     67 protected:
     68   /// Parses command-line, initializes a compilation database.
     69   ///
     70   /// This constructor can change argc and argv contents, e.g. consume
     71   /// command-line options used for creating FixedCompilationDatabase.
     72   ///
     73   /// All options not belonging to \p Category become hidden.
     74   ///
     75   /// It also allows calls to set the required number of positional parameters.
     76   CommonOptionsParser(
     77       int &argc, const char **argv, llvm::cl::OptionCategory &Category,
     78       llvm::cl::NumOccurrencesFlag OccurrencesFlag = llvm::cl::OneOrMore,
     79       const char *Overview = nullptr);
     80 
     81 public:
     82   /// A factory method that is similar to the above constructor, except
     83   /// this returns an error instead exiting the program on error.
     84   static llvm::Expected<CommonOptionsParser>
     85   create(int &argc, const char **argv, llvm::cl::OptionCategory &Category,
     86          llvm::cl::NumOccurrencesFlag OccurrencesFlag = llvm::cl::OneOrMore,
     87          const char *Overview = nullptr);
     88 
     89   /// Returns a reference to the loaded compilations database.
     90   CompilationDatabase &getCompilations() {
     91     return *Compilations;
     92   }
     93 
     94   /// Returns a list of source file paths to process.
     95   const std::vector<std::string> &getSourcePathList() const {
     96     return SourcePathList;
     97   }
     98 
     99   /// Returns the argument adjuster calculated from "--extra-arg" and
    100   //"--extra-arg-before" options.
    101   ArgumentsAdjuster getArgumentsAdjuster() { return Adjuster; }
    102 
    103   static const char *const HelpMessage;
    104 
    105 private:
    106   CommonOptionsParser() = default;
    107 
    108   llvm::Error init(int &argc, const char **argv,
    109                    llvm::cl::OptionCategory &Category,
    110                    llvm::cl::NumOccurrencesFlag OccurrencesFlag,
    111                    const char *Overview);
    112 
    113   std::unique_ptr<CompilationDatabase> Compilations;
    114   std::vector<std::string> SourcePathList;
    115   ArgumentsAdjuster Adjuster;
    116 };
    117 
    118 class ArgumentsAdjustingCompilations : public CompilationDatabase {
    119 public:
    120   ArgumentsAdjustingCompilations(
    121       std::unique_ptr<CompilationDatabase> Compilations)
    122       : Compilations(std::move(Compilations)) {}
    123 
    124   void appendArgumentsAdjuster(ArgumentsAdjuster Adjuster);
    125 
    126   std::vector<CompileCommand>
    127   getCompileCommands(StringRef FilePath) const override;
    128 
    129   std::vector<std::string> getAllFiles() const override;
    130 
    131   std::vector<CompileCommand> getAllCompileCommands() const override;
    132 
    133 private:
    134   std::unique_ptr<CompilationDatabase> Compilations;
    135   std::vector<ArgumentsAdjuster> Adjusters;
    136 
    137   std::vector<CompileCommand>
    138   adjustCommands(std::vector<CompileCommand> Commands) const;
    139 };
    140 
    141 }  // namespace tooling
    142 }  // namespace clang
    143 
    144 #endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H
    145