Skip to content

Commit 7bbfa9e

Browse files
authored
fix: skip diagnostics pull if diagnostics already received (#2623)
1 parent 4651aa1 commit 7bbfa9e

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

plugin/documents.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,8 @@ def on_session_shutdown_async(self, session: Session) -> None:
277277
def _diagnostics_async(
278278
self, allow_stale: bool = False
279279
) -> Generator[tuple[SessionBufferProtocol, list[tuple[Diagnostic, sublime.Region]]], None, None]:
280-
change_count = self.view.change_count()
281280
for sb in self.session_buffers_async():
282-
if sb.diagnostics_version == change_count or allow_stale:
281+
if sb.has_latest_diagnostics() or allow_stale:
283282
yield sb, sb.diagnostics
284283

285284
def diagnostics_intersecting_region_async(

plugin/session_buffer.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def __init__(self, session_view: SessionViewProtocol, buffer_id: int, uri: Docum
128128
self._pending_changes: PendingChanges | None = None
129129
self.diagnostics: list[tuple[Diagnostic, sublime.Region]] = []
130130
self.diagnostics_data_per_severity: dict[tuple[int, bool], DiagnosticSeverityData] = {}
131-
self.diagnostics_version = -1
131+
self._diagnostics_version = -1
132132
self.diagnostics_flags = 0
133133
self._diagnostics_are_visible = False
134134
self.document_diagnostic_needs_refresh = False
@@ -496,8 +496,13 @@ def do_document_diagnostic_async(
496496
return
497497
if mgr.should_ignore_diagnostics(self._last_known_uri, self.session.config):
498498
return
499+
change_count = view.change_count()
499500
if version is None:
500-
version = view.change_count()
501+
version = change_count
502+
elif version < change_count:
503+
return
504+
if version == self._diagnostics_version:
505+
return
501506
if self._document_diagnostic_pending_request:
502507
if self._document_diagnostic_pending_request.version == version and not forced_update:
503508
return
@@ -520,18 +525,17 @@ def _on_document_diagnostic_async(self, version: int, response: DocumentDiagnost
520525
self._document_diagnostic_pending_request = None
521526
self._if_view_unchanged(self._apply_document_diagnostic_async, version)(response)
522527

523-
def _apply_document_diagnostic_async(
524-
self, view: sublime.View | None, response: DocumentDiagnosticReport
525-
) -> None:
528+
def _apply_document_diagnostic_async(self, view: sublime.View | None, response: DocumentDiagnosticReport) -> None:
526529
self.session.diagnostics_result_ids[self._last_known_uri] = response.get('resultId')
527530
if is_full_document_diagnostic_report(response):
528531
self.session.m_textDocument_publishDiagnostics(
529532
{'uri': self._last_known_uri, 'diagnostics': response['items']})
530-
for uri, diagnostic_report in response.get('relatedDocuments', {}):
531-
sb = self.session.get_session_buffer_for_uri_async(uri)
532-
if sb:
533-
cast(SessionBuffer, sb)._apply_document_diagnostic_async(
534-
None, cast(DocumentDiagnosticReport, diagnostic_report))
533+
if 'relatedDocuments' in response:
534+
for uri, diagnostic_report in response['relatedDocuments'].items():
535+
sb = self.session.get_session_buffer_for_uri_async(uri)
536+
if sb:
537+
cast(SessionBuffer, sb)._apply_document_diagnostic_async(
538+
None, cast(DocumentDiagnosticReport, diagnostic_report))
535539

536540
def _on_document_diagnostic_error_async(self, version: int, error: ResponseError) -> None:
537541
self._document_diagnostic_pending_request = None
@@ -580,7 +584,7 @@ def on_diagnostics_async(
580584
self.diagnostics_data_per_severity = data_per_severity
581585

582586
def present() -> None:
583-
self.diagnostics_version = diagnostics_version
587+
self._diagnostics_version = diagnostics_version
584588
self.diagnostics = diagnostics
585589
self._diagnostics_are_visible = bool(diagnostics)
586590
for sv in self.session_views:
@@ -604,6 +608,12 @@ def present() -> None:
604608
condition=lambda: bool(view and view.is_valid() and view.change_count() == diagnostics_version),
605609
)
606610

611+
def has_latest_diagnostics(self) -> bool:
612+
view = self.some_view()
613+
if view is None:
614+
return False
615+
return self._diagnostics_version == view.change_count()
616+
607617
# --- textDocument/semanticTokens ----------------------------------------------------------------------------------
608618

609619
def do_semantic_tokens_async(self, view: sublime.View, only_viewport: bool = False) -> None:

0 commit comments

Comments
 (0)