Skip to content

Commit e29883a

Browse files
authored
Make DocumentSyncListener more efficient if no server is running (#2532)
1 parent 9065e1f commit e29883a

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

plugin/documents.py

+31-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@
5555
from .session_buffer import SessionBuffer
5656
from .session_view import SessionView
5757
from functools import partial
58-
from typing import Any, Callable, Generator, Iterable
58+
from functools import wraps
59+
from typing import Any, Callable, Generator, Iterable, TypeVar
5960
from typing import cast
61+
from typing_extensions import Concatenate, ParamSpec
6062
from weakref import WeakSet
6163
from weakref import WeakValueDictionary
6264
import itertools
@@ -68,6 +70,24 @@
6870

6971
SUBLIME_WORD_MASK = 515
7072

73+
P = ParamSpec('P')
74+
R = TypeVar('R')
75+
76+
77+
def requires_session(
78+
func: Callable[Concatenate[DocumentSyncListener, P], R]
79+
) -> Callable[Concatenate[DocumentSyncListener, P], R | None]:
80+
"""
81+
A decorator for the `DocumentSyncListener` event handlers, which immediately returns `None` if there are no
82+
`SessionView`s.
83+
"""
84+
@wraps(func)
85+
def wrapper(self: DocumentSyncListener, *args: P.args, **kwargs: P.kwargs) -> R | None:
86+
if not self.session_views_async():
87+
return None
88+
return func(self, *args, **kwargs)
89+
return wrapper
90+
7191

7292
def is_regular_view(v: sublime.View) -> bool:
7393
# Not from the quick panel (CTRL+P), and not a special view like a console, output panel or find-in-files panels.
@@ -327,6 +347,7 @@ def session_buffers_async(self, capability: str | None = None) -> list[SessionBu
327347
def session_views_async(self) -> list[SessionView]:
328348
return list(self._session_views.values())
329349

350+
@requires_session
330351
def on_text_changed_async(self, change_count: int, changes: Iterable[sublime.TextChange]) -> None:
331352
if self.view.is_primary():
332353
for sv in self.session_views_async():
@@ -364,9 +385,12 @@ def on_activated_async(self) -> None:
364385
return
365386
if not self._registered:
366387
self._register_async()
388+
session_views = self.session_views_async()
389+
if not session_views:
390+
return
367391
if userprefs().show_code_actions:
368392
self._do_code_actions_async()
369-
for sv in self.session_views_async():
393+
for sv in session_views:
370394
if sv.code_lenses_needs_refresh:
371395
sv.set_code_lenses_pending_refresh(needs_refresh=False)
372396
sv.start_code_lenses_async()
@@ -381,6 +405,7 @@ def on_activated_async(self) -> None:
381405
sb.set_inlay_hints_pending_refresh(needs_refresh=False)
382406
sb.do_inlay_hints_async(self.view)
383407

408+
@requires_session
384409
def on_selection_modified_async(self) -> None:
385410
first_region, _ = self._update_stored_selection_async()
386411
if first_region is None:
@@ -482,6 +507,7 @@ def on_query_context(self, key: str, operator: int, operand: Any, match_all: boo
482507
return operand == bool(session_view.session_buffer.get_document_link_at_point(self.view, position))
483508
return None
484509

510+
@requires_session
485511
def on_hover(self, point: int, hover_zone: int) -> None:
486512
if self.view.is_popup_visible():
487513
return
@@ -524,6 +550,7 @@ def _on_hover_gutter_async(self, point: int) -> None:
524550
location=point,
525551
on_navigate=lambda href: self._on_navigate(href, point))
526552

553+
@requires_session
527554
def on_text_command(self, command_name: str, args: dict | None) -> tuple[str, dict] | None:
528555
if command_name == "auto_complete":
529556
self._auto_complete_triggered_manually = True
@@ -539,6 +566,7 @@ def on_text_command(self, command_name: str, args: dict | None) -> tuple[str, di
539566
return ('paste', {})
540567
return None
541568

569+
@requires_session
542570
def on_post_text_command(self, command_name: str, args: dict[str, Any] | None) -> None:
543571
if command_name == 'paste':
544572
format_on_paste = self.view.settings().get('lsp_format_on_paste', userprefs().lsp_format_on_paste)
@@ -552,6 +580,7 @@ def on_post_text_command(self, command_name: str, args: dict[str, Any] | None) -
552580
# hide the popup when `esc` or arrows are pressed pressed
553581
self.view.hide_popup()
554582

583+
@requires_session
555584
def on_query_completions(self, prefix: str, locations: list[int]) -> sublime.CompletionList | None:
556585
completion_list = sublime.CompletionList()
557586
triggered_manually = self._auto_complete_triggered_manually

0 commit comments

Comments
 (0)