//===--- TestWorkspace.cpp - Utility for writing multi-file tests -*- C++-*===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "TestWorkspace.h"

namespace clang {
namespace clangd {

std::unique_ptr<SymbolIndex> TestWorkspace::index() {
  auto Index = std::make_unique<FileIndex>();
  for (const auto &Input : Inputs) {
    if (!Input.second.IsMainFile)
      continue;
    TU.Code = Input.second.Code;
    TU.Filename = Input.first().str();
    TU.preamble([&](ASTContext &Ctx, std::shared_ptr<clang::Preprocessor> PP,
                    const CanonicalIncludes &CanonIncludes) {
      Index->updatePreamble(testPath(Input.first()), "null", Ctx, PP,
                            CanonIncludes);
    });
    ParsedAST MainAST = TU.build();
    Index->updateMain(testPath(Input.first()), MainAST);
  }
  return Index;
}

Optional<ParsedAST> TestWorkspace::openFile(llvm::StringRef Filename) {
  auto It = Inputs.find(Filename);
  if (It == Inputs.end()) {
    ADD_FAILURE() << "Accessing non-existing file: " << Filename;
    return llvm::None;
  }
  TU.Code = It->second.Code;
  TU.Filename = It->first().str();
  return TU.build();
}

void TestWorkspace::addInput(llvm::StringRef Filename,
                             const SourceFile &Input) {
  Inputs.insert(std::make_pair(Filename, Input));
  TU.AdditionalFiles.insert(std::make_pair(Filename, Input.Code));
}
} // namespace clangd
} // namespace clang