Skip to content

Commit 9a48432

Browse files
committed
Revert "Revert "Add -print-target-info libSwiftScan entry-points""
This reverts commit d8b50c7.
1 parent 7964ae6 commit 9a48432

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ typedef struct {
207207
void
208208
(*swiftscan_scan_invocation_dispose)(swiftscan_scan_invocation_t);
209209

210+
//=== Target Info Functions-------- ---------------------------------------===//
211+
swiftscan_string_ref_t
212+
(*swiftscan_compiler_target_info_query)(swiftscan_scan_invocation_t);
213+
210214
//=== Functionality Query Functions ---------------------------------------===//
211215
swiftscan_string_set_t *
212216
(*swiftscan_compiler_supported_arguments_query)(void);

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import func Foundation.strdup
1616
import func Foundation.free
17+
import class Foundation.JSONDecoder
18+
import struct Foundation.Data
1719

1820
import protocol TSCBasic.DiagnosticData
1921
import struct TSCBasic.AbsolutePath
@@ -80,7 +82,7 @@ internal extension swiftscan_diagnostic_severity_t {
8082
}
8183

8284
/// Wrapper for libSwiftScan, taking care of initialization, shutdown, and dispatching dependency scanning queries.
83-
internal final class SwiftScan {
85+
@_spi(Testing) public final class SwiftScan {
8486
/// The path to the libSwiftScan dylib.
8587
let path: AbsolutePath
8688

@@ -311,6 +313,26 @@ internal final class SwiftScan {
311313
throw DependencyScanningError.argumentQueryFailed
312314
}
313315
}
316+
317+
@_spi(Testing) public func canQueryTargetInfo() -> Bool {
318+
return api.swiftscan_compiler_target_info_query != nil &&
319+
api.swiftscan_string_set_dispose != nil
320+
}
321+
322+
@_spi(Testing) public func queryTargetInfo(invocationCommand: [String])
323+
throws -> FrontendTargetInfo {
324+
// Create and configure the scanner invocation
325+
let invocation = api.swiftscan_scan_invocation_create()
326+
defer { api.swiftscan_scan_invocation_dispose(invocation) }
327+
withArrayOfCStrings(invocationCommand) { invocationStringArray in
328+
api.swiftscan_scan_invocation_set_argv(invocation,
329+
Int32(invocationCommand.count),
330+
invocationStringArray)
331+
}
332+
let targetInfoString = try toSwiftString(api.swiftscan_compiler_target_info_query(invocation))
333+
let targetInfoData = Data(targetInfoString.utf8)
334+
return try JSONDecoder().decode(FrontendTargetInfo.self, from: targetInfoData)
335+
}
314336
}
315337

316338
// Used for testing purposes only
@@ -350,6 +372,10 @@ private extension swiftscan_functions_t {
350372
self.swiftscan_compiler_supported_features_query =
351373
try loadOptional("swiftscan_compiler_supported_features_query")
352374

375+
// Target Info query
376+
self.swiftscan_compiler_target_info_query =
377+
try loadOptional("swiftscan_compiler_target_info_query")
378+
353379
// Dependency scanner serialization/deserialization features
354380
self.swiftscan_scanner_cache_serialize =
355381
try loadOptional("swiftscan_scanner_cache_serialize")

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4770,7 +4770,7 @@ final class SwiftDriverTests: XCTestCase {
47704770

47714771
func testPrintTargetInfo() throws {
47724772
do {
4773-
var driver = try Driver(args: ["swift", "-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"])
4773+
var driver = try Driver(args: ["swift", "-print-target-info", "-sdk", "bar", "-resource-dir", "baz"])
47744774
let plannedJobs = try driver.planBuild()
47754775
XCTAssertTrue(plannedJobs.count == 1)
47764776
let job = plannedJobs[0]
@@ -4781,6 +4781,22 @@ final class SwiftDriverTests: XCTestCase {
47814781
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
47824782
}
47834783

4784+
do {
4785+
let targetInfoArgs = ["-print-target-info", "-sdk", "bar", "-resource-dir", "baz"]
4786+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
4787+
4788+
let env = ProcessEnv.vars
4789+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
4790+
hostTriple: driver.hostTriple,
4791+
env: env)
4792+
if localFileSystem.exists(swiftScanLibPath) {
4793+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
4794+
if libSwiftScanInstance.canQueryTargetInfo() {
4795+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
4796+
}
4797+
}
4798+
}
4799+
47844800
do {
47854801
struct MockExecutor: DriverExecutor {
47864802
let resolver: ArgsResolver

0 commit comments

Comments
 (0)