Tooling.h revision 14a192435425af39e7f32b6e71613f9357e995f7
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 "llvm/ADT/StringMap.h"
34cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "llvm/ADT/Twine.h"
35cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Basic/FileManager.h"
36cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Basic/LLVM.h"
37cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include "clang/Driver/Util.h"
38a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan#include "clang/Tooling/ArgumentsAdjusters.h"
3900f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek#include "clang/Tooling/CompilationDatabase.h"
40cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include <string>
41cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#include <vector>
42cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
43cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace clang {
44cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
45cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace driver {
46cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass Compilation;
47cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace driver
48cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
49cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass CompilerInvocation;
50cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass SourceManager;
51cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass FrontendAction;
52cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
53cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimeknamespace tooling {
54cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
55cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Interface to generate clang::FrontendActions.
56cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass FrontendActionFactory {
57cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekpublic:
58cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  virtual ~FrontendActionFactory();
59cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
60cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Returns a new clang::FrontendAction.
61cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
62cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// The caller takes ownership of the returned action.
63cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  virtual clang::FrontendAction *create() = 0;
64cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
65cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
66cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Returns a new FrontendActionFactory for a given type.
67cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
68cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// T must extend clang::FrontendAction.
69cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
70cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// Example:
71cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// FrontendActionFactory *Factory =
72cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///   newFrontendActionFactory<clang::SyntaxOnlyAction>();
73cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename T>
74cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory();
75cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
76cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Returns a new FrontendActionFactory for any type that provides an
77cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// implementation of newFrontendAction().
78cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
79cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// FactoryT must implement: FrontendAction *newFrontendAction().
80cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
81cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// Example:
82cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// struct ProvidesFrontendActions {
83cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///   FrontendAction *newFrontendAction();
84cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// } Factory;
85cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// FrontendActionFactory *FactoryAdapter =
86cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///   newFrontendActionFactory(&Factory);
87cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename FactoryT>
88cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory(FactoryT *ActionFactory);
89cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
90cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag.
91cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
92cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param ToolAction The action to run over the code.
93cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param Code C++ code.
94cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \param FileName The file name which 'Code' will be mapped as.
95cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
96cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \return - True if 'ToolAction' was successfully executed.
97cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekbool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code,
98cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                   const Twine &FileName = "input.cc");
99cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
100cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Utility to run a FrontendAction in a single clang invocation.
101cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass ToolInvocation {
102cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek public:
103cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Create a tool invocation.
104cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
105cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param CommandLine The command line arguments to clang.
106cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param ToolAction The action to be executed. Class takes ownership.
107cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Files The FileManager used for the execution. Class does not take
108cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// ownership.
109cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ToolInvocation(ArrayRef<std::string> CommandLine, FrontendAction *ToolAction,
110cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                 FileManager *Files);
111cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
112cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Map a virtual file to be used while running the tool.
113cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
114cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param FilePath The path at which the content will be mapped.
115cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Content A null terminated buffer of the file's content.
116cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void mapVirtualFile(StringRef FilePath, StringRef Content);
117cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
118cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Run the clang invocation.
119cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
120cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \returns True if there were no errors during execution.
121cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  bool run();
122cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
123cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek private:
124cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void addFileMappingsTo(SourceManager &SourceManager);
125cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
126cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  bool runInvocation(const char *BinaryName,
127cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                     clang::driver::Compilation *Compilation,
128cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek                     clang::CompilerInvocation *Invocation,
12914a192435425af39e7f32b6e71613f9357e995f7Alexander Kornienko                     const clang::driver::ArgStringList &CC1Args);
130cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
131cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector<std::string> CommandLine;
132cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  llvm::OwningPtr<FrontendAction> ToolAction;
133cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager *Files;
134cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Maps <file name> -> <file content>.
135cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  llvm::StringMap<StringRef> MappedFileContents;
136cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
137cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
138cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// \brief Utility to run a FrontendAction over a set of files.
139cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek///
140cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek/// This class is written to be usable for command line utilities.
141a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// By default the class uses ClangSyntaxOnlyAdjuster to modify
142a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// command line arguments before the arguments are used to run
143a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// a frontend action. One could install another command line
144a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan/// arguments adjuster by call setArgumentsAdjuster() method.
145cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimekclass ClangTool {
146cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek public:
147cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Constructs a clang tool to run over a list of files.
148cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
149cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Compilations The CompilationDatabase which contains the compile
150cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        command lines for the given source paths.
151cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param SourcePaths The source files to run over. If a source files is
152cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///        not found in Compilations, it is skipped.
153cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ClangTool(const CompilationDatabase &Compilations,
154cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek            ArrayRef<std::string> SourcePaths);
155cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
156cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Map a virtual file to be used while running the tool.
157cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
158cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param FilePath The path at which the content will be mapped.
159cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param Content A null terminated buffer of the file's content.
160cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  void mapVirtualFile(StringRef FilePath, StringRef Content);
161cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
162a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \brief Install command line arguments adjuster.
163a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  ///
164a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  /// \param Adjuster Command line arguments adjuster.
165a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  void setArgumentsAdjuster(ArgumentsAdjuster *Adjuster);
166a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
167cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// Runs a frontend action over all files specified in the command line.
168cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
169cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \param ActionFactory Factory generating the frontend actions. The function
170cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// takes ownership of this parameter. A new action is generated for every
171cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// processed translation unit.
172cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  int run(FrontendActionFactory *ActionFactory);
173cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
174cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// \brief Returns the file manager used in the tool.
175cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  ///
176cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  /// The file manager is shared between all translation units.
177cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager &getFiles() { return Files; }
178cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
179cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek private:
18000f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  // We store compile commands as pair (file name, compile command).
18100f3c4f499cc27c88005176226bb424f6db4a31bManuel Klimek  std::vector< std::pair<std::string, CompileCommand> > CompileCommands;
182cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
183cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  FileManager Files;
184cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  // Contains a list of pairs (<file name>, <file content>).
185cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
186a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan
187a01ddc787b5c8b1cf11e975d3586908d3629954cSimon Atanasyan  llvm::OwningPtr<ArgumentsAdjuster> ArgsAdjuster;
188cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek};
189cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
190cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename T>
191cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory() {
192cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class SimpleFrontendActionFactory : public FrontendActionFactory {
193cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
194cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() { return new T; }
195cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
196cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
197cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  return new SimpleFrontendActionFactory;
198cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
199cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
200cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimektemplate <typename FactoryT>
201cb971c6726d16e12ecd2a340941d7f5c06698332Manuel KlimekFrontendActionFactory *newFrontendActionFactory(FactoryT *ActionFactory) {
202cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  class FrontendActionFactoryAdapter : public FrontendActionFactory {
203cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  public:
204cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    explicit FrontendActionFactoryAdapter(FactoryT *ActionFactory)
205cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek      : ActionFactory(ActionFactory) {}
206cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
207cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    virtual clang::FrontendAction *create() {
208cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek      return ActionFactory->newFrontendAction();
209cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    }
210cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
211cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  private:
212cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek    FactoryT *ActionFactory;
213cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  };
214cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
215cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek  return new FrontendActionFactoryAdapter(ActionFactory);
216cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek}
217cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
218cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace tooling
219cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek} // end namespace clang
220cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
221cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek#endif // LLVM_CLANG_TOOLING_TOOLING_H
222cb971c6726d16e12ecd2a340941d7f5c06698332Manuel Klimek
223