Skip to content

Commit c1ba410

Browse files
committed
Using the compiler instance with context for by-name lookups.
1 parent 27dc291 commit c1ba410

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

include/swift/DependencyScan/ModuleDependencyScanner.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class ModuleDependencyScanningWorker {
5151
llvm::PrefixMapper *mapper, DiagnosticEngine &diags);
5252

5353
private:
54+
llvm::Error initializeClangScanningTool();
55+
llvm::Error finalizeClangScanningTool();
56+
5457
/// Query dependency information for a named Clang module
5558
///
5659
/// \param moduleName moduel identifier for the query
@@ -229,6 +232,9 @@ class ModuleDependencyScanner {
229232
llvm::ErrorOr<ModuleDependencyInfo>
230233
getMainModuleDependencyInfo(ModuleDecl *mainModule);
231234

235+
llvm::Error initializeWorkerClangScanningTool();
236+
llvm::Error finalizeWorkerClangScanningTool();
237+
232238
/// Resolve module dependencies of the given module, computing a full
233239
/// transitive closure dependency graph.
234240
std::vector<ModuleDependencyID>

lib/DependencyScan/ModuleDependencyScanner.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,15 @@ ModuleDependencyScanningWorker::ModuleDependencyScanningWorker(
296296
workerCompilerInvocation->getSearchPathOptions().ExplicitSwiftModuleInputs);
297297
}
298298

299+
llvm::Error ModuleDependencyScanningWorker::initializeClangScanningTool() {
300+
return clangScanningTool.initializeCompilerInstanceWithContext(
301+
clangScanningWorkingDirectoryPath, clangScanningModuleCommandLineArgs);
302+
}
303+
304+
llvm::Error ModuleDependencyScanningWorker::finalizeClangScanningTool() {
305+
return clangScanningTool.finalizeCompilerInstanceWithContext();
306+
}
307+
299308
SwiftModuleScannerQueryResult
300309
ModuleDependencyScanningWorker::scanFilesystemForSwiftModuleDependency(
301310
Identifier moduleName, bool isTestableImport) {
@@ -309,18 +318,23 @@ ModuleDependencyScanningWorker::scanFilesystemForClangModuleDependency(
309318
LookupModuleOutputCallback lookupModuleOutput,
310319
const llvm::DenseSet<clang::tooling::dependencies::ModuleID>
311320
&alreadySeenModules) {
312-
auto clangModuleDependencies = clangScanningTool.getModuleDependencies(
313-
moduleName.str(), clangScanningModuleCommandLineArgs,
314-
clangScanningWorkingDirectoryPath, alreadySeenModules,
315-
lookupModuleOutput);
321+
// auto clangModuleDependencies = clangScanningTool.getModuleDependencies(
322+
// moduleName.str(), clangScanningModuleCommandLineArgs,
323+
// clangScanningWorkingDirectoryPath, alreadySeenModules,
324+
// lookupModuleOutput);
325+
auto clangModuleDependencies =
326+
clangScanningTool.computeDependenciesByNameWithContext(
327+
moduleName.str(), alreadySeenModules, lookupModuleOutput);
316328
if (!clangModuleDependencies) {
317-
llvm::handleAllErrors(clangModuleDependencies.takeError(), [this, &moduleName](
318-
const llvm::StringError &E) {
329+
llvm::handleAllErrors(
330+
clangModuleDependencies.takeError(),
331+
[this, &moduleName](const llvm::StringError &E) {
319332
auto &message = E.getMessage();
320333
if (message.find("fatal error: module '" + moduleName.str().str() +
321-
"' not found") == std::string::npos)
322-
workerDiagnosticEngine->diagnose(SourceLoc(), diag::clang_dependency_scan_error, message);
323-
});
334+
"' not found") == std::string::npos)
335+
workerDiagnosticEngine->diagnose(
336+
SourceLoc(), diag::clang_dependency_scan_error, message);
337+
});
324338
return std::nullopt;
325339
}
326340

@@ -560,6 +574,22 @@ ModuleDependencyScanner::ModuleDependencyScanner(
560574
DependencyTracker, CAS, ActionCache, PrefixMapper.get(), Diagnostics));
561575
}
562576

577+
llvm::Error ModuleDependencyScanner::initializeWorkerClangScanningTool() {
578+
for (auto &W : Workers) {
579+
if (auto error = W->initializeClangScanningTool())
580+
return error;
581+
}
582+
return llvm::Error::success();
583+
}
584+
585+
llvm::Error ModuleDependencyScanner::finalizeWorkerClangScanningTool() {
586+
for (auto &W : Workers) {
587+
if (auto error = W->finalizeClangScanningTool())
588+
return error;
589+
}
590+
return llvm::Error::success();
591+
}
592+
563593
static std::set<ModuleDependencyID>
564594
collectBinarySwiftDeps(const ModuleDependenciesCache &cache) {
565595
std::set<ModuleDependencyID> binarySwiftModuleDepIDs;

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,6 +1412,11 @@ performModuleScanImpl(
14121412
instance->getDiags(),
14131413
instance->getInvocation().getFrontendOptions().ParallelDependencyScan);
14141414

1415+
auto initError = scanner.initializeWorkerClangScanningTool();
1416+
// TODO: fix error check!
1417+
if (initError)
1418+
llvm::consumeError(std::move(initError));
1419+
14151420
// Identify imports of the main module and add an entry for it
14161421
// to the dependency graph.
14171422
auto mainModuleName = instance->getMainModule()->getNameStr();
@@ -1426,6 +1431,10 @@ performModuleScanImpl(
14261431
if (diagnoseCycle(*instance, cache, mainModuleID))
14271432
return std::make_error_code(std::errc::not_supported);
14281433

1434+
auto finError = scanner.finalizeWorkerClangScanningTool();
1435+
if (finError)
1436+
llvm::consumeError(std::move(finError));
1437+
14291438
auto topologicallySortedModuleList =
14301439
computeTopologicalSortOfExplicitDependencies(allModules, cache);
14311440

0 commit comments

Comments
 (0)