//===- lib/Tooling/Execution.cpp - Standalone clang action execution. -----===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "clang/Tooling/StandaloneExecution.h"
#include "clang/Tooling/ToolExecutorPluginRegistry.h"

namespace clang {
namespace tooling {

static llvm::Error make_string_error(const llvm::Twine &Message) {
  return llvm::make_error<llvm::StringError>(Message,
                                             llvm::inconvertibleErrorCode());
}

const char *StandaloneToolExecutor::ExecutorName = "StandaloneToolExecutor";

static ArgumentsAdjuster getDefaultArgumentsAdjusters() {
  return combineAdjusters(
      getClangStripOutputAdjuster(),
      combineAdjusters(getClangSyntaxOnlyAdjuster(),
                       getClangStripDependencyFileAdjuster()));
}

StandaloneToolExecutor::StandaloneToolExecutor(
    const CompilationDatabase &Compilations,
    llvm::ArrayRef<std::string> SourcePaths,
    std::shared_ptr<PCHContainerOperations> PCHContainerOps)
    : Tool(Compilations, SourcePaths), Context(&Results),
      ArgsAdjuster(getDefaultArgumentsAdjusters()) {
  // Use self-defined default argument adjusters instead of the default
  // adjusters that come with the old `ClangTool`.
  Tool.clearArgumentsAdjusters();
}

StandaloneToolExecutor::StandaloneToolExecutor(
    CommonOptionsParser Options,
    std::shared_ptr<PCHContainerOperations> PCHContainerOps)
    : OptionsParser(std::move(Options)),
      Tool(OptionsParser->getCompilations(), OptionsParser->getSourcePathList(),
           PCHContainerOps),
      Context(&Results), ArgsAdjuster(getDefaultArgumentsAdjusters()) {
  Tool.clearArgumentsAdjusters();
}

llvm::Error StandaloneToolExecutor::execute(
    llvm::ArrayRef<
        std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>>
        Actions) {
  if (Actions.empty())
    return make_string_error("No action to execute.");

  if (Actions.size() != 1)
    return make_string_error(
        "Only support executing exactly 1 action at this point.");

  auto &Action = Actions.front();
  Tool.appendArgumentsAdjuster(Action.second);
  Tool.appendArgumentsAdjuster(ArgsAdjuster);
  if (Tool.run(Action.first.get()))
    return make_string_error("Failed to run action.");

  return llvm::Error::success();
}

class StandaloneToolExecutorPlugin : public ToolExecutorPlugin {
public:
  llvm::Expected<std::unique_ptr<ToolExecutor>>
  create(CommonOptionsParser &OptionsParser) override {
    if (OptionsParser.getSourcePathList().empty())
      return make_string_error(
          "[StandaloneToolExecutorPlugin] No positional argument found.");
    return llvm::make_unique<StandaloneToolExecutor>(std::move(OptionsParser));
  }
};

// This anchor is used to force the linker to link in the generated object file
// and thus register the plugin.
volatile int ToolExecutorPluginAnchorSource = 0;

static ToolExecutorPluginRegistry::Add<StandaloneToolExecutorPlugin>
    X("standalone", "Runs FrontendActions on a set of files provided "
                    "via positional arguments.");

} // end namespace tooling
} // end namespace clang
