// 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 "nullability/inference/augmented_test_inputs.h"

#include <memory>
#include <utility>

#include "nullability/inference/ctn_replacement_macros.h"
#include "nullability/inference/replace_macros.h"
#include "nullability/pragma.h"
#include "nullability/test/test_headers.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendAction.h"
#include "clang/Testing/CommandLineArgs.h"
#include "clang/Testing/TestAST.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"

namespace clang::tidy::nullability {
TestInputs getAugmentedTestInputs(llvm::StringRef Source,
                                  NullabilityPragmas& Pragmas) {
  TestInputs Inputs = Source;
  Inputs.Language = TestLanguage::Lang_CXX20;
  for (const auto& Entry :
       llvm::ArrayRef(test_headers_create(), test_headers_size()))
    Inputs.ExtraFiles.try_emplace(Entry.name, Entry.data);
  for (const auto& Entry : llvm::ArrayRef(ctn_replacement_macros_create(),
                                          ctn_replacement_macros_size()))
    Inputs.ExtraFiles.try_emplace(Entry.name, Entry.data);

  Inputs.ExtraArgs.push_back("-I.");
  Inputs.ExtraArgs.push_back("-include");
  Inputs.ExtraArgs.push_back("nullability_annotations.h");
  Inputs.ExtraArgs.push_back("-include");
  Inputs.ExtraArgs.emplace_back(ReplacementMacrosHeaderFileName);

  Inputs.MakeAction = [&]() {
    struct RegisterPragmasWrapperAction : public WrapperFrontendAction {
      NullabilityPragmas& Pragmas;
      RegisterPragmasWrapperAction(std::unique_ptr<FrontendAction> Wrapped,
                                   NullabilityPragmas& Pragmas)
          : WrapperFrontendAction(std::move(Wrapped)), Pragmas(Pragmas) {}

      bool BeginSourceFileAction(clang::CompilerInstance& CI) override {
        if (!WrapperFrontendAction::BeginSourceFileAction(CI)) return false;
        registerPragmaHandler(CI.getPreprocessor(), Pragmas);
        return true;
      }
    };

    return std::make_unique<RegisterPragmasWrapperAction>(
        std::make_unique<ReplaceMacrosAction>(), Pragmas);
  };
  return Inputs;
}
}  // namespace clang::tidy::nullability
