Index: clang-tools-extra/clang-doc/tool/ClangDocMain.cpp =================================================================== --- clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -30,8 +30,7 @@ #include "clang/Driver/Options.h" #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" -#include "clang/Tooling/Execution.h" -#include "clang/Tooling/StandaloneExecution.h" +#include "clang/Tooling/ToolExecutorPluginRegistry.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/APFloat.h" #include "llvm/Support/CommandLine.h" @@ -88,6 +87,11 @@ llvm::cl::desc("Use only doxygen-style comments to generate docs."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory)); +static llvm::cl::opt ClangDocExecutorName( + "doc-executor", + llvm::cl::desc("The name of the executor to use in clang-doc."), + llvm::cl::init("all-TUs")); + bool CreateDirectory(const Twine &DirName, bool ClearDirectory = false) { std::error_code OK; llvm::SmallString<128> DocsRootPath; @@ -195,12 +199,40 @@ return Err; } +llvm::Expected> +createClangDocExecutor(int &argc, const char **argv, + llvm::cl::OptionCategory &Category) { + auto OptionsParser = + CommonOptionsParser::create(argc, argv, Category, llvm::cl::ZeroOrMore); + if (!OptionsParser) + return OptionsParser.takeError(); + for (auto I = ToolExecutorPluginRegistry::begin(), + E = ToolExecutorPluginRegistry::end(); + I != E; ++I) { + if (I->getName() != ClangDocExecutorName) + continue; + std::unique_ptr Plugin(I->instantiate()); + llvm::Expected> Executor = + Plugin->create(*OptionsParser); + if (!Executor) { + return llvm::make_error( + llvm::Twine("Failed to create '") + I->getName() + + "': " + llvm::toString(Executor.takeError()) + "\n", + llvm::inconvertibleErrorCode()); + } + return std::move(*Executor); + } + return llvm::make_error(llvm::Twine("Executor \"") + + ClangDocExecutorName + + "\" is not registered.", + llvm::inconvertibleErrorCode()); +} + int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); std::error_code OK; - auto Exec = clang::tooling::createExecutorFromCommandLineArgs( - argc, argv, ClangDocCategory); + auto Exec = createClangDocExecutor(argc, argv, ClangDocCategory); if (!Exec) { llvm::errs() << toString(Exec.takeError()) << "\n";