Skip to content

Commit b7a502c

Browse files
committed
When SwiftPM supports --experimental-prepare-for-indexing pass it to the prepare command
The main purpose for now is that this makes it easier for me to live on background indexing combined with swiftlang/swift-package-manager#7574.
1 parent 505f4cf commit b7a502c

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,45 @@ public actor SwiftPMBuildSystem {
107107
let fileSystem: FileSystem
108108
private let toolchainRegistry: ToolchainRegistry
109109

110+
private let swiftBuildSupportsPrepareForIndexingTask = SKSupport.ThreadSafeBox<Task<Bool, Never>?>(initialValue: nil)
111+
112+
#if compiler(>=6.1)
113+
#warning(
114+
"Remove swiftBuildSupportsPrepareForIndexing when we no longer need to support SwiftPM versions that don't have support for `--experimental-prepare-for-indexing`"
115+
)
116+
#endif
117+
/// Whether `swift build` supports the `--experimental-prepare-for-indexing` flag.
118+
private var swiftBuildSupportsPrepareForIndexing: Bool {
119+
get async {
120+
let task = swiftBuildSupportsPrepareForIndexingTask.withLock { task in
121+
if let task {
122+
return task
123+
}
124+
let newTask = Task { () -> Bool in
125+
guard let swift = await toolchainRegistry.default?.swift else {
126+
return false
127+
}
128+
129+
do {
130+
let process = Process(args: swift.pathString, "build", "--help-hidden")
131+
try process.launch()
132+
let result = try await process.waitUntilExit()
133+
guard let output = String(bytes: try result.output.get(), encoding: .utf8) else {
134+
return false
135+
}
136+
return output.contains("--experimental-prepare-for-indexing")
137+
} catch {
138+
return false
139+
}
140+
}
141+
task = newTask
142+
return newTask
143+
}
144+
145+
return await task.value
146+
}
147+
}
148+
110149
var fileToTarget: [AbsolutePath: SwiftBuildTarget] = [:]
111150
var sourceDirToTarget: [AbsolutePath: SwiftBuildTarget] = [:]
112151

@@ -523,13 +562,16 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem {
523562
)
524563
return
525564
}
526-
let arguments = [
565+
var arguments = [
527566
swift.pathString, "build",
528567
"--package-path", workspacePath.pathString,
529568
"--scratch-path", self.workspace.location.scratchDirectory.pathString,
530569
"--disable-index-store",
531570
"--target", target.targetID,
532571
]
572+
if await swiftBuildSupportsPrepareForIndexing {
573+
arguments.append("--experimental-prepare-for-indexing")
574+
}
533575
if Task.isCancelled {
534576
return
535577
}

0 commit comments

Comments
 (0)