[clangd] [Modules] Fix to correctly handle module dependencies (#142828) · llvm/llvm-project@02aec86 (original) (raw)

`@@ -360,9 +360,9 @@ void ModuleFileCache::remove(StringRef ModuleName) {

`

360

360

`/// Collect the directly and indirectly required module names for \param

`

361

361

`/// ModuleName in topological order. The \param ModuleName is guaranteed to

`

362

362

`/// be the last element in \param ModuleNames.

`

363

``

`-

llvm::SmallVector getAllRequiredModules(ProjectModules &MDB,

`

``

363

`+

llvm::SmallVectorstd::string getAllRequiredModules(ProjectModules &MDB,

`

364

364

` StringRef ModuleName) {

`

365

``

`-

llvm::SmallVectorllvm::StringRef ModuleNames;

`

``

365

`+

llvm::SmallVectorstd::string ModuleNames;

`

366

366

` llvm::StringSet<> ModuleNamesSet;

`

367

367

``

368

368

`auto VisitDeps = [&](StringRef ModuleName, auto Visitor) -> void {

`

`@@ -373,7 +373,7 @@ llvm::SmallVector getAllRequiredModules(ProjectModules &MDB,

`

373

373

`if (ModuleNamesSet.insert(RequiredModuleName).second)

`

374

374

`Visitor(RequiredModuleName, Visitor);

`

375

375

``

376

``

`-

ModuleNames.push_back(ModuleName);

`

``

376

`+

ModuleNames.push_back(ModuleName.str());

`

377

377

` };

`

378

378

`VisitDeps(ModuleName, VisitDeps);

`

379

379

``

`@@ -418,28 +418,30 @@ llvm::Error ModulesBuilder::ModulesBuilderImpl::getOrBuildModuleFile(

`

418

418

`// Get Required modules in topological order.

`

419

419

`auto ReqModuleNames = getAllRequiredModules(MDB, ModuleName);

`

420

420

`for (llvm::StringRef ReqModuleName : ReqModuleNames) {

`

421

``

`-

if (BuiltModuleFiles.isModuleUnitBuilt(ModuleName))

`

``

421

`+

if (BuiltModuleFiles.isModuleUnitBuilt(ReqModuleName))

`

422

422

`continue;

`

423

423

``

424

424

`if (auto Cached = Cache.getModule(ReqModuleName)) {

`

425

425

`if (IsModuleFileUpToDate(Cached->getModuleFilePath(), BuiltModuleFiles,

`

426

426

` TFS.view(std::nullopt))) {

`

427

``

`-

log("Reusing module {0} from {1}", ModuleName,

`

``

427

`+

log("Reusing module {0} from {1}", ReqModuleName,

`

428

428

` Cached->getModuleFilePath());

`

429

429

` BuiltModuleFiles.addModuleFile(std::move(Cached));

`

430

430

`continue;

`

431

431

` }

`

432

432

` Cache.remove(ReqModuleName);

`

433

433

` }

`

434

434

``

``

435

`+

std::string ReqFileName =

`

``

436

`+

MDB.getSourceForModuleName(ReqModuleName);

`

435

437

` llvm::Expected MF = buildModuleFile(

`

436

``

`-

ModuleName, ModuleUnitFileName, getCDB(), TFS, BuiltModuleFiles);

`

``

438

`+

ReqModuleName, ReqFileName, getCDB(), TFS, BuiltModuleFiles);

`

437

439

`if (llvm::Error Err = MF.takeError())

`

438

440

`return Err;

`

439

441

``

440

``

`-

log("Built module {0} to {1}", ModuleName, MF->getModuleFilePath());

`

``

442

`+

log("Built module {0} to {1}", ReqModuleName, MF->getModuleFilePath());

`

441

443

`auto BuiltModuleFile = std::make_shared(std::move(*MF));

`

442

``

`-

Cache.add(ModuleName, BuiltModuleFile);

`

``

444

`+

Cache.add(ReqModuleName, BuiltModuleFile);

`

443

445

` BuiltModuleFiles.addModuleFile(std::move(BuiltModuleFile));

`

444

446

` }

`

445

447

``