// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include "lifetime_annotations/test/run_on_code.h"

#include <functional>
#include <memory>
#include <string>

#include "lifetime_annotations/lifetime_annotations.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/Frontend/FrontendAction.h"
#include "clang/Serialization/PCHContainerOperations.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"

namespace clang {
namespace tidy {
namespace lifetimes {

namespace {

class RunOnCodeASTConsumer : public clang::ASTConsumer {
 public:
  explicit RunOnCodeASTConsumer(
      const std::function<void(clang::ASTContext&,
                               const LifetimeAnnotationContext&)>& operation,
      std::shared_ptr<LifetimeAnnotationContext> lifetime_context)
      : operation_(operation), lifetime_context_(lifetime_context) {}

  void HandleTranslationUnit(clang::ASTContext& ast_context) override {
    operation_(ast_context, *lifetime_context_);
  }

 private:
  const std::function<void(clang::ASTContext&,
                           const LifetimeAnnotationContext&)>& operation_;
  std::shared_ptr<LifetimeAnnotationContext> lifetime_context_;
};

class RunOnCodeAction : public clang::ASTFrontendAction {
 public:
  explicit RunOnCodeAction(
      const std::function<void(clang::ASTContext&,
                               const LifetimeAnnotationContext&)>& operation,
      std::shared_ptr<LifetimeAnnotationContext> lifetime_context)
      : operation_(operation), lifetime_context_(lifetime_context) {}

  std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
      clang::CompilerInstance& compiler, llvm::StringRef) override {
    AddLifetimeAnnotationHandlers(compiler.getPreprocessor(),
                                  lifetime_context_);
    return std::make_unique<RunOnCodeASTConsumer>(operation_,
                                                  lifetime_context_);
  }

 private:
  const std::function<void(clang::ASTContext&,
                           const LifetimeAnnotationContext&)>& operation_;
  std::shared_ptr<LifetimeAnnotationContext> lifetime_context_;
};

}  // namespace

bool runOnCodeWithLifetimeHandlers(
    llvm::StringRef code,
    const std::function<void(clang::ASTContext&,
                             const LifetimeAnnotationContext&)>& operation,
    llvm::ArrayRef<std::string> args,
    const clang::tooling::FileContentMappings& file_contents) {
  auto context = std::make_shared<LifetimeAnnotationContext>();
  return clang::tooling::runToolOnCodeWithArgs(
      std::make_unique<RunOnCodeAction>(operation, context), code, args,
      "input.cc", "run-on-code-with-lifetime-handlers",
      std::make_shared<clang::PCHContainerOperations>(), file_contents);
}

}  // namespace lifetimes
}  // namespace tidy
}  // namespace clang
