Skip to content

Commit 5f6e58a

Browse files
authored
Merge pull request #1718 from ahoppen/swift-5.10-again
Make SourceKit-LSP build using a Swift 5.10 compiler again
2 parents c96fff1 + fb5ee8e commit 5f6e58a

25 files changed

+528
-21
lines changed

Contributor Documentation/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ The following documentation documents are primarily intended for developers of S
88
- [Logging](Logging.md)
99
- [Modules](Modules.md)
1010
- [Overview](Overview.md)
11+
- [Swift Version](Swift%20Version.md)
1112
- [Testing](Testing.md)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Swift Version
2+
3+
SourceKit-LSP currently needs to be able to build and pass tests using a Swift 5.10 compiler.

Sources/BuildSystemIntegration/BuildSystemManager.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -468,22 +468,22 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
468468
} else {
469469
nil
470470
}
471-
self.cachedSourceKitOptions.clear { cacheKey in
471+
self.cachedSourceKitOptions.clear(isolation: self) { cacheKey in
472472
guard let updatedTargets else {
473473
// All targets might have changed
474474
return true
475475
}
476476
return updatedTargets.contains(cacheKey.target)
477477
}
478-
self.cachedBuildTargets.clearAll()
479-
self.cachedTargetSources.clear { cacheKey in
478+
self.cachedBuildTargets.clearAll(isolation: self)
479+
self.cachedTargetSources.clear(isolation: self) { cacheKey in
480480
guard let updatedTargets else {
481481
// All targets might have changed
482482
return true
483483
}
484484
return !updatedTargets.intersection(cacheKey.targets).isEmpty
485485
}
486-
self.cachedSourceFilesAndDirectories.clearAll()
486+
self.cachedSourceFilesAndDirectories.clearAll(isolation: self)
487487

488488
await delegate?.buildTargetsChanged(notification.changes)
489489
await delegate?.fileBuildSettingsChanged(Set(watchedFiles.keys))
@@ -680,7 +680,7 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
680680
// For now, this should be fine because all build systems return
681681
// very quickly from `settings(for:language:)`.
682682
// https://github.com/apple/sourcekit-lsp/issues/1181
683-
let response = try await cachedSourceKitOptions.get(request) { request in
683+
let response = try await cachedSourceKitOptions.get(request, isolation: self) { request in
684684
try await buildSystemAdapter.send(request)
685685
}
686686
guard let response else {
@@ -873,7 +873,7 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
873873
}
874874

875875
let request = WorkspaceBuildTargetsRequest()
876-
let result = try await cachedBuildTargets.get(request) { request in
876+
let result = try await cachedBuildTargets.get(request, isolation: self) { request in
877877
let buildTargets = try await buildSystemAdapter.send(request).targets
878878
let (depths, dependents) = await self.targetDepthsAndDependents(for: buildTargets)
879879
var result: [BuildTargetIdentifier: BuildTargetInfo] = [:]
@@ -917,7 +917,7 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
917917

918918
// If we have a cached request for a superset of the targets, serve the result from that cache entry.
919919
let fromSuperset = await orLog("Getting source files from superset request") {
920-
try await cachedTargetSources.get { request in
920+
try await cachedTargetSources.get(isolation: self) { request in
921921
targets.isSubset(of: request.targets)
922922
} transform: { response in
923923
return BuildTargetSourcesResponse(items: response.items.filter { targets.contains($0.target) })
@@ -928,7 +928,7 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
928928
}
929929

930930
let request = BuildTargetSourcesRequest(targets: targets.sorted { $0.uri.stringValue < $1.uri.stringValue })
931-
let response = try await cachedTargetSources.get(request) { request in
931+
let response = try await cachedTargetSources.get(request, isolation: self) { request in
932932
try await buildSystemAdapter.send(request)
933933
}
934934
return response.items
@@ -959,7 +959,7 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
959959
sourcesItems: sourcesItems
960960
)
961961

962-
return try await cachedSourceFilesAndDirectories.get(key) { key in
962+
return try await cachedSourceFilesAndDirectories.get(key, isolation: self) { key in
963963
var files: [DocumentURI: SourceFileInfo] = [:]
964964
var directories: [DocumentURI: SourceFileInfo] = [:]
965965
for sourcesItem in key.sourcesItems {

Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,23 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem {
448448

449449
throw NonFileURIError(uri: file)
450450
}
451-
return try buildTarget.compileArguments(for: fileURL)
451+
let compileArguments = try buildTarget.compileArguments(for: fileURL)
452+
453+
#if compiler(>=6.1)
454+
#warning("When we drop support for Swift 5.10 we no longer need to adjust compiler arguments for the Modules move")
455+
#endif
456+
// Fix up compiler arguments that point to a `/Modules` subdirectory if the Swift version in the toolchain is less
457+
// than 6.0 because it places the modules one level higher up.
458+
let toolchainVersion = await orLog("Getting Swift version") { try await toolchain.swiftVersion }
459+
guard let toolchainVersion, toolchainVersion < SwiftVersion(6, 0) else {
460+
return compileArguments
461+
}
462+
return compileArguments.map { argument in
463+
if argument.hasSuffix("/Modules"), argument.contains(self.swiftPMWorkspace.location.scratchDirectory.pathString) {
464+
return String(argument.dropLast(8))
465+
}
466+
return argument
467+
}
452468
}
453469

454470
package func buildTargets(request: WorkspaceBuildTargetsRequest) async throws -> WorkspaceBuildTargetsResponse {

Sources/SKLogging/Logging.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@ package typealias LogLevel = os.OSLogType
1919
package typealias Logger = os.Logger
2020
package typealias Signposter = OSSignposter
2121

22+
#if compiler(<5.11)
23+
extension OSSignposter: @unchecked Sendable {}
24+
extension OSSignpostID: @unchecked Sendable {}
25+
extension OSSignpostIntervalState: @unchecked Sendable {}
26+
#else
2227
extension OSSignposter: @retroactive @unchecked Sendable {}
2328
extension OSSignpostID: @retroactive @unchecked Sendable {}
2429
extension OSSignpostIntervalState: @retroactive @unchecked Sendable {}
30+
#endif
2531

2632
extension os.Logger {
2733
package func makeSignposter() -> Signposter {

0 commit comments

Comments
 (0)