22#include "llvm/ADT/StringRef.h"
23#include "llvm/Support/FileSystem.h"
24#include "llvm/Support/raw_ostream.h"
25#include "gmock/gmock.h"
26#include "gtest/gtest.h"
33 GlobalScanningCounterProjectModules(
34 std::unique_ptr<ProjectModules> Underlying, std::atomic<unsigned> &Count)
35 : Underlying(std::move(Underlying)), Count(Count) {}
37 std::vector<std::string> getRequiredModules(
PathRef File)
override {
38 return Underlying->getRequiredModules(
File);
41 std::string getModuleNameForSource(
PathRef File)
override {
42 return Underlying->getModuleNameForSource(
File);
45 void setCommandMangler(CommandMangler Mangler)
override {
46 Underlying->setCommandMangler(std::move(Mangler));
49 std::string getSourceForModuleName(llvm::StringRef ModuleName,
50 PathRef RequiredSrcFile)
override {
52 return Underlying->getSourceForModuleName(ModuleName, RequiredSrcFile);
56 std::unique_ptr<ProjectModules> Underlying;
57 std::atomic<unsigned> &Count;
62 MockDirectoryCompilationDatabase(StringRef TestDir,
const ThreadsafeFS &TFS)
63 : MockCompilationDatabase(TestDir),
64 MockedCDBPtr(std::make_shared<MockClangCompilationDatabase>(*this)),
65 TFS(TFS), GlobalScanningCount(0) {
66 this->ExtraClangFlags.push_back(
"-std=c++20");
67 this->ExtraClangFlags.push_back(
"-c");
70 void addFile(llvm::StringRef
Path, llvm::StringRef Contents);
72 std::unique_ptr<ProjectModules> getProjectModules(
PathRef)
const override {
73 return std::make_unique<GlobalScanningCounterProjectModules>(
77 unsigned getGlobalScanningCount()
const {
return GlobalScanningCount; }
80 class MockClangCompilationDatabase :
public tooling::CompilationDatabase {
82 MockClangCompilationDatabase(MockDirectoryCompilationDatabase &MCDB)
85 std::vector<tooling::CompileCommand>
86 getCompileCommands(StringRef FilePath)
const override {
87 std::optional<tooling::CompileCommand> Cmd =
88 MCDB.getCompileCommand(FilePath);
93 std::vector<std::string> getAllFiles()
const override {
return Files; }
95 void AddFile(StringRef
File) { Files.push_back(
File.str()); }
98 MockDirectoryCompilationDatabase &MCDB;
99 std::vector<std::string> Files;
102 std::shared_ptr<MockClangCompilationDatabase> MockedCDBPtr;
103 const ThreadsafeFS &TFS;
105 mutable std::atomic<unsigned> GlobalScanningCount;
109void MockDirectoryCompilationDatabase::addFile(llvm::StringRef
Path,
110 llvm::StringRef Contents) {
111 ASSERT_FALSE(llvm::sys::path::is_absolute(Path));
114 llvm::sys::path::append(AbsPath, Path);
117 llvm::sys::fs::create_directories(llvm::sys::path::parent_path(AbsPath)));
120 llvm::raw_fd_ostream OS(AbsPath, EC);
124 MockedCDBPtr->AddFile(Path);
127class PrerequisiteModulesTests :
public ::testing::Test {
129 void SetUp()
override {
130 ASSERT_FALSE(llvm::sys::fs::createUniqueDirectory(
"modules-test", TestDir));
133 void TearDown()
override {
134 ASSERT_FALSE(llvm::sys::fs::remove_directories(TestDir));
140 std::string getFullPath(llvm::StringRef Path) {
141 SmallString<128> Result(TestDir);
142 llvm::sys::path::append(Result, Path);
143 EXPECT_TRUE(llvm::sys::fs::exists(Result.str()));
144 return Result.str().str();
147 ParseInputs getInputs(llvm::StringRef FileName,
148 const GlobalCompilationDatabase &CDB) {
149 std::string FullPathName = getFullPath(FileName);
152 std::optional<tooling::CompileCommand> Cmd =
153 CDB.getCompileCommand(FullPathName);
155 Inputs.CompileCommand = std::move(*Cmd);
158 if (
auto Contents = FS.
view(TestDir)->getBufferForFile(FullPathName))
159 Inputs.Contents = Contents->get()->getBuffer().str();
164 SmallString<256> TestDir;
169 DiagnosticConsumer DiagConsumer;
172TEST_F(PrerequisiteModulesTests, NonModularTest) {
173 MockDirectoryCompilationDatabase CDB(TestDir, FS);
175 CDB.addFile(
"foo.h", R
"cpp(
179 CDB.addFile("NonModular.cpp", R
"cpp(
186 ModulesBuilder Builder(CDB);
189 auto NonModularInfo =
190 Builder.buildPrerequisiteModulesFor(getFullPath(
"NonModular.cpp"), FS);
191 EXPECT_TRUE(NonModularInfo);
193 HeaderSearchOptions HSOpts;
194 NonModularInfo->adjustHeaderSearchOptions(HSOpts);
195 EXPECT_TRUE(HSOpts.PrebuiltModuleFiles.empty());
199 EXPECT_TRUE(NonModularInfo->canReuse(*Invocation, FS.view(TestDir)));
202TEST_F(PrerequisiteModulesTests, ModuleWithoutDepTest) {
203 MockDirectoryCompilationDatabase CDB(TestDir, FS);
205 CDB.addFile(
"foo.h", R
"cpp(
209 CDB.addFile("M.cppm", R
"cpp(
215 ModulesBuilder Builder(CDB);
217 auto MInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"M.cppm"), FS);
221 HeaderSearchOptions HSOpts;
222 MInfo->adjustHeaderSearchOptions(HSOpts);
223 EXPECT_TRUE(HSOpts.PrebuiltModuleFiles.empty());
227 EXPECT_TRUE(MInfo->canReuse(*Invocation, FS.view(TestDir)));
230TEST_F(PrerequisiteModulesTests, ModuleWithArgumentPatch) {
231 MockDirectoryCompilationDatabase CDB(TestDir, FS);
233 CDB.ExtraClangFlags.push_back(
"-invalid-unknown-flag");
235 CDB.addFile(
"Dep.cppm", R
"cpp(
239 CDB.addFile("M.cppm", R
"cpp(
246 auto ProjectModules = CDB.getProjectModules(getFullPath(
"M.cppm"));
248 ProjectModules->getRequiredModules(getFullPath(
"M.cppm")).empty());
251 ProjectModules->setCommandMangler([](tooling::CompileCommand &Command,
253 auto const It = llvm::find(Command.CommandLine,
"-invalid-unknown-flag");
254 Command.CommandLine.erase(It);
260 ProjectModules->getRequiredModules(getFullPath(
"M.cppm")).empty());
263TEST_F(PrerequisiteModulesTests, ModuleWithDepTest) {
264 MockDirectoryCompilationDatabase CDB(TestDir, FS);
266 CDB.addFile(
"foo.h", R
"cpp(
270 CDB.addFile("M.cppm", R
"cpp(
276 CDB.addFile("N.cppm", R
"cpp(
282 CDB.addFile("N-part.cppm", R
"cpp(
283// Different module name with filename intentionally.
287 ModulesBuilder Builder(CDB);
289 auto NInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"N.cppm"), FS);
292 ParseInputs NInput = getInputs(
"N.cppm", CDB);
293 std::unique_ptr<CompilerInvocation> Invocation =
296 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
302 HeaderSearchOptions HSOpts;
303 NInfo->adjustHeaderSearchOptions(HSOpts);
305 EXPECT_TRUE(HSOpts.PrebuiltModuleFiles.count(
"M"));
306 EXPECT_TRUE(HSOpts.PrebuiltModuleFiles.count(
"N:Part"));
313 HeaderSearchOptions HSOpts;
314 HSOpts.PrebuiltModuleFiles[
"M"] =
"incorrect_path";
315 HSOpts.PrebuiltModuleFiles[
"N:Part"] =
"incorrect_path";
316 NInfo->adjustHeaderSearchOptions(HSOpts);
318 EXPECT_TRUE(StringRef(HSOpts.PrebuiltModuleFiles[
"M"]).ends_with(
".pcm"));
320 StringRef(HSOpts.PrebuiltModuleFiles[
"N:Part"]).ends_with(
".pcm"));
324TEST_F(PrerequisiteModulesTests, ReusabilityTest) {
325 MockDirectoryCompilationDatabase CDB(TestDir, FS);
327 CDB.addFile(
"foo.h", R
"cpp(
331 CDB.addFile("M.cppm", R
"cpp(
337 CDB.addFile("N.cppm", R
"cpp(
343 CDB.addFile("N-part.cppm", R
"cpp(
344// Different module name with filename intentionally.
348 ModulesBuilder Builder(CDB);
350 auto NInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"N.cppm"), FS);
354 ParseInputs NInput = getInputs(
"N.cppm", CDB);
355 std::unique_ptr<CompilerInvocation> Invocation =
357 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
361 CDB.addFile(
"L.cppm", R
"cpp(
367 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
369 CDB.addFile("bar.h", R
"cpp(
371inline void bar(int) {}
373 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
378 CDB.addFile(
"M.cppm", R
"cpp(
384 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
386 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath("N.cppm"), FS);
387 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
389 CDB.addFile(
"foo.h", R
"cpp(
391inline void foo(int) {}
393 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
395 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath("N.cppm"), FS);
396 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
399 CDB.addFile(
"N-part.cppm", R
"cpp(
401// Intentioned to make it uncompilable.
402export int NPart = 4LIdjwldijaw
404 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
405 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath("N.cppm"), FS);
407 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
409 CDB.addFile(
"N-part.cppm", R
"cpp(
411export int NPart = 43;
414 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
415 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath("N.cppm"), FS);
417 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
421 CDB.addFile(
"N-part.cppm", R
"cpp(
423export int NPart = 43;
425 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
427 CDB.addFile("N.cppm", R
"cpp(
435 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
439TEST_F(PrerequisiteModulesTests, ParsedASTTest) {
440 MockDirectoryCompilationDatabase CDB(TestDir, FS);
442 CDB.addFile(
"A.cppm", R
"cpp(
447 CDB.addFile("Use.cpp", R
"cpp(
451 ModulesBuilder Builder(CDB);
453 ParseInputs Use = getInputs("Use.cpp", CDB);
454 Use.ModulesManager = &Builder;
456 std::unique_ptr<CompilerInvocation> CI =
464 EXPECT_TRUE(
Preamble->RequiredModules);
471 EXPECT_TRUE(
D.isFromASTFile());
475TEST_F(PrerequisiteModulesTests, CodeCompleteTest) {
476 MockDirectoryCompilationDatabase CDB(TestDir, FS);
478 CDB.addFile(
"A.cppm", R
"cpp(
483 llvm::StringLiteral UserContents = R"cpp(
490 CDB.addFile("Use.cpp", UserContents);
491 Annotations Test(UserContents);
493 ModulesBuilder Builder(CDB);
495 ParseInputs Use = getInputs(
"Use.cpp", CDB);
496 Use.ModulesManager = &Builder;
498 std::unique_ptr<CompilerInvocation> CI =
506 EXPECT_TRUE(
Preamble->RequiredModules);
508 auto Result =
codeComplete(getFullPath(
"Use.cpp"), Test.point(),
510 EXPECT_FALSE(Result.Completions.empty());
511 EXPECT_EQ(Result.Completions[0].Name,
"printA");
514TEST_F(PrerequisiteModulesTests, SignatureHelpTest) {
515 MockDirectoryCompilationDatabase CDB(TestDir, FS);
517 CDB.addFile(
"A.cppm", R
"cpp(
519export void printA(int a);
522 llvm::StringLiteral UserContents = R"cpp(
529 CDB.addFile("Use.cpp", UserContents);
530 Annotations Test(UserContents);
532 ModulesBuilder Builder(CDB);
534 ParseInputs Use = getInputs(
"Use.cpp", CDB);
535 Use.ModulesManager = &Builder;
537 std::unique_ptr<CompilerInvocation> CI =
545 EXPECT_TRUE(
Preamble->RequiredModules);
549 EXPECT_FALSE(Result.signatures.empty());
550 EXPECT_EQ(Result.signatures[0].label,
"printA(int a) -> void");
551 EXPECT_EQ(Result.signatures[0].parameters[0].labelString,
"int a");
554TEST_F(PrerequisiteModulesTests, ReusablePrerequisiteModulesTest) {
555 MockDirectoryCompilationDatabase CDB(TestDir, FS);
557 CDB.addFile(
"M.cppm", R
"cpp(
561 CDB.addFile("A.cppm", R
"cpp(
564export int A = 43 + M;
566 CDB.addFile("B.cppm", R
"cpp(
569export int B = 44 + M;
572 ModulesBuilder Builder(CDB);
574 auto AInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"A.cppm"), FS);
576 auto BInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"B.cppm"), FS);
578 HeaderSearchOptions HSOptsA(TestDir);
579 HeaderSearchOptions HSOptsB(TestDir);
580 AInfo->adjustHeaderSearchOptions(HSOptsA);
581 BInfo->adjustHeaderSearchOptions(HSOptsB);
583 EXPECT_FALSE(HSOptsA.PrebuiltModuleFiles.empty());
584 EXPECT_FALSE(HSOptsB.PrebuiltModuleFiles.empty());
587 EXPECT_EQ(HSOptsA.PrebuiltModuleFiles, HSOptsB.PrebuiltModuleFiles);
590 CDB.addFile(
"M.cppm", R
"cpp(
592export constexpr int M = 43;
595 ParseInputs AUse = getInputs("A.cppm", CDB);
596 AUse.ModulesManager = &Builder;
597 std::unique_ptr<CompilerInvocation> AInvocation =
599 EXPECT_FALSE(AInfo->canReuse(*AInvocation, FS.view(TestDir)));
601 ParseInputs BUse = getInputs(
"B.cppm", CDB);
602 AUse.ModulesManager = &Builder;
603 std::unique_ptr<CompilerInvocation> BInvocation =
605 EXPECT_FALSE(BInfo->canReuse(*BInvocation, FS.view(TestDir)));
608 Builder.buildPrerequisiteModulesFor(getFullPath(
"A.cppm"), FS);
610 Builder.buildPrerequisiteModulesFor(getFullPath(
"B.cppm"), FS);
611 EXPECT_TRUE(NewAInfo);
612 EXPECT_TRUE(NewBInfo);
613 HeaderSearchOptions NewHSOptsA(TestDir);
614 HeaderSearchOptions NewHSOptsB(TestDir);
615 NewAInfo->adjustHeaderSearchOptions(NewHSOptsA);
616 NewBInfo->adjustHeaderSearchOptions(NewHSOptsB);
618 EXPECT_FALSE(NewHSOptsA.PrebuiltModuleFiles.empty());
619 EXPECT_FALSE(NewHSOptsB.PrebuiltModuleFiles.empty());
621 EXPECT_EQ(NewHSOptsA.PrebuiltModuleFiles, NewHSOptsB.PrebuiltModuleFiles);
623 EXPECT_NE(NewHSOptsA.PrebuiltModuleFiles, HSOptsA.PrebuiltModuleFiles);
626TEST_F(PrerequisiteModulesTests, ScanningCacheTest) {
627 MockDirectoryCompilationDatabase CDB(TestDir, FS);
629 CDB.addFile(
"M.cppm", R
"cpp(
632 CDB.addFile("A.cppm", R
"cpp(
636 CDB.addFile("B.cppm", R
"cpp(
641 ModulesBuilder Builder(CDB);
643 Builder.buildPrerequisiteModulesFor(getFullPath("A.cppm"), FS);
644 Builder.buildPrerequisiteModulesFor(getFullPath(
"B.cppm"), FS);
645 EXPECT_EQ(CDB.getGlobalScanningCount(), 1u);
651TEST_F(PrerequisiteModulesTests, CanReuseWithHeadersInModuleUnit) {
652 MockDirectoryCompilationDatabase CDB(TestDir, FS);
655 CDB.addFile(
"header1.h", R
"cpp(
656inline int getValue() { return 42; }
660 CDB.addFile(
"M.cppm", R
"cpp(
664export int m_value = getValue();
668 CDB.addFile(
"N.cppm", R
"cpp(
675 CDB.addFile(
"N-part.cppm", R
"cpp(
679 ModulesBuilder Builder(CDB);
682 auto NInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"N.cppm"), FS);
685 ParseInputs NInput = getInputs(
"N.cppm", CDB);
686 std::unique_ptr<CompilerInvocation> Invocation =
690 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
694 CDB.addFile(
"header1.h", R
"cpp(
695inline int getValue() { return 43; }
697 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
700 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"N.cppm"), FS);
702 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
705 CDB.addFile(
"M.cppm", R
"cpp(
709export int m_value = getValue();
710export int m_new_value = 10;
712 EXPECT_FALSE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
715 NInfo = Builder.buildPrerequisiteModulesFor(getFullPath(
"N.cppm"), FS);
717 EXPECT_TRUE(NInfo->canReuse(*Invocation, FS.view(TestDir)));
720TEST_F(PrerequisiteModulesTests, PrebuiltModuleFileTest) {
721 MockDirectoryCompilationDatabase CDB(TestDir, FS);
723 CDB.addFile(
"M.cppm", R
"cpp(
727 CDB.addFile("U.cpp", R
"cpp(
732 ModulesBuilder Builder(CDB);
734 Builder.buildPrerequisiteModulesFor(getFullPath(
"U.cpp"), FS);
735 HeaderSearchOptions HS(TestDir);
736 ModuleInfo->adjustHeaderSearchOptions(HS);
738 CDB.ExtraClangFlags.push_back(
"-fmodule-file=M=" +
739 HS.PrebuiltModuleFiles[
"M"]);
740 ModulesBuilder Builder2(CDB);
742 Builder2.buildPrerequisiteModulesFor(getFullPath(
"U.cpp"), FS);
743 HeaderSearchOptions HS2(TestDir);
744 ModuleInfo2->adjustHeaderSearchOptions(HS2);
746 EXPECT_EQ(HS.PrebuiltModuleFiles, HS2.PrebuiltModuleFiles);
753TEST_F(PrerequisiteModulesTests, PrebuiltModuleFileWithRelativePath) {
754 MockDirectoryCompilationDatabase CDB(TestDir, FS);
756 CDB.addFile(
"M.cppm", R
"cpp(
758export int m_value = 42;
761 CDB.addFile("U.cpp", R
"cpp(
763int use() { return m_value; }
767 ModulesBuilder Builder(CDB);
769 Builder.buildPrerequisiteModulesFor(getFullPath(
"U.cpp"), FS);
770 ASSERT_TRUE(ModuleInfo);
772 HeaderSearchOptions HS(TestDir);
773 ModuleInfo->adjustHeaderSearchOptions(HS);
774 ASSERT_EQ(HS.PrebuiltModuleFiles.count(
"M"), 1u);
777 std::string OriginalBMPath = HS.PrebuiltModuleFiles[
"M"];
778 ASSERT_TRUE(llvm::sys::path::is_absolute(OriginalBMPath));
779 ASSERT_TRUE(llvm::sys::fs::exists(OriginalBMPath));
782 SmallString<256> BMSubDir(TestDir);
783 llvm::sys::path::append(BMSubDir,
"prebuilt_modules");
784 ASSERT_FALSE(llvm::sys::fs::create_directories(BMSubDir));
786 SmallString<256> NewBMPath(BMSubDir);
787 llvm::sys::path::append(NewBMPath,
"M.pcm");
790 ASSERT_FALSE(llvm::sys::fs::copy_file(OriginalBMPath, NewBMPath));
791 ASSERT_TRUE(llvm::sys::fs::exists(NewBMPath));
794 std::string RelativeBMPath =
795 llvm::StringRef(NewBMPath).drop_front(TestDir.size() + 1).str();
796 ASSERT_FALSE(RelativeBMPath.empty());
797 ASSERT_TRUE(llvm::sys::path::is_relative(RelativeBMPath));
800 MockDirectoryCompilationDatabase CDBWithRelativePath(TestDir, FS);
802 CDBWithRelativePath.addFile(
"M.cppm", R
"cpp(
804export int m_value = 42;
807 CDBWithRelativePath.addFile("U.cpp", R
"cpp(
809int use() { return m_value; }
813 CDBWithRelativePath.ExtraClangFlags.push_back(
"-fmodule-file=M=" +
817 ModulesBuilder BuilderWithRelativePath(CDBWithRelativePath);
818 auto ModuleInfo2 = BuilderWithRelativePath.buildPrerequisiteModulesFor(
819 getFullPath(
"U.cpp"), FS);
820 ASSERT_TRUE(ModuleInfo2);
822 HeaderSearchOptions HS2(TestDir);
823 ModuleInfo2->adjustHeaderSearchOptions(HS2);
826 ASSERT_EQ(HS2.PrebuiltModuleFiles.count(
"M"), 1u);
827 EXPECT_EQ(HS2.PrebuiltModuleFiles[
"M"], std::string(NewBMPath))
828 <<
"Expected absolute path: " << NewBMPath
829 <<
"\nGot: " << HS2.PrebuiltModuleFiles[
"M"]
830 <<
"\nRelative path used: " << RelativeBMPath;
static cl::opt< std::string > Directory(cl::Positional, cl::Required, cl::desc("<Search Root Directory>"))
static std::optional< ParsedAST > build(llvm::StringRef Filename, const ParseInputs &Inputs, std::unique_ptr< clang::CompilerInvocation > CI, llvm::ArrayRef< Diag > CompilerInvocationDiags, std::shared_ptr< const PreambleData > Preamble)
Attempts to run Clang and store the parsed AST.
An interface to query the modules information in the project.
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > view(std::nullopt_t CWD) const
Obtain a vfs::FileSystem with an arbitrary initial working directory.
FIXME: Skip testing on windows temporarily due to the different escaping code mode.
TEST_F(BackgroundIndexTest, NoCrashOnErrorFile)
const NamedDecl & findDecl(ParsedAST &AST, llvm::StringRef QName)
std::unique_ptr< ProjectModules > scanningProjectModules(std::shared_ptr< const clang::tooling::CompilationDatabase > CDB, const ThreadsafeFS &TFS)
Providing modules information for the project by scanning every file.
std::unique_ptr< CompilerInvocation > buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D, std::vector< std::string > *CC1Args)
Builds compiler invocation that could be used to build AST or preamble.
std::shared_ptr< const PreambleData > buildPreamble(PathRef FileName, CompilerInvocation CI, const ParseInputs &Inputs, bool StoreInMemory, PreambleParsedCallback PreambleCallback, PreambleBuildStats *Stats)
Build a preamble for the new inputs unless an old one can be reused.
llvm::StringRef PathRef
A typedef to represent a ref to file path.
std::string Path
A typedef to represent a file path.
CodeCompleteResult codeComplete(PathRef FileName, Position Pos, const PreambleData *Preamble, const ParseInputs &ParseInput, CodeCompleteOptions Opts, SpeculativeFuzzyFind *SpecFuzzyFind)
Gets code completions at a specified Pos in FileName.
SignatureHelp signatureHelp(PathRef FileName, Position Pos, const PreambleData &Preamble, const ParseInputs &ParseInput, MarkupKind DocumentationFormat)
Get signature help at a specified Pos in FileName.