From d6c298824c93b3ccb184106653cceed41d8ef91f Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Sat, 2 Nov 2024 16:56:54 +0100 Subject: [PATCH 1/3] fix: cancel pending requests as early as possible --- plugin/session_buffer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugin/session_buffer.py b/plugin/session_buffer.py index 28b7e6b96..10b53fbad 100644 --- a/plugin/session_buffer.py +++ b/plugin/session_buffer.py @@ -311,9 +311,18 @@ def on_text_changed_async(self, view: sublime.View, change_count: int, self._pending_changes.update(change_count, changes) purge = True if purge: + self._cancel_pending_requests_async() debounced(lambda: self.purge_changes_async(view), FEATURES_TIMEOUT, lambda: view.is_valid() and change_count == view.change_count(), async_thread=True) + def _cancel_pending_requests_async(self) -> None: + if self._document_diagnostic_pending_request: + self.session.cancel_request(self._document_diagnostic_pending_request.request_id) + self._document_diagnostic_pending_request = None + if self.semantic_tokens.pending_response: + self.session.cancel_request(self.semantic_tokens.pending_response) + self.semantic_tokens.pending_response = None + def on_revert_async(self, view: sublime.View) -> None: self._pending_changes = None # Don't bother with pending changes version = view.change_count() From a74d5219d4a7d39716eeb35b7ea488fb2b364e8e Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Sat, 2 Nov 2024 22:49:10 +0100 Subject: [PATCH 2/3] handle corner case --- plugin/core/sessions.py | 12 +++++++----- plugin/session_buffer.py | 6 ++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/plugin/core/sessions.py b/plugin/core/sessions.py index beabce998..fb8603543 100644 --- a/plugin/core/sessions.py +++ b/plugin/core/sessions.py @@ -671,7 +671,7 @@ def update_document_link(self, new_link: DocumentLink) -> None: def do_semantic_tokens_async(self, view: sublime.View) -> None: ... - def set_semantic_tokens_pending_refresh(self, needs_refresh: bool = True) -> None: + def set_semantic_tokens_pending_refresh(self, needs_refresh: bool = ...) -> None: ... def get_semantic_tokens(self) -> list[Any]: @@ -680,16 +680,18 @@ def get_semantic_tokens(self) -> list[Any]: def do_inlay_hints_async(self, view: sublime.View) -> None: ... - def set_inlay_hints_pending_refresh(self, needs_refresh: bool = True) -> None: + def set_inlay_hints_pending_refresh(self, needs_refresh: bool = ...) -> None: ... def remove_inlay_hint_phantom(self, phantom_uuid: str) -> None: ... - def do_document_diagnostic_async(self, view: sublime.View, version: int | None = None) -> None: + def do_document_diagnostic_async( + self, view: sublime.View, version: int | None = ..., *, ignore_pending: bool = ... + ) -> None: ... - def set_document_diagnostic_pending_refresh(self, needs_refresh: bool = True) -> None: + def set_document_diagnostic_pending_refresh(self, needs_refresh: bool = ...) -> None: ... @@ -2070,7 +2072,7 @@ def m_workspace_diagnostic_refresh(self, params: None, request_id: Any) -> None: self.send_response(Response(request_id, None)) visible_session_views, not_visible_session_views = self.session_views_by_visibility() for sv in visible_session_views: - sv.session_buffer.do_document_diagnostic_async(sv.view) + sv.session_buffer.do_document_diagnostic_async(sv.view, ignore_pending=True) for sv in not_visible_session_views: sv.session_buffer.set_document_diagnostic_pending_refresh() diff --git a/plugin/session_buffer.py b/plugin/session_buffer.py index 10b53fbad..72e089932 100644 --- a/plugin/session_buffer.py +++ b/plugin/session_buffer.py @@ -487,7 +487,9 @@ def update_document_link(self, new_link: DocumentLink) -> None: # --- textDocument/diagnostic -------------------------------------------------------------------------------------- - def do_document_diagnostic_async(self, view: sublime.View, version: int | None = None) -> None: + def do_document_diagnostic_async( + self, view: sublime.View, version: int | None = None, ignore_pending: bool = False + ) -> None: mgr = self.session.manager() if not mgr or not self.has_capability("diagnosticProvider"): return @@ -496,7 +498,7 @@ def do_document_diagnostic_async(self, view: sublime.View, version: int | None = if version is None: version = view.change_count() if self._document_diagnostic_pending_request: - if self._document_diagnostic_pending_request.version == version: + if self._document_diagnostic_pending_request.version == version and not ignore_pending: return self.session.cancel_request(self._document_diagnostic_pending_request.request_id) params: DocumentDiagnosticParams = {'textDocument': text_document_identifier(view)} From bf84b27007e7b476767dca0326593ac65460487c Mon Sep 17 00:00:00 2001 From: Rafal Chlodnicki Date: Mon, 4 Nov 2024 20:51:05 +0100 Subject: [PATCH 3/3] rename argumetn --- plugin/core/sessions.py | 4 ++-- plugin/session_buffer.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/core/sessions.py b/plugin/core/sessions.py index fb8603543..b4392348d 100644 --- a/plugin/core/sessions.py +++ b/plugin/core/sessions.py @@ -687,7 +687,7 @@ def remove_inlay_hint_phantom(self, phantom_uuid: str) -> None: ... def do_document_diagnostic_async( - self, view: sublime.View, version: int | None = ..., *, ignore_pending: bool = ... + self, view: sublime.View, version: int | None = ..., *, forced_update: bool = ... ) -> None: ... @@ -2072,7 +2072,7 @@ def m_workspace_diagnostic_refresh(self, params: None, request_id: Any) -> None: self.send_response(Response(request_id, None)) visible_session_views, not_visible_session_views = self.session_views_by_visibility() for sv in visible_session_views: - sv.session_buffer.do_document_diagnostic_async(sv.view, ignore_pending=True) + sv.session_buffer.do_document_diagnostic_async(sv.view, forced_update=True) for sv in not_visible_session_views: sv.session_buffer.set_document_diagnostic_pending_refresh() diff --git a/plugin/session_buffer.py b/plugin/session_buffer.py index 72e089932..aaa21fb60 100644 --- a/plugin/session_buffer.py +++ b/plugin/session_buffer.py @@ -488,7 +488,7 @@ def update_document_link(self, new_link: DocumentLink) -> None: # --- textDocument/diagnostic -------------------------------------------------------------------------------------- def do_document_diagnostic_async( - self, view: sublime.View, version: int | None = None, ignore_pending: bool = False + self, view: sublime.View, version: int | None = None, forced_update: bool = False ) -> None: mgr = self.session.manager() if not mgr or not self.has_capability("diagnosticProvider"): @@ -498,7 +498,7 @@ def do_document_diagnostic_async( if version is None: version = view.change_count() if self._document_diagnostic_pending_request: - if self._document_diagnostic_pending_request.version == version and not ignore_pending: + if self._document_diagnostic_pending_request.version == version and not forced_update: return self.session.cancel_request(self._document_diagnostic_pending_request.request_id) params: DocumentDiagnosticParams = {'textDocument': text_document_identifier(view)}