1cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//===--- Tooling.h - Framework for standalone Clang tools -------*- C++ -*-===//
2cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
3cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//                     The LLVM Compiler Infrastructure
4cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
5cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek// This file is distributed under the University of Illinois Open Source
6cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek// License. See LICENSE.TXT for details.
7cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
8cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//===----------------------------------------------------------------------===//
9cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
10cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  This file implements functions to run clang tools standalone instead
11cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  of running them as a plugin.
12cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
13cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  A ClangTool is initialized with a CompilationDatabase and a set of files
14cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  to run over. The tool will then run a user-specified FrontendAction over
15cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  all TUs in which the given files are compiled.
16cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
17cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  It is also possible to run a FrontendAction over a snippet of code by
18295413422d0c8d70e8861b71f7b622871ba1ba44Manuel Klimek//  calling runToolOnCode, which is useful for unit testing.
19cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
20cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  Applications that need more fine grained control over how to run
21cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  multiple FrontendActions over code can use ToolInvocation.
22cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
23cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  Example tools:
24cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  - running clang -fsyntax-only over source code from an editor to get
25cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//    fast syntax checks
26cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//  - running match/replace tools over C++ code
27cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//
28cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek//===----------------------------------------------------------------------===//
29cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
30cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#ifndef LLVM_CLANG_TOOLING_TOOLING_H
31cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#define LLVM_CLANG_TOOLING_TOOLING_H
32cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
33cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Basic/FileManager.h"
34cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Basic/LLVM.h"
35cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Driver/Util.h"
36e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek#include "clang/Frontend/FrontendAction.h"
37a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan#include "clang/Tooling/ArgumentsAdjusters.h"
3800f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek#include "clang/Tooling/CompilationDatabase.h"
3930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/StringMap.h"
4030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/Twine.h"
41cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include <string>
42cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include <vector>
43cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
44cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace clang {
45cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
46cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace driver {
47cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass Compilation;
48cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace driver
49cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
50cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass CompilerInvocation;
51cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass SourceManager;
52cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass FrontendAction;
53cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
54cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace tooling {
55cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
56cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Interface to generate clang::FrontendActions.
57cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass FrontendActionFactory {
58cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekpublic:
59cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  virtual ~FrontendActionFactory();
60cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
61cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Returns a new clang::FrontendAction.
62cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
63cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// The caller takes ownership of the returned action.
64cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  virtual clang::FrontendAction *create() = 0;
65cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
66cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
67cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Returns a new FrontendActionFactory for a given type.
68cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
69cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// T must extend clang::FrontendAction.
70cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
71cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// Example:
72cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// FrontendActionFactory *Factory =
73cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///   newFrontendActionFactory<clang::SyntaxOnlyAction>();
74cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename T>
75cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory();
76cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
779fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek/// \brief Called at the end of each source file when used with
789fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek/// \c newFrontendActionFactory.
799fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimekclass EndOfSourceFileCallback {
809fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimekpublic:
819fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek  virtual ~EndOfSourceFileCallback() {}
829fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek  virtual void run() = 0;
839fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek};
849fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek
85cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Returns a new FrontendActionFactory for any type that provides an
86e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek/// implementation of newASTConsumer().
87cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
88e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek/// FactoryT must implement: ASTConsumer *newASTConsumer().
89cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
90cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// Example:
91e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek/// struct ProvidesASTConsumers {
92e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek///   clang::ASTConsumer *newASTConsumer();
93cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// } Factory;
94cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// FrontendActionFactory *FactoryAdapter =
95cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///   newFrontendActionFactory(&Factory);
96cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename FactoryT>
97fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperinline FrontendActionFactory *newFrontendActionFactory(
989fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback = NULL);
99cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
100cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag.
101cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
102cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param ToolAction The action to run over the code.
103cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param Code C++ code.
104cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param FileName The file name which 'Code' will be mapped as.
105cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
106cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \return - True if 'ToolAction' was successfully executed.
107cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekbool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code,
108cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                   const Twine &FileName = "input.cc");
109cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
110566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag and
111566698851d76416129cd20ceea02bdd697934c5cNico Weber///        with additional other flags.
112566698851d76416129cd20ceea02bdd697934c5cNico Weber///
113566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \param ToolAction The action to run over the code.
114566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \param Code C++ code.
115566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \param Args Additional flags to pass on.
116566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \param FileName The file name which 'Code' will be mapped as.
117566698851d76416129cd20ceea02bdd697934c5cNico Weber///
118566698851d76416129cd20ceea02bdd697934c5cNico Weber/// \return - True if 'ToolAction' was successfully executed.
119566698851d76416129cd20ceea02bdd697934c5cNico Weberbool runToolOnCodeWithArgs(clang::FrontendAction *ToolAction, const Twine &Code,
120566698851d76416129cd20ceea02bdd697934c5cNico Weber                           const std::vector<std::string> &Args,
121566698851d76416129cd20ceea02bdd697934c5cNico Weber                           const Twine &FileName = "input.cc");
122566698851d76416129cd20ceea02bdd697934c5cNico Weber
123cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Utility to run a FrontendAction in a single clang invocation.
124cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass ToolInvocation {
125cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek public:
126cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Create a tool invocation.
127cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
12830c009b5fa4d22ddabfe6ad6ba4158a664a4bd83Alexander Kornienko  /// \param CommandLine The command line arguments to clang. Note that clang
12930c009b5fa4d22ddabfe6ad6ba4158a664a4bd83Alexander Kornienko  /// uses its binary name (CommandLine[0]) to locate its builtin headers.
13030c009b5fa4d22ddabfe6ad6ba4158a664a4bd83Alexander Kornienko  /// Callers have to ensure that they are installed in a compatible location
13130c009b5fa4d22ddabfe6ad6ba4158a664a4bd83Alexander Kornienko  /// (see clang driver implementation) or mapped in via mapVirtualFile.
132cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param ToolAction The action to be executed. Class takes ownership.
133cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Files The FileManager used for the execution. Class does not take
134cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// ownership.
135cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ToolInvocation(ArrayRef<std::string> CommandLine, FrontendAction *ToolAction,
136cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                 FileManager *Files);
137cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
138cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Map a virtual file to be used while running the tool.
139cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
140cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param FilePath The path at which the content will be mapped.
141cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Content A null terminated buffer of the file's content.
142cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void mapVirtualFile(StringRef FilePath, StringRef Content);
143cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
144cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Run the clang invocation.
145cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
146cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \returns True if there were no errors during execution.
147cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  bool run();
148cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
149cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek private:
150cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void addFileMappingsTo(SourceManager &SourceManager);
151cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
152cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  bool runInvocation(const char *BinaryName,
153cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                     clang::driver::Compilation *Compilation,
154d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva                     clang::CompilerInvocation *Invocation);
155cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
156cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector<std::string> CommandLine;
157cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  OwningPtr<FrontendAction> ToolAction;
158cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager *Files;
159cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Maps <file name> -> <file content>.
160cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  llvm::StringMap<StringRef> MappedFileContents;
161cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
162cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
163cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Utility to run a FrontendAction over a set of files.
164cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
165cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// This class is written to be usable for command line utilities.
166a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// By default the class uses ClangSyntaxOnlyAdjuster to modify
167a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// command line arguments before the arguments are used to run
168a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// a frontend action. One could install another command line
169a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// arguments adjuster by call setArgumentsAdjuster() method.
170cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass ClangTool {
171cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek public:
172cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Constructs a clang tool to run over a list of files.
173cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
174cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Compilations The CompilationDatabase which contains the compile
175cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        command lines for the given source paths.
176cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param SourcePaths The source files to run over. If a source files is
177cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        not found in Compilations, it is skipped.
178cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ClangTool(const CompilationDatabase &Compilations,
179cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek            ArrayRef<std::string> SourcePaths);
180cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
181d088a5f966c31462280d5ace29febc6889834611Edwin Vane  virtual ~ClangTool() {}
182d088a5f966c31462280d5ace29febc6889834611Edwin Vane
183cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Map a virtual file to be used while running the tool.
184cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
185cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param FilePath The path at which the content will be mapped.
186cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Content A null terminated buffer of the file's content.
187cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void mapVirtualFile(StringRef FilePath, StringRef Content);
188cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
189a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \brief Install command line arguments adjuster.
190a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  ///
191a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \param Adjuster Command line arguments adjuster.
192a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  void setArgumentsAdjuster(ArgumentsAdjuster *Adjuster);
193a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
194cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// Runs a frontend action over all files specified in the command line.
195cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
196cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param ActionFactory Factory generating the frontend actions. The function
197cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// takes ownership of this parameter. A new action is generated for every
198cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// processed translation unit.
199d088a5f966c31462280d5ace29febc6889834611Edwin Vane  virtual int run(FrontendActionFactory *ActionFactory);
200cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
201cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Returns the file manager used in the tool.
202cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
203cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// The file manager is shared between all translation units.
204cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager &getFiles() { return Files; }
205cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
206cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek private:
20700f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  // We store compile commands as pair (file name, compile command).
20800f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  std::vector< std::pair<std::string, CompileCommand> > CompileCommands;
209cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
210cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager Files;
211cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Contains a list of pairs (<file name>, <file content>).
212cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
213a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
214cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko  OwningPtr<ArgumentsAdjuster> ArgsAdjuster;
215cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
216cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
217cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename T>
218cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory() {
219cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class SimpleFrontendActionFactory : public FrontendActionFactory {
220cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
221cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() { return new T; }
222cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
223cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
224cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  return new SimpleFrontendActionFactory;
225cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
226cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
227cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename FactoryT>
228fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperinline FrontendActionFactory *newFrontendActionFactory(
2299fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback) {
230cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class FrontendActionFactoryAdapter : public FrontendActionFactory {
231cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
2329fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory,
2339fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek                                          EndOfSourceFileCallback *EndCallback)
2349fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
235cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
236cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() {
2379fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      return new ConsumerFactoryAdaptor(ConsumerFactory, EndCallback);
238cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    }
239cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
240cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  private:
241e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    class ConsumerFactoryAdaptor : public clang::ASTFrontendAction {
242e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    public:
2439fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      ConsumerFactoryAdaptor(FactoryT *ConsumerFactory,
2449fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek                             EndOfSourceFileCallback *EndCallback)
2459fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
246e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek
247e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &,
248cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                            StringRef) {
249e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek        return ConsumerFactory->newASTConsumer();
250e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      }
251e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek
2529fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    protected:
2539fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      virtual void EndSourceFileAction() {
2549fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        if (EndCallback != NULL)
2559fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek          EndCallback->run();
2569fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        clang::ASTFrontendAction::EndSourceFileAction();
2579fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      }
2589fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek
259e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    private:
260e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      FactoryT *ConsumerFactory;
2619fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      EndOfSourceFileCallback *EndCallback;
262e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    };
263e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    FactoryT *ConsumerFactory;
2649fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    EndOfSourceFileCallback *EndCallback;
265cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
266cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
2679fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek  return new FrontendActionFactoryAdapter(ConsumerFactory, EndCallback);
268cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
269cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
2708fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// \brief Returns the absolute path of \c File, by prepending it with
2718fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// the current directory if \c File is not absolute.
2728fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2738fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// Otherwise returns \c File.
2748fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// If 'File' starts with "./", the returned path will not contain the "./".
2758fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// Otherwise, the returned path will contain the literal path-concatenation of
2768fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// the current directory and \c File.
2778fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2788fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// The difference to llvm::sys::fs::make_absolute is that we prefer
2798fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// ::getenv("PWD") if available.
2808fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// FIXME: Make this functionality available from llvm::sys::fs and delete
2818fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///        this function.
2828fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2838fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// \param File Either an absolute or relative path.
2848fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimekstd::string getAbsolutePath(StringRef File);
2858fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek
286cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace tooling
287cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace clang
288cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
289cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#endif // LLVM_CLANG_TOOLING_TOOLING_H
290