blob: 0e3404f91c8f261c2c21b22ecf4809c142b0303f [file] [log] [blame]
Eric Liu826b7832017-10-26 10:38:14 +00001//===- lib/Tooling/Execution.cpp - Implements tool execution framework. ---===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/Tooling/Execution.h"
11#include "clang/Tooling/ToolExecutorPluginRegistry.h"
12#include "clang/Tooling/Tooling.h"
13
14LLVM_INSTANTIATE_REGISTRY(clang::tooling::ToolExecutorPluginRegistry)
15
16namespace clang {
17namespace tooling {
18
19static llvm::cl::opt<std::string>
20 ExecutorName("executor", llvm::cl::desc("The name of the executor to use."),
21 llvm::cl::init("standalone"));
22
23void InMemoryToolResults::addResult(StringRef Key, StringRef Value) {
24 KVResults.push_back({Key.str(), Value.str()});
25}
26
27std::vector<std::pair<std::string, std::string>>
28InMemoryToolResults::AllKVResults() {
29 return KVResults;
30}
31
32void InMemoryToolResults::forEachResult(
33 llvm::function_ref<void(StringRef Key, StringRef Value)> Callback) {
34 for (const auto &KV : KVResults) {
35 Callback(KV.first, KV.second);
36 }
37}
38
39void ExecutionContext::reportResult(StringRef Key, StringRef Value) {
40 Results->addResult(Key, Value);
41}
42
43llvm::Error
44ToolExecutor::execute(std::unique_ptr<FrontendActionFactory> Action) {
45 return execute(std::move(Action), ArgumentsAdjuster());
46}
47
48llvm::Error ToolExecutor::execute(std::unique_ptr<FrontendActionFactory> Action,
49 ArgumentsAdjuster Adjuster) {
50 std::vector<
51 std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>>
52 Actions;
53 Actions.emplace_back(std::move(Action), std::move(Adjuster));
54 return execute(Actions);
55}
56
Eric Liu6e622842017-11-03 15:20:57 +000057namespace internal {
Eric Liu826b7832017-10-26 10:38:14 +000058llvm::Expected<std::unique_ptr<ToolExecutor>>
Eric Liu6e622842017-11-03 15:20:57 +000059createExecutorFromCommandLineArgsImpl(int &argc, const char **argv,
60 llvm::cl::OptionCategory &Category,
61 const char *Overview) {
Eric Liu826b7832017-10-26 10:38:14 +000062 auto OptionsParser =
63 CommonOptionsParser::create(argc, argv, Category, llvm::cl::ZeroOrMore,
64 /*Overview=*/nullptr);
65 if (!OptionsParser)
66 return OptionsParser.takeError();
67 for (auto I = ToolExecutorPluginRegistry::begin(),
68 E = ToolExecutorPluginRegistry::end();
69 I != E; ++I) {
70 if (I->getName() != ExecutorName) {
71 continue;
72 }
73 std::unique_ptr<ToolExecutorPlugin> Plugin(I->instantiate());
74 llvm::Expected<std::unique_ptr<ToolExecutor>> Executor =
75 Plugin->create(*OptionsParser);
76 if (!Executor) {
77 return llvm::make_error<llvm::StringError>(
78 llvm::Twine("Failed to create '") + I->getName() +
79 "': " + llvm::toString(Executor.takeError()) + "\n",
80 llvm::inconvertibleErrorCode());
81 }
82 return std::move(*Executor);
83 }
84 return llvm::make_error<llvm::StringError>(
85 llvm::Twine("Executor \"") + ExecutorName + "\" is not registered.",
86 llvm::inconvertibleErrorCode());
87}
Eric Liu6e622842017-11-03 15:20:57 +000088} // end namespace internal
89
90llvm::Expected<std::unique_ptr<ToolExecutor>>
91createExecutorFromCommandLineArgs(int &argc, const char **argv,
92 llvm::cl::OptionCategory &Category,
93 const char *Overview) {
94 return internal::createExecutorFromCommandLineArgsImpl(argc, argv, Category,
95 Overview);
96}
Eric Liu826b7832017-10-26 10:38:14 +000097
98} // end namespace tooling
99} // end namespace clang