swiftlang / sourcekit-lsp

Language Server Protocol implementation for Swift and C-based languages
Apache License 2.0
3.3k stars 273 forks source link

Don’t cancel in-progress diagnostic generation when calling `DiagnosticReportManager.removeItemsFromCache` #1414

Closed ahoppen closed 4 months ago

ahoppen commented 4 months ago

This was causing a non-deterministic test failure: When target preparation finishes while a diagnostic request is in progress, it will re-open the document, which calls DiagnosticReportManager.removeItemsFromCache for that document’s URI. With the old implementation, we would thus cancel the diagnostics sourcekitd request and return a cancelled error to the diagnostics LSP request.

While doing this, I also realized that there was a race condition: Document re-opening would happen outside of the SourceKit-LSP message handling queue and could thus run concurrently to any other request. This means that a sourcekitd request could run after reopenDocument had closed the document but before it was opened again. Introduce an internal reopen request that can be handled on the main message handling queue and thus doesn’t have this problem

ahoppen commented 4 months ago

@swift-ci Please test