Skip to content

Commit 99e1989

Browse files
committed
[clangd] [Modules] Use ASTReader directly in IsModuleFileUpToDate
1 parent 5155c38 commit 99e1989

File tree

1 file changed

+37
-22
lines changed

1 file changed

+37
-22
lines changed

clang-tools-extra/clangd/ModulesBuilder.cpp

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "clang/Frontend/FrontendAction.h"
1313
#include "clang/Frontend/FrontendActions.h"
1414
#include "clang/Serialization/ASTReader.h"
15+
#include "clang/Serialization/InMemoryModuleCache.h"
1516

1617
namespace clang {
1718
namespace clangd {
@@ -127,50 +128,64 @@ struct ModuleFile {
127128
std::string ModuleFilePath;
128129
};
129130

130-
bool IsModuleFileUpToDate(
131-
PathRef ModuleFilePath,
132-
const PrerequisiteModules &RequisiteModules) {
133-
IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
134-
CompilerInstance::createDiagnostics(new DiagnosticOptions());
135-
131+
bool IsModuleFileUpToDate(PathRef ModuleFilePath,
132+
const PrerequisiteModules &RequisiteModules,
133+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
136134
auto HSOpts = std::make_shared<HeaderSearchOptions>();
137135
RequisiteModules.adjustHeaderSearchOptions(*HSOpts);
138136
HSOpts->ForceCheckCXX20ModulesInputFiles = true;
139137
HSOpts->ValidateASTInputFilesContent = true;
140138

139+
IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
140+
CompilerInstance::createDiagnostics(new DiagnosticOptions());
141+
142+
LangOptions LangOpts;
143+
LangOpts.SkipODRCheckInGMF = true;
144+
145+
FileManager FileMgr(FileSystemOptions(), VFS);
146+
147+
SourceManager SourceMgr(*Diags, FileMgr);
148+
149+
HeaderSearch HeaderInfo(HSOpts, SourceMgr, *Diags, LangOpts,
150+
/*Target=*/nullptr);
151+
152+
TrivialModuleLoader ModuleLoader;
153+
Preprocessor PP(std::make_shared<PreprocessorOptions>(), *Diags, LangOpts,
154+
SourceMgr, HeaderInfo, ModuleLoader);
155+
156+
IntrusiveRefCntPtr<InMemoryModuleCache> ModuleCache = new InMemoryModuleCache;
141157
PCHContainerOperations PCHOperations;
142-
std::unique_ptr<ASTUnit> Unit = ASTUnit::LoadFromASTFile(
143-
ModuleFilePath.str(), PCHOperations.getRawReader(), ASTUnit::LoadASTOnly,
144-
Diags, FileSystemOptions(), std::move(HSOpts));
158+
ASTReader Reader(PP, *ModuleCache, /*ASTContext=*/nullptr,
159+
PCHOperations.getRawReader(), {});
145160

146-
if (!Unit)
147-
return false;
161+
Reader.setListener(std::make_unique<PPIntializer>(PP));
148162

149-
auto Reader = Unit->getASTReader();
150-
if (!Reader)
163+
if (Reader.ReadAST(ModuleFilePath, serialization::MK_MainFile,
164+
SourceLocation(),
165+
ASTReader::ARR_None) != ASTReader::Success)
151166
return false;
152167

153168
bool UpToDate = true;
154-
Reader->getModuleManager().visit([&](serialization::ModuleFile &MF) -> bool {
155-
Reader->visitInputFiles(
169+
Reader.getModuleManager().visit([&](serialization::ModuleFile &MF) -> bool {
170+
Reader.visitInputFiles(
156171
MF, /*IncludeSystem=*/false, /*Complain=*/false,
157172
[&](const serialization::InputFile &IF, bool isSystem) {
158173
if (!IF.getFile() || IF.isOutOfDate())
159174
UpToDate = false;
160175
});
161-
162176
return !UpToDate;
163177
});
164-
165178
return UpToDate;
166179
}
167180

168181
bool IsModuleFilesUpToDate(
169182
llvm::SmallVector<PathRef> ModuleFilePaths,
170-
const PrerequisiteModules &RequisiteModules) {
171-
return llvm::all_of(ModuleFilePaths, [&RequisiteModules](auto ModuleFilePath) {
172-
return IsModuleFileUpToDate(ModuleFilePath, RequisiteModules);
173-
});
183+
const PrerequisiteModules &RequisiteModules,
184+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
185+
return llvm::all_of(
186+
ModuleFilePaths, [&RequisiteModules, VFS](auto ModuleFilePath) {
187+
return IsModuleFileUpToDate(ModuleFilePath, RequisiteModules, VFS);
188+
});
174189
}
175190

176191
// StandalonePrerequisiteModules - stands for PrerequisiteModules for which all
@@ -347,7 +362,7 @@ bool StandalonePrerequisiteModules::canReuse(
347362
SmallVector<StringRef> BMIPaths;
348363
for (auto &MF : RequiredModules)
349364
BMIPaths.push_back(MF.ModuleFilePath);
350-
return IsModuleFilesUpToDate(BMIPaths, *this);
365+
return IsModuleFilesUpToDate(BMIPaths, *this, VFS);
351366
}
352367

353368
} // namespace clangd

0 commit comments

Comments
 (0)