Skip to content

Commit f93f00e

Browse files
committed
[Dependency Scanning] Add support for Swift Overlay dependencies as a separate dependency details field
Instead of assuming such dependencies are contained in the 'directDependencies' field of the module info, support querying them from a details of a textual module.
1 parent 3794e75 commit f93f00e

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ typedef struct {
122122
(*swiftscan_swift_textual_detail_get_context_hash)(swiftscan_module_details_t);
123123
bool
124124
(*swiftscan_swift_textual_detail_get_is_framework)(swiftscan_module_details_t);
125+
swiftscan_string_set_t *
126+
(*swiftscan_swift_textual_detail_get_swift_overlay_dependencies)(swiftscan_module_details_t);
125127

126128
//=== Swift Binary Module Details query APIs ------------------------------===//
127129
swiftscan_string_ref_t

Sources/SwiftDriver/ExplicitModuleBuilds/InterModuleDependencies/InterModuleDependencyGraph.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ extension ModuleDependencyId: Codable {
7979
/// Bridging header
8080
public struct BridgingHeader: Codable {
8181
var path: TextualVirtualPath
82+
/// The source files referenced by the bridging header.
8283
var sourceFiles: [TextualVirtualPath]
84+
/// Modules that the bridging header specifically depends on
8385
var moduleDependencies: [String]
8486
}
8587

@@ -92,13 +94,16 @@ public struct SwiftModuleDetails: Codable {
9294
public var compiledModuleCandidates: [TextualVirtualPath]?
9395

9496
/// The bridging header, if any.
95-
public var bridgingHeaderPath: TextualVirtualPath?
96-
97-
/// The source files referenced by the bridging header.
98-
public var bridgingSourceFiles: [TextualVirtualPath]? = []
99-
100-
/// Modules that the bridging header specifically depends on
101-
public var bridgingHeaderDependencies: [ModuleDependencyId]? = []
97+
public var bridgingHeader: BridgingHeader?
98+
public var bridgingHeaderPath: TextualVirtualPath? {
99+
bridgingHeader?.path
100+
}
101+
public var bridgingSourceFiles: [TextualVirtualPath]? {
102+
bridgingHeader?.sourceFiles
103+
}
104+
public var bridgingHeaderDependencies: [ModuleDependencyId]? {
105+
bridgingHeader?.moduleDependencies.map { .clang($0) }
106+
}
102107

103108
/// Options to the compile command
104109
public var commandLine: [String]? = []
@@ -115,6 +120,9 @@ public struct SwiftModuleDetails: Codable {
115120

116121
/// A flag to indicate whether or not this module is a framework.
117122
public var isFramework: Bool?
123+
124+
/// A set of Swift Overlays of Clang Module Dependencies
125+
var swiftOverlayDependencies: [ModuleDependencyId]?
118126
}
119127

120128
/// Details specific to Swift placeholder dependencies.

Sources/SwiftDriver/SwiftScan/DependencyGraphBuilder.swift

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ private extension SwiftScan {
123123
guard let moduleDetailsRef = api.swiftscan_module_info_get_details(moduleInfoRef) else {
124124
throw DependencyScanningError.missingField("modules[\(moduleId)].details")
125125
}
126-
let details = try constructModuleDetails(from: moduleDetailsRef)
126+
let details = try constructModuleDetails(from: moduleDetailsRef,
127+
moduleAliases: moduleAliases)
127128

128129
return (moduleId, ModuleInfo(modulePath: modulePath, sourceFiles: sourceFiles,
129130
directDependencies: directDependencies,
@@ -133,12 +134,14 @@ private extension SwiftScan {
133134
/// From a reference to a binary-format module info details object info returned by libSwiftScan,
134135
/// construct an instance of an `ModuleInfo`.Details as used by the driver.
135136
/// The object returned by libSwiftScan is a union so ensure to execute dependency-specific queries.
136-
func constructModuleDetails(from moduleDetailsRef: swiftscan_module_details_t)
137+
func constructModuleDetails(from moduleDetailsRef: swiftscan_module_details_t,
138+
moduleAliases: [String: String]?)
137139
throws -> ModuleInfo.Details {
138140
let moduleKind = api.swiftscan_module_detail_get_kind(moduleDetailsRef)
139141
switch moduleKind {
140142
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL:
141-
return .swift(try constructSwiftTextualModuleDetails(from: moduleDetailsRef))
143+
return .swift(try constructSwiftTextualModuleDetails(from: moduleDetailsRef,
144+
moduleAliases: moduleAliases))
142145
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY:
143146
return .swiftPrebuiltExternal(try constructSwiftBinaryModuleDetails(from: moduleDetailsRef))
144147
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER:
@@ -151,7 +154,8 @@ private extension SwiftScan {
151154
}
152155

153156
/// Construct a `SwiftModuleDetails` from a `swiftscan_module_details_t` reference
154-
func constructSwiftTextualModuleDetails(from moduleDetailsRef: swiftscan_module_details_t)
157+
func constructSwiftTextualModuleDetails(from moduleDetailsRef: swiftscan_module_details_t,
158+
moduleAliases: [String: String]?)
155159
throws -> SwiftModuleDetails {
156160
let moduleInterfacePath =
157161
try getOptionalPathDetail(from: moduleDetailsRef,
@@ -168,6 +172,15 @@ private extension SwiftScan {
168172
let bridgingHeaderDependencies =
169173
try getOptionalStringArrayDetail(from: moduleDetailsRef,
170174
using: api.swiftscan_swift_textual_detail_get_bridging_module_dependencies)
175+
let bridgingHeader: BridgingHeader?
176+
if let resolvedBridgingHeaderPath = bridgingHeaderPath {
177+
bridgingHeader = BridgingHeader(path: resolvedBridgingHeaderPath,
178+
sourceFiles: bridgingSourceFiles ?? [],
179+
moduleDependencies: bridgingHeaderDependencies ?? [])
180+
} else {
181+
bridgingHeader = nil
182+
}
183+
171184
let commandLine =
172185
try getOptionalStringArrayDetail(from: moduleDetailsRef,
173186
using: api.swiftscan_swift_textual_detail_get_command_line)
@@ -180,15 +193,25 @@ private extension SwiftScan {
180193
using: api.swiftscan_swift_textual_detail_get_context_hash)
181194
let isFramework = api.swiftscan_swift_textual_detail_get_is_framework(moduleDetailsRef)
182195

196+
// Decode all dependencies of this module
197+
let swiftOverlayDependencies: [ModuleDependencyId]?
198+
if supportsSeparateSwiftOverlayDependencies(),
199+
let encodedOverlayDepsRef = api.swiftscan_swift_textual_detail_get_swift_overlay_dependencies(moduleDetailsRef) {
200+
let encodedOverlayDependencies = try toSwiftStringArray(encodedOverlayDepsRef.pointee)
201+
swiftOverlayDependencies =
202+
try encodedOverlayDependencies.map { try decodeModuleNameAndKind(from: $0, moduleAliases: moduleAliases) }
203+
} else {
204+
swiftOverlayDependencies = nil
205+
}
206+
183207
return SwiftModuleDetails(moduleInterfacePath: moduleInterfacePath,
184208
compiledModuleCandidates: compiledModuleCandidates,
185-
bridgingHeaderPath: bridgingHeaderPath,
186-
bridgingSourceFiles: bridgingSourceFiles,
187-
bridgingHeaderDependencies: bridgingHeaderDependencies?.map { .clang($0) },
209+
bridgingHeader: bridgingHeader,
188210
commandLine: commandLine,
189211
contextHash: contextHash,
190212
extraPcmArgs: extraPcmArgs,
191-
isFramework: isFramework)
213+
isFramework: isFramework,
214+
swiftOverlayDependencies: swiftOverlayDependencies)
192215
}
193216

194217
/// Construct a `SwiftPrebuiltExternalModuleDetails` from a `swiftscan_module_details_t` reference

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@ internal extension swiftscan_diagnostic_severity_t {
263263
func resetScannerCache() {
264264
api.swiftscan_scanner_cache_reset(scanner)
265265
}
266+
267+
@_spi(Testing) public func supportsSeparateSwiftOverlayDependencies() -> Bool {
268+
return api.swiftscan_swift_textual_detail_get_swift_overlay_dependencies != nil
269+
}
266270

267271
@_spi(Testing) public func supportsScannerDiagnostics() -> Bool {
268272
return api.swiftscan_scanner_diagnostics_query != nil &&
@@ -419,6 +423,10 @@ private extension swiftscan_functions_t {
419423
self.swiftscan_swift_binary_detail_get_is_framework =
420424
try loadOptional("swiftscan_swift_binary_detail_get_is_framework")
421425

426+
// Swift Overlay Dependencies
427+
self.swiftscan_swift_textual_detail_get_swift_overlay_dependencies =
428+
try loadOptional("swiftscan_swift_textual_detail_get_swift_overlay_dependencies")
429+
422430
// MARK: Required Methods
423431
func loadRequired<T>(_ symbol: String) throws -> T {
424432
guard let sym: T = Loader.lookup(symbol: symbol, in: swiftscan) else {

0 commit comments

Comments
 (0)