Skip to content

Commit fac0770

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 fec47e6 commit fac0770

File tree

7 files changed

+43
-2
lines changed

7 files changed

+43
-2
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")

Sources/SwiftDriver/Toolchains/Toolchain.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ extension Toolchain {
286286
toolchainRootPath.appending(component: "lib")]
287287
for libraryPath in searchPaths.map({ $0.appending(component: libraryName) }) {
288288
if fileSystem.isFile(libraryPath) {
289+
print("libSwiftScan Path: \(libraryPath.description)")
289290
return libraryPath
290291
}
291292
}

Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,11 +626,20 @@ final class ExplicitModuleBuildTests: XCTestCase {
626626
// Figure out which Triples to use.
627627
let dependencyGraph = try driver.gatherModuleDependencies()
628628
let mainModuleInfo = try dependencyGraph.moduleInfo(of: .swift("testExplicitModuleBuildJobs"))
629-
guard case .swift(_) = mainModuleInfo.details else {
629+
630+
guard case .swift(let mainModuleDetails) = mainModuleInfo.details else {
630631
XCTFail("Main module does not have Swift details field")
631632
return
632633
}
633634

635+
if try driver.interModuleDependencyOracle.supportsSeparateImportOnlyDependencise() {
636+
let directImportedDependencies = try XCTUnwrap(mainModuleDetails.sourceImportDependencies)
637+
XCTAssertTrue(directImportedDependencies.contains(.clang("C")))
638+
XCTAssertTrue(directImportedDependencies.contains(.swift("E")))
639+
XCTAssertTrue(directImportedDependencies.contains(.swift("G")))
640+
XCTAssertFalse(directImportedDependencies.contains(.swift("A")))
641+
}
642+
634643
for job in jobs {
635644
XCTAssertEqual(job.outputs.count, 1)
636645
let outputFilePath = job.outputs[0].file

0 commit comments

Comments
 (0)