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