//===--- StandaloneExecution.h - Standalone execution. -*- C++ ----------*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file defines standalone execution of clang tools.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H
#define LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H

#include "clang/Tooling/ArgumentsAdjusters.h"
#include "clang/Tooling/Execution.h"

namespace clang {
namespace tooling {

/// \brief A standalone executor that runs FrontendActions on a given set of
/// TUs in sequence.
///
/// By default, this executor uses the following arguments adjusters (as defined
/// in `clang/Tooling/ArgumentsAdjusters.h`):
///   - `getClangStripOutputAdjuster()`
///   - `getClangSyntaxOnlyAdjuster()`
///   - `getClangStripDependencyFileAdjuster()`
class StandaloneToolExecutor : public ToolExecutor {
public:
  static const char *ExecutorName;

  /// \brief Init with \p CompilationDatabase and the paths of all files to be
  /// proccessed.
  StandaloneToolExecutor(
      const CompilationDatabase &Compilations,
      llvm::ArrayRef<std::string> SourcePaths,
      std::shared_ptr<PCHContainerOperations> PCHContainerOps =
          std::make_shared<PCHContainerOperations>());

  /// \brief Init with \p CommonOptionsParser. This is expected to be used by
  /// `createExecutorFromCommandLineArgs` based on commandline options.
  ///
  /// The executor takes ownership of \p Options.
  StandaloneToolExecutor(
      CommonOptionsParser Options,
      std::shared_ptr<PCHContainerOperations> PCHContainerOps =
          std::make_shared<PCHContainerOperations>());

  StringRef getExecutorName() const override { return ExecutorName; }

  using ToolExecutor::execute;

  llvm::Error
  execute(llvm::ArrayRef<
          std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>>
              Actions) override;

  /// \brief Set a \c DiagnosticConsumer to use during parsing.
  void setDiagnosticConsumer(DiagnosticConsumer *DiagConsumer) {
    Tool.setDiagnosticConsumer(DiagConsumer);
  }

  ExecutionContext *getExecutionContext() override { return &Context; };

  ToolResults *getToolResults() override { return &Results; }

  llvm::ArrayRef<std::string> getSourcePaths() const {
    return Tool.getSourcePaths();
  }

  void mapVirtualFile(StringRef FilePath, StringRef Content) override {
    Tool.mapVirtualFile(FilePath, Content);
  }

  /// \brief Returns the file manager used in the tool.
  ///
  /// The file manager is shared between all translation units.
  FileManager &getFiles() { return Tool.getFiles(); }

private:
  // Used to store the parser when the executor is initialized with parser.
  llvm::Optional<CommonOptionsParser> OptionsParser;
  // FIXME: The standalone executor is currently just a wrapper of `ClangTool`.
  // Merge `ClangTool` implementation into the this.
  ClangTool Tool;
  ExecutionContext Context;
  InMemoryToolResults Results;
  ArgumentsAdjuster ArgsAdjuster;
};

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

#endif // LLVM_CLANG_TOOLING_STANDALONEEXECUTION_H
