Skip to content

Commit a8e1464

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 b7b225c commit a8e1464

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
@@ -106,6 +106,45 @@ public actor SwiftPMBuildSystem {
106106
let fileSystem: FileSystem
107107
private let toolchainRegistry: ToolchainRegistry
108108

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

@@ -509,13 +548,16 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem {
509548
)
510549
return
511550
}
512-
let arguments = [
551+
var arguments = [
513552
swift.pathString, "build",
514553
"--package-path", workspacePath.pathString,
515554
"--scratch-path", self.workspace.location.scratchDirectory.pathString,
516555
"--disable-index-store",
517556
"--target", target.targetID,
518557
]
558+
if await swiftBuildSupportsPrepareForIndexing {
559+
arguments.append("--experimental-prepare-for-indexing")
560+
}
519561
if Task.isCancelled {
520562
return
521563
}

0 commit comments

Comments
 (0)