From 4c8aea29c3d99cee05b8e78e6a855e6c3dd438c6 Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Mon, 27 Nov 2023 14:46:52 -0800 Subject: [PATCH] Never return error for diagnostics request 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. --- .../SourceKitLSP/Swift/SwiftLanguageServer.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift b/Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift index 8f2321507..bd1635563 100644 --- a/Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift +++ b/Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift @@ -1062,7 +1062,20 @@ extension SwiftLanguageServer { } public func documentDiagnostic(_ req: DocumentDiagnosticsRequest) async throws -> DocumentDiagnosticReport { - return try await .full(fullDocumentDiagnosticReport(req)) + do { + return try await .full(fullDocumentDiagnosticReport(req)) + } 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. + logger.error( + """ + Loading diagnostic failed with the following error. Returning empty diagnostics. + \(error.forLogging) + """ + ) + return .full(RelatedFullDocumentDiagnosticReport(items: [])) + } } private func fullDocumentDiagnosticReport(