Skip to content

Commit a689a49

Browse files
authored
Merge pull request #838 from bnbarham/revert-actors
Revert ahoppen/toolchain-language-servers-actor
2 parents 34c298c + 7625325 commit a689a49

27 files changed

+1246
-1287
lines changed

Sources/LSPLogging/Logging.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,6 @@ public func orLog<R>(
6262
}
6363
}
6464

65-
/// Like `try?`, but logs the error on failure.
66-
public func orLog<R>(
67-
_ prefix: String = "",
68-
level: LogLevel = .default,
69-
logger: Logger = Logger.shared,
70-
_ block: () async throws -> R?) async -> R?
71-
{
72-
do {
73-
return try await block()
74-
} catch {
75-
logger.log("\(prefix)\(prefix.isEmpty ? "" : " ")\(error)", level: level)
76-
return nil
77-
}
78-
}
79-
80-
8165
/// Logs the time that the given block takes to execute in milliseconds.
8266
public func logExecutionTime<R>(
8367
_ prefix: String = #function,

Sources/LanguageServerProtocol/Requests/CodeActionRequest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
public typealias CodeActionProviderCompletion = (LSPResult<[CodeAction]>) -> Void
14-
public typealias CodeActionProvider = (CodeActionRequest, @escaping CodeActionProviderCompletion) async -> Void
14+
public typealias CodeActionProvider = (CodeActionRequest, @escaping CodeActionProviderCompletion) -> Void
1515

1616
/// Request for returning all possible code actions for a given text document and range.
1717
///

Sources/LanguageServerProtocolJSONRPC/JSONRPCConnection.swift

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -286,22 +286,14 @@ public final class JSONRPCConnection {
286286
await notification._handle(self.receiveHandler!, connection: self)
287287
}
288288
case .request(let request, id: let id):
289+
let semaphore: DispatchSemaphore? = syncRequests ? .init(value: 0) : nil
289290
messageHandlingQueue.async {
290-
if self.syncRequests {
291-
await withCheckedContinuation { continuation in
292-
Task {
293-
await request._handle(self.receiveHandler!, id: id, connection: self) { (response, id) in
294-
self.sendReply(response, id: id)
295-
continuation.resume()
296-
}
297-
}
298-
}
299-
} else {
300-
await request._handle(self.receiveHandler!, id: id, connection: self) { (response, id) in
301-
self.sendReply(response, id: id)
302-
}
291+
await request._handle(self.receiveHandler!, id: id, connection: self) { (response, id) in
292+
self.sendReply(response, id: id)
303293
}
294+
semaphore?.signal()
304295
}
296+
semaphore?.wait()
305297

306298
case .response(let response, id: let id):
307299
guard let outstanding = outstandingRequests.removeValue(forKey: id) else {

Sources/SKCore/BuildServerBuildSystem.swift

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ public final class BuildServerBuildSystem: MessageHandler {
6565
/// Delegate to handle any build system events.
6666
public weak var delegate: BuildSystemDelegate?
6767

68-
/// The build settings that have been received from the build server.
69-
private var buildSettings: [DocumentURI: FileBuildSettings] = [:]
70-
7168
public init(projectRoot: AbsolutePath, buildFolder: AbsolutePath?, fileSystem: FileSystem = localFileSystem) throws {
7269
let configPath = projectRoot.appending(component: "buildServer.json")
7370
let config = try loadBuildServerConfig(path: configPath, fileSystem: fileSystem)
@@ -198,18 +195,7 @@ public final class BuildServerBuildSystem: MessageHandler {
198195
let result = notification.params.updatedOptions
199196
let settings = FileBuildSettings(
200197
compilerArguments: result.options, workingDirectory: result.workingDirectory)
201-
self.buildSettingsChanged(for: notification.params.uri, settings: settings)
202-
}
203-
204-
/// Record the new build settings for the given document and inform the delegate
205-
/// about the changed build settings.
206-
private func buildSettingsChanged(for document: DocumentURI, settings: FileBuildSettings?) {
207-
buildSettings[document] = settings
208-
if let settings {
209-
self.delegate?.fileBuildSettingsChanged([document: .modified(settings)])
210-
} else {
211-
self.delegate?.fileBuildSettingsChanged([document: .removedOrUnavailable])
212-
}
198+
self.delegate?.fileBuildSettingsChanged([notification.params.uri: .modified(settings)])
213199
}
214200
}
215201

@@ -222,14 +208,19 @@ private func readReponseDataKey(data: LSPAny?, key: String) -> String? {
222208
return nil
223209
}
224210

225-
extension BuildServerBuildSystem: BuildSystem {
226-
/// The build settings for the given file.
227-
///
228-
/// Returns `nil` if no build settings have been received from the build
229-
/// server yet or if no build settings are available for this file.
230-
public func buildSettings(for document: DocumentURI, language: Language) async throws -> FileBuildSettings? {
231-
return buildSettings[document]
211+
extension BuildServerBuildSystem {
212+
/// Exposed for *testing*.
213+
public func _settings(for uri: DocumentURI) -> FileBuildSettings? {
214+
if let response = try? self.buildServer?.sendSync(SourceKitOptions(uri: uri)) {
215+
return FileBuildSettings(
216+
compilerArguments: response.options,
217+
workingDirectory: response.workingDirectory)
218+
}
219+
return nil
232220
}
221+
}
222+
223+
extension BuildServerBuildSystem: BuildSystem {
233224

234225
public func registerForChangeNotifications(for uri: DocumentURI, language: Language) {
235226
let request = RegisterForChanges(uri: uri, action: .register)
@@ -239,7 +230,7 @@ extension BuildServerBuildSystem: BuildSystem {
239230

240231
// BuildServer registration failed, so tell our delegate that no build
241232
// settings are available.
242-
self.buildSettingsChanged(for: uri, settings: nil)
233+
self.delegate?.fileBuildSettingsChanged([uri: .removedOrUnavailable])
243234
}
244235
})
245236
}

Sources/SKCore/BuildSystem.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,6 @@ public protocol BuildSystem: AnyObject {
5151
/// initial reports as well as changes.
5252
var delegate: BuildSystemDelegate? { get set }
5353

54-
/// Retrieve build settings for the given document with the given source
55-
/// language.
56-
///
57-
/// Returns `nil` if the build system can't provide build settings for this
58-
/// file or if it hasn't computed build settings for the file yet.
59-
func buildSettings(for document: DocumentURI, language: Language) async throws -> FileBuildSettings?
60-
6154
/// Register the given file for build-system level change notifications, such
6255
/// as command line flag changes, dependency changes, etc.
6356
///

Sources/SKCore/BuildSystemManager.swift

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -146,41 +146,6 @@ extension BuildSystemManager {
146146
set { queue.sync { _mainFilesProvider = newValue } }
147147
}
148148

149-
/// Get the build settings for the given document, assuming it has the given
150-
/// language.
151-
///
152-
/// Returns `nil` if no build settings are available in the build system and
153-
/// no fallback build settings can be computed.
154-
///
155-
/// `isFallback` is `true` if the build settings couldn't be computed and
156-
/// fallback settings are used. These fallback settings are most likely not
157-
/// correct and provide limited semantic functionality.
158-
public func buildSettings(
159-
for document: DocumentURI,
160-
language: Language
161-
) async -> (buildSettings: FileBuildSettings, isFallback: Bool)? {
162-
do {
163-
// FIXME: (async) We should only wait `fallbackSettingsTimeout` for build
164-
// settings and return fallback afterwards. I am not sure yet, how best to
165-
// implement that with Swift concurrency.
166-
// For now, this should be fine because all build systems return
167-
// very quickly from `settings(for:language:)`.
168-
if let settings = try await buildSystem?.buildSettings(for: document, language: language) {
169-
return (buildSettings: settings, isFallback: false)
170-
}
171-
} catch {
172-
log("Getting build settings failed: \(error)")
173-
}
174-
if let settings = fallbackBuildSystem?.buildSettings(for: document, language: language) {
175-
// If there is no build system and we only have the fallback build system,
176-
// we will never get real build settings. Consider the build settings
177-
// non-fallback.
178-
return (buildSettings: settings, isFallback: buildSystem != nil)
179-
} else {
180-
return nil
181-
}
182-
}
183-
184149
public func registerForChangeNotifications(for uri: DocumentURI, language: Language) {
185150
return queue.async {
186151
log("registerForChangeNotifications(\(uri.pseudoPath))")
@@ -257,7 +222,7 @@ extension BuildSystemManager {
257222
} else if let fallback = self.fallbackBuildSystem {
258223
// Only have a fallback build system. We consider it be a primary build
259224
// system that functions synchronously.
260-
if let settings = fallback.buildSettings(for: mainFile, language: language) {
225+
if let settings = fallback.settings(for: mainFile, language) {
261226
newStatus = .primary(settings)
262227
} else {
263228
newStatus = .unsupported
@@ -270,7 +235,7 @@ extension BuildSystemManager {
270235
}
271236

272237
/// *Must be called on queue*. Update and notify our delegate for the given
273-
/// main file changes if they are convertible into `FileBuildSettingsChange`.
238+
/// main file changes if they are convertable into `FileBuildSettingsChange`.
274239
func updateAndNotifyStatuses(changes: [DocumentURI: MainFileStatus]) {
275240
var changedWatchedFiles = [DocumentURI: FileBuildSettingsChange]()
276241
for (mainFile, status) in changes {
@@ -314,11 +279,11 @@ extension BuildSystemManager {
314279
_ fallback: FallbackBuildSystem
315280
) {
316281
// There won't be a current status if it's unreferenced by any watched file.
317-
// Similarly, if the status isn't `waiting` then there's nothing to do.
282+
// Simiarly, if the status isn't `waiting` then there's nothing to do.
318283
guard let status = self.mainFileStatuses[mainFile], status == .waiting else {
319284
return
320285
}
321-
if let settings = fallback.buildSettings(for: mainFile, language: language) {
286+
if let settings = fallback.settings(for: mainFile, language) {
322287
self.updateAndNotifyStatuses(changes: [mainFile: .waitingUsingFallback(settings)])
323288
} else {
324289
// Keep the status as waiting.
@@ -371,9 +336,9 @@ extension BuildSystemManager: BuildSystemDelegate {
371336
newStatus = settingsChange.isFallback ? .fallback(newSettings) : .primary(newSettings)
372337
} else if let fallback = self.fallbackBuildSystem {
373338
// FIXME: we need to stop threading the language everywhere, or we need the build system
374-
// itself to pass it in here. Or alternatively cache the fallback settings/language earlier?
339+
// itself to pass it in here. Or alteratively cache the fallback settings/language earlier?
375340
let language = firstWatch.value.language
376-
if let settings = fallback.buildSettings(for: mainFile, language: language) {
341+
if let settings = fallback.settings(for: mainFile, language) {
377342
newStatus = .fallback(settings)
378343
} else {
379344
newStatus = .unsupported

Sources/SKCore/CompilationDatabaseBuildSystem.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,6 @@ extension CompilationDatabaseBuildSystem: BuildSystem {
9393

9494
public var indexPrefixMappings: [PathPrefixMapping] { return [] }
9595

96-
public func buildSettings(for document: DocumentURI, language: Language) async throws -> FileBuildSettings? {
97-
// FIXME: (async) Convert this to an async function once `CompilationDatabaseBuildSystem` is an actor.
98-
return await withCheckedContinuation { continuation in
99-
self.queue.async {
100-
continuation.resume(returning: self.settings(for: document))
101-
}
102-
}
103-
}
104-
10596
public func registerForChangeNotifications(for uri: DocumentURI, language: Language) {
10697
queue.async {
10798
self.watchedFiles[uri] = language

Sources/SKCore/FallbackBuildSystem.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public final class FallbackBuildSystem: BuildSystem {
4444

4545
public var indexPrefixMappings: [PathPrefixMapping] { return [] }
4646

47-
public func buildSettings(for uri: DocumentURI, language: Language) -> FileBuildSettings? {
47+
public func settings(for uri: DocumentURI, _ language: Language) -> FileBuildSettings? {
4848
switch language {
4949
case .swift:
5050
return settingsSwift(uri.pseudoPath)
@@ -58,7 +58,7 @@ public final class FallbackBuildSystem: BuildSystem {
5858
public func registerForChangeNotifications(for uri: DocumentURI, language: Language) {
5959
guard let delegate = self.delegate else { return }
6060

61-
let settings = self.buildSettings(for: uri, language: language)
61+
let settings = self.settings(for: uri, language)
6262
DispatchQueue.global().async {
6363
delegate.fileBuildSettingsChanged([uri: FileBuildSettingsChange(settings)])
6464
}

Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -290,18 +290,6 @@ extension SwiftPMWorkspace: SKCore.BuildSystem {
290290
}
291291
}
292292

293-
public func buildSettings(for document: DocumentURI, language: Language) async throws -> FileBuildSettings? {
294-
return try await withCheckedThrowingContinuation { continuation in
295-
queue.async {
296-
do {
297-
continuation.resume(returning: try self.settings(for: document, language))
298-
} catch {
299-
continuation.resume(throwing: error)
300-
}
301-
}
302-
}
303-
}
304-
305293
/// Must only be called on `queue`.
306294
private func settings(
307295
for uri: DocumentURI,

0 commit comments

Comments
 (0)