1//===--- StandaloneExecution.h - Standalone execution. -*- C++ ----------*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines standalone execution of clang tools. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H 14#define LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H 15 16#include "clang/Tooling/ArgumentsAdjusters.h" 17#include "clang/Tooling/Execution.h" 18#include <optional> 19 20namespace clang { 21namespace tooling { 22 23/// A standalone executor that runs FrontendActions on a given set of 24/// TUs in sequence. 25/// 26/// By default, this executor uses the following arguments adjusters (as defined 27/// in `clang/Tooling/ArgumentsAdjusters.h`): 28/// - `getClangStripOutputAdjuster()` 29/// - `getClangSyntaxOnlyAdjuster()` 30/// - `getClangStripDependencyFileAdjuster()` 31class StandaloneToolExecutor : public ToolExecutor { 32public: 33 static const char *ExecutorName; 34 35 /// Init with \p CompilationDatabase and the paths of all files to be 36 /// proccessed. 37 StandaloneToolExecutor( 38 const CompilationDatabase &Compilations, 39 llvm::ArrayRef<std::string> SourcePaths, 40 IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS = 41 llvm::vfs::getRealFileSystem(), 42 std::shared_ptr<PCHContainerOperations> PCHContainerOps = 43 std::make_shared<PCHContainerOperations>()); 44 45 /// Init with \p CommonOptionsParser. This is expected to be used by 46 /// `createExecutorFromCommandLineArgs` based on commandline options. 47 /// 48 /// The executor takes ownership of \p Options. 49 StandaloneToolExecutor( 50 CommonOptionsParser Options, 51 std::shared_ptr<PCHContainerOperations> PCHContainerOps = 52 std::make_shared<PCHContainerOperations>()); 53 54 StringRef getExecutorName() const override { return ExecutorName; } 55 56 using ToolExecutor::execute; 57 58 llvm::Error 59 execute(llvm::ArrayRef< 60 std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>> 61 Actions) override; 62 63 /// Set a \c DiagnosticConsumer to use during parsing. 64 void setDiagnosticConsumer(DiagnosticConsumer *DiagConsumer) { 65 Tool.setDiagnosticConsumer(DiagConsumer); 66 } 67 68 ExecutionContext *getExecutionContext() override { return &Context; }; 69 70 ToolResults *getToolResults() override { return &Results; } 71 72 llvm::ArrayRef<std::string> getSourcePaths() const { 73 return Tool.getSourcePaths(); 74 } 75 76 void mapVirtualFile(StringRef FilePath, StringRef Content) override { 77 Tool.mapVirtualFile(FilePath, Content); 78 } 79 80 /// Returns the file manager used in the tool. 81 /// 82 /// The file manager is shared between all translation units. 83 FileManager &getFiles() { return Tool.getFiles(); } 84 85private: 86 // Used to store the parser when the executor is initialized with parser. 87 std::optional<CommonOptionsParser> OptionsParser; 88 // FIXME: The standalone executor is currently just a wrapper of `ClangTool`. 89 // Merge `ClangTool` implementation into the this. 90 ClangTool Tool; 91 ExecutionContext Context; 92 InMemoryToolResults Results; 93 ArgumentsAdjuster ArgsAdjuster; 94}; 95 96} // end namespace tooling 97} // end namespace clang 98 99#endif // LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H 100