Skip to content

Commit 56593fd

Browse files
committed
[Explicit Module Builds] Adopt new direct-import field for Swift source modules
Adopts new Swift dependency scanner API to query only directly-imported module dependencies for the module being scanned
1 parent 25a4ce2 commit 56593fd

File tree

6 files changed

+52
-8
lines changed

6 files changed

+52
-8
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ typedef struct {
141141
(*swiftscan_swift_textual_detail_get_is_framework)(swiftscan_module_details_t);
142142
swiftscan_string_set_t *
143143
(*swiftscan_swift_textual_detail_get_swift_overlay_dependencies)(swiftscan_module_details_t);
144+
swiftscan_string_set_t *
145+
(*swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies)(swiftscan_module_details_t);
144146
swiftscan_string_ref_t
145147
(*swiftscan_swift_textual_detail_get_module_cache_key)(swiftscan_module_details_t);
146148
swiftscan_string_ref_t

Sources/SwiftDriver/ExplicitModuleBuilds/InterModuleDependencies/InterModuleDependencyGraph.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ public struct SwiftModuleDetails: Codable, Hashable {
136136
public var isFramework: Bool?
137137

138138
/// A set of Swift Overlays of Clang Module Dependencies
139-
var swiftOverlayDependencies: [ModuleDependencyId]?
139+
public var swiftOverlayDependencies: [ModuleDependencyId]?
140+
141+
/// A set of directly-imported in source module dependencies
142+
public var sourceImportDependencies: [ModuleDependencyId]?
140143

141144
/// The module cache key of the output module.
142145
public var moduleCacheKey: String?

Sources/SwiftDriver/ExplicitModuleBuilds/InterModuleDependencies/InterModuleDependencyOracle.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ public class InterModuleDependencyOracle {
147147
return swiftScan.supportsLinkLibraries
148148
}
149149

150+
@_spi(Testing) public func supportsSeparateImportOnlyDependencise() throws -> Bool {
151+
guard let swiftScan = swiftScanLibInstance else {
152+
fatalError("Attempting to query supported scanner API with no scanner instance.")
153+
}
154+
return swiftScan.supportsSeparateImportOnlyDependencise
155+
}
156+
150157
@_spi(Testing) public func getScannerDiagnostics() throws -> [ScannerDiagnosticPayload]? {
151158
guard let swiftScan = swiftScanLibInstance else {
152159
fatalError("Attempting to reset scanner cache with no scanner instance.")

Sources/SwiftDriver/SwiftScan/DependencyGraphBuilder.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,16 @@ private extension SwiftScan {
200200
swiftOverlayDependencies = nil
201201
}
202202

203+
let sourceImportedDependencies: [ModuleDependencyId]?
204+
if supportsSeparateImportOnlyDependencise,
205+
let encodedImportedDepsRef = api.swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies(moduleDetailsRef) {
206+
let encodedImportedDepsendencies = try toSwiftStringArray(encodedImportedDepsRef.pointee)
207+
sourceImportedDependencies =
208+
try encodedImportedDepsendencies.map { try decodeModuleNameAndKind(from: $0, moduleAliases: moduleAliases) }
209+
} else {
210+
sourceImportedDependencies = nil
211+
}
212+
203213
return SwiftModuleDetails(moduleInterfacePath: moduleInterfacePath,
204214
compiledModuleCandidates: compiledModuleCandidates,
205215
bridgingHeader: bridgingHeader,
@@ -208,6 +218,7 @@ private extension SwiftScan {
208218
contextHash: contextHash,
209219
isFramework: isFramework,
210220
swiftOverlayDependencies: swiftOverlayDependencies,
221+
sourceImportDependencies: sourceImportedDependencies,
211222
moduleCacheKey: moduleCacheKey,
212223
chainedBridgingHeaderPath: chainedBridgingHeaderPath,
213224
chainedBridgingHeaderContent: chainedBridgingHeaderContent)

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ private extension String {
246246
return api.swiftscan_swift_textual_detail_get_swift_overlay_dependencies != nil
247247
}
248248

249+
@_spi(Testing) public var supportsSeparateImportOnlyDependencise: Bool {
250+
return api.swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies != nil
251+
}
252+
249253
@_spi(Testing) public var supportsScannerDiagnostics : Bool {
250254
return api.swiftscan_scanner_diagnostics_query != nil &&
251255
api.swiftscan_scanner_diagnostics_reset != nil &&
@@ -573,6 +577,10 @@ private extension swiftscan_functions_t {
573577
self.swiftscan_swift_textual_detail_get_swift_overlay_dependencies =
574578
loadOptional("swiftscan_swift_textual_detail_get_swift_overlay_dependencies")
575579

580+
// Directly-imported source dependencies
581+
self.swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies =
582+
loadOptional("swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies")
583+
576584
// Header dependencies of binary modules
577585
self.swiftscan_swift_binary_detail_get_header_dependencies =
578586
loadOptional("swiftscan_swift_binary_detail_get_header_dependencies")

Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -619,18 +619,37 @@ final class ExplicitModuleBuildTests: XCTestCase {
619619
"-I", stdlibPath.nativePathString(escaped: true),
620620
"-I", shimsPath.nativePathString(escaped: true),
621621
"-explicit-module-build",
622+
"-disable-implicit-concurrency-module-import",
623+
"-disable-implicit-string-processing-module-import",
622624
"-import-objc-header", bridgingHeaderpath.nativePathString(escaped: true),
623625
main.nativePathString(escaped: true)] + sdkArgumentsForTesting)
624626

625627
let jobs = try driver.planBuild()
626628
// Figure out which Triples to use.
627629
let dependencyGraph = try driver.gatherModuleDependencies()
628630
let mainModuleInfo = try dependencyGraph.moduleInfo(of: .swift("testExplicitModuleBuildJobs"))
629-
guard case .swift(_) = mainModuleInfo.details else {
631+
632+
guard case .swift(let mainModuleDetails) = mainModuleInfo.details else {
630633
XCTFail("Main module does not have Swift details field")
631634
return
632635
}
633636

637+
if try driver.interModuleDependencyOracle.supportsSeparateImportOnlyDependencise() {
638+
let directImportedDependencies = try XCTUnwrap(mainModuleDetails.sourceImportDependencies)
639+
XCTAssertFalse(directImportedDependencies.contains(.swift("A")))
640+
XCTAssertFalse(directImportedDependencies.contains(.clang("D")))
641+
XCTAssertFalse(directImportedDependencies.contains(.clang("F")))
642+
XCTAssertFalse(directImportedDependencies.contains(.clang("G")))
643+
644+
XCTAssertTrue(directImportedDependencies.contains(.swift("Swift")) ||
645+
directImportedDependencies.contains(.swiftPrebuiltExternal("Swift")))
646+
XCTAssertTrue(directImportedDependencies.contains(.swift("SwiftOnoneSupport")) ||
647+
directImportedDependencies.contains(.swiftPrebuiltExternal("SwiftOnoneSupport")))
648+
XCTAssertTrue(directImportedDependencies.contains(.swift("E")))
649+
XCTAssertTrue(directImportedDependencies.contains(.clang("C")))
650+
XCTAssertTrue(directImportedDependencies.contains(.swift("G")))
651+
}
652+
634653
for job in jobs {
635654
XCTAssertEqual(job.outputs.count, 1)
636655
let outputFilePath = job.outputs[0].file
@@ -650,12 +669,6 @@ final class ExplicitModuleBuildTests: XCTestCase {
650669
} else if pathMatchesSwiftModule(path: outputFilePath, "Swift") {
651670
try checkExplicitModuleBuildJob(job: job, moduleId: .swift("Swift"),
652671
dependencyGraph: dependencyGraph)
653-
} else if pathMatchesSwiftModule(path: outputFilePath, "_Concurrency") {
654-
try checkExplicitModuleBuildJob(job: job, moduleId: .swift("_Concurrency"),
655-
dependencyGraph: dependencyGraph)
656-
} else if pathMatchesSwiftModule(path: outputFilePath, "_StringProcessing") {
657-
try checkExplicitModuleBuildJob(job: job, moduleId: .swift("_StringProcessing"),
658-
dependencyGraph: dependencyGraph)
659672
} else if pathMatchesSwiftModule(path: outputFilePath, "SwiftOnoneSupport") {
660673
try checkExplicitModuleBuildJob(job: job, moduleId: .swift("SwiftOnoneSupport"),
661674
dependencyGraph: dependencyGraph)

0 commit comments

Comments
 (0)