diff --git a/Sources/SourceKitLSP/Swift/SwiftLanguageService.swift b/Sources/SourceKitLSP/Swift/SwiftLanguageService.swift index 1f4dbae92..e488264e0 100644 --- a/Sources/SourceKitLSP/Swift/SwiftLanguageService.swift +++ b/Sources/SourceKitLSP/Swift/SwiftLanguageService.swift @@ -888,12 +888,15 @@ extension SwiftLanguageService { buildSettings: buildSettings ) return .full(diagnosticReport) - } catch let error as CancellationError { - throw error } catch { // VS Code does not request diagnostics again for a document if the diagnostics request failed. // Since sourcekit-lsp usually recovers from failures (e.g. after sourcekitd crashes), this is undesirable. // Instead of returning an error, return empty results. + // Do forward cancellation because we don't want to clear diagnostics in the client if they cancel the diagnostic + // request. + if ResponseError(error) == .cancelled { + throw error + } logger.error( """ Loading diagnostic failed with the following error. Returning empty diagnostics. diff --git a/Tests/SourceKitLSPTests/PullDiagnosticsTests.swift b/Tests/SourceKitLSPTests/PullDiagnosticsTests.swift index 110d3182b..b22c91d4c 100644 --- a/Tests/SourceKitLSPTests/PullDiagnosticsTests.swift +++ b/Tests/SourceKitLSPTests/PullDiagnosticsTests.swift @@ -337,7 +337,7 @@ final class PullDiagnosticsTests: XCTestCase { let requestID = project.testClient.send( DocumentDiagnosticsRequest(textDocument: TextDocumentIdentifier(uri)) ) { result in - XCTAssertEqual(result.failure?.code, .cancelled) + XCTAssertEqual(result, .failure(ResponseError.cancelled)) diagnosticResponseReceived.fulfill() } project.testClient.send(CancelRequestNotification(id: requestID))