Tooling.h revision 30a2e16f6c27f888dd11eba6bbbae1e980078fcb
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,
154cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                     clang::CompilerInvocation *Invocation,
15514a192435425af39e7f32b6e71613f9357e995f7Alexander Kornienko                     const clang::driver::ArgStringList &CC1Args);
156cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
157cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector<std::string> CommandLine;
158cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  llvm::OwningPtr<FrontendAction> ToolAction;
159cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager *Files;
160cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Maps <file name> -> <file content>.
161cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  llvm::StringMap<StringRef> MappedFileContents;
162cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
163cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
164cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Utility to run a FrontendAction over a set of files.
165cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
166cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// This class is written to be usable for command line utilities.
167a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// By default the class uses ClangSyntaxOnlyAdjuster to modify
168a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// command line arguments before the arguments are used to run
169a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// a frontend action. One could install another command line
170a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// arguments adjuster by call setArgumentsAdjuster() method.
171cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass ClangTool {
172cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek public:
173cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Constructs a clang tool to run over a list of files.
174cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
175cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Compilations The CompilationDatabase which contains the compile
176cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        command lines for the given source paths.
177cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param SourcePaths The source files to run over. If a source files is
178cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        not found in Compilations, it is skipped.
179cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ClangTool(const CompilationDatabase &Compilations,
180cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek            ArrayRef<std::string> SourcePaths);
181cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
182cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Map a virtual file to be used while running the tool.
183cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
184cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param FilePath The path at which the content will be mapped.
185cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Content A null terminated buffer of the file's content.
186cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void mapVirtualFile(StringRef FilePath, StringRef Content);
187cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
188a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \brief Install command line arguments adjuster.
189a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  ///
190a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \param Adjuster Command line arguments adjuster.
191a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  void setArgumentsAdjuster(ArgumentsAdjuster *Adjuster);
192a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
193cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// Runs a frontend action over all files specified in the command line.
194cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
195cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param ActionFactory Factory generating the frontend actions. The function
196cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// takes ownership of this parameter. A new action is generated for every
197cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// processed translation unit.
198cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  int run(FrontendActionFactory *ActionFactory);
199cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
200cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Returns the file manager used in the tool.
201cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
202cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// The file manager is shared between all translation units.
203cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager &getFiles() { return Files; }
204cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
205cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek private:
20600f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  // We store compile commands as pair (file name, compile command).
20700f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  std::vector< std::pair<std::string, CompileCommand> > CompileCommands;
208cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
209cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager Files;
210cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Contains a list of pairs (<file name>, <file content>).
211cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
212a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
213a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  llvm::OwningPtr<ArgumentsAdjuster> ArgsAdjuster;
214cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
215cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
216cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename T>
217cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory() {
218cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class SimpleFrontendActionFactory : public FrontendActionFactory {
219cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
220cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() { return new T; }
221cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
222cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
223cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  return new SimpleFrontendActionFactory;
224cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
225cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
226cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename FactoryT>
227fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperinline FrontendActionFactory *newFrontendActionFactory(
2289fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback) {
229cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class FrontendActionFactoryAdapter : public FrontendActionFactory {
230cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
2319fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory,
2329fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek                                          EndOfSourceFileCallback *EndCallback)
2339fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
234cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
235cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() {
2369fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      return new ConsumerFactoryAdaptor(ConsumerFactory, EndCallback);
237cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    }
238cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
239cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  private:
240e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    class ConsumerFactoryAdaptor : public clang::ASTFrontendAction {
241e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    public:
2429fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      ConsumerFactoryAdaptor(FactoryT *ConsumerFactory,
2439fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek                             EndOfSourceFileCallback *EndCallback)
2449fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
245e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek
246e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &,
247e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek                                            llvm::StringRef) {
248e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek        return ConsumerFactory->newASTConsumer();
249e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      }
250e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek
2519fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    protected:
2529fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      virtual void EndSourceFileAction() {
2539fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        if (EndCallback != NULL)
2549fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek          EndCallback->run();
2559fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek        clang::ASTFrontendAction::EndSourceFileAction();
2569fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      }
2579fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek
258e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    private:
259e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek      FactoryT *ConsumerFactory;
2609fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek      EndOfSourceFileCallback *EndCallback;
261e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    };
262e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek    FactoryT *ConsumerFactory;
2639fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek    EndOfSourceFileCallback *EndCallback;
264cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
265cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
2669fb6b27e6d584ac339363357335f8d6de3a652acManuel Klimek  return new FrontendActionFactoryAdapter(ConsumerFactory, EndCallback);
267cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
268cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
2698fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// \brief Returns the absolute path of \c File, by prepending it with
2708fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// the current directory if \c File is not absolute.
2718fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2728fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// Otherwise returns \c File.
2738fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// If 'File' starts with "./", the returned path will not contain the "./".
2748fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// Otherwise, the returned path will contain the literal path-concatenation of
2758fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// the current directory and \c File.
2768fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2778fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// The difference to llvm::sys::fs::make_absolute is that we prefer
2788fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// ::getenv("PWD") if available.
2798fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// FIXME: Make this functionality available from llvm::sys::fs and delete
2808fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///        this function.
2818fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek///
2828fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek/// \param File Either an absolute or relative path.
2838fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimekstd::string getAbsolutePath(StringRef File);
2848fa2fb859a4cb8e67d9763225281d9b0aa9cb59fManuel Klimek
285cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace tooling
286cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace clang
287cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
288cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#endif // LLVM_CLANG_TOOLING_TOOLING_H
289