56 lines · cpp
1//===--- TestWorkspace.cpp - Utility for writing multi-file tests -*- C++-*===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "TestWorkspace.h"10#include "clang-include-cleaner/Record.h"11#include "index/FileIndex.h"12#include "gtest/gtest.h"13#include <memory>14#include <optional>15 16namespace clang {17namespace clangd {18 19std::unique_ptr<SymbolIndex> TestWorkspace::index() {20 auto Index = std::make_unique<FileIndex>(/*SupportContainedRefs=*/true);21 for (const auto &Input : Inputs) {22 if (!Input.second.IsMainFile)23 continue;24 TU.Code = Input.second.Code;25 TU.Filename = Input.first().str();26 TU.preamble([&](CapturedASTCtx ASTCtx,27 std::shared_ptr<const include_cleaner::PragmaIncludes> PI) {28 auto &Ctx = ASTCtx.getASTContext();29 auto &PP = ASTCtx.getPreprocessor();30 Index->updatePreamble(testPath(Input.first()), "null", Ctx, PP, *PI);31 });32 ParsedAST MainAST = TU.build();33 Index->updateMain(testPath(Input.first()), MainAST);34 }35 return Index;36}37 38std::optional<ParsedAST> TestWorkspace::openFile(llvm::StringRef Filename) {39 auto It = Inputs.find(Filename);40 if (It == Inputs.end()) {41 ADD_FAILURE() << "Accessing non-existing file: " << Filename;42 return std::nullopt;43 }44 TU.Code = It->second.Code;45 TU.Filename = It->first().str();46 return TU.build();47}48 49void TestWorkspace::addInput(llvm::StringRef Filename,50 const SourceFile &Input) {51 Inputs.insert(std::make_pair(Filename, Input));52 TU.AdditionalFiles.insert(std::make_pair(Filename, Input.Code));53}54} // namespace clangd55} // namespace clang56