mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 21:06:06 +00:00

We would like to move the preamble index out of the critical path. This patch is an RFC to get feedback on the correct implementation and potential pitfalls to keep into consideration. I am not entirely sure if the lazy AST initialisation would create using Preamble AST in parallel. I tried with tsan enabled clangd but it seems to work OK (at least for the cases I tried) Reviewed By: kadircet Differential Revision: https://reviews.llvm.org/D148088
56 lines
1.8 KiB
C++
56 lines
1.8 KiB
C++
//===--- 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"
|
|
#include "index/FileIndex.h"
|
|
#include "gtest/gtest.h"
|
|
#include <optional>
|
|
|
|
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(
|
|
[&](CapturedASTCtx ASTCtx,
|
|
const std::shared_ptr<const CanonicalIncludes> CanonIncludes) {
|
|
auto &Ctx = ASTCtx.getASTContext();
|
|
auto &PP = ASTCtx.getPreprocessor();
|
|
Index->updatePreamble(testPath(Input.first()), "null", Ctx, PP,
|
|
*CanonIncludes);
|
|
});
|
|
ParsedAST MainAST = TU.build();
|
|
Index->updateMain(testPath(Input.first()), MainAST);
|
|
}
|
|
return Index;
|
|
}
|
|
|
|
std::optional<ParsedAST> TestWorkspace::openFile(llvm::StringRef Filename) {
|
|
auto It = Inputs.find(Filename);
|
|
if (It == Inputs.end()) {
|
|
ADD_FAILURE() << "Accessing non-existing file: " << Filename;
|
|
return std::nullopt;
|
|
}
|
|
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
|