Skip to content

Commit c006e6d

Browse files
authored
Add selector API in AbstractPlugin (#2620)
1 parent 7bbfa9e commit c006e6d

File tree

5 files changed

+36
-18
lines changed

5 files changed

+36
-18
lines changed

plugin/core/configurations.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
class WindowConfigChangeListener(metaclass=ABCMeta):
2222

2323
@abstractmethod
24-
def on_configs_changed(self, config_name: str | None = None) -> None:
25-
raise NotImplementedError()
24+
def on_configs_changed(self, configs: list[ClientConfig]) -> None:
25+
raise NotImplementedError
2626

2727

2828
class WindowConfigManager:
@@ -54,7 +54,7 @@ def match_view(self, view: sublime.View, include_disabled: bool = False) -> Gene
5454
return
5555
scheme = parse_uri(uri)[0]
5656
for config in self.all.values():
57-
if config.match_view(view, scheme) and (config.enabled or include_disabled):
57+
if (config.enabled or include_disabled) and config.match_view(view, scheme):
5858
yield config
5959
except (IndexError, RuntimeError):
6060
pass
@@ -65,6 +65,7 @@ def update(self, updated_config_name: str | None = None) -> None:
6565
def _reload_configs(self, updated_config_name: str | None = None, notify_listeners: bool = False) -> None:
6666
project_data = self._window.project_data()
6767
project_settings = project_data.get("settings", {}).get("LSP", {}) if isinstance(project_data, dict) else {}
68+
updated_configs: list[ClientConfig] = []
6869
if updated_config_name is None:
6970
self.all.clear()
7071
for name, config in self._global_configs.items():
@@ -77,18 +78,22 @@ def _reload_configs(self, updated_config_name: str | None = None, notify_listene
7778
overrides = {}
7879
if name in self._disabled_for_session:
7980
overrides["enabled"] = False
80-
self.all[name] = ClientConfig.from_config(config, overrides)
81+
updated_config = ClientConfig.from_config(config, overrides)
82+
self.all[name] = updated_config
83+
updated_configs.append(updated_config)
8184
for name, c in project_settings.items():
8285
if updated_config_name and updated_config_name != name:
8386
continue
8487
debug("loading project-only configuration", name)
8588
try:
86-
self.all[name] = ClientConfig.from_dict(name, c)
89+
updated_config = ClientConfig.from_dict(name, c)
90+
self.all[name] = updated_config
91+
updated_configs.append(updated_config)
8792
except Exception as ex:
8893
exception_log(f"failed to load project-only configuration {name}", ex)
8994
if notify_listeners:
9095
for listener in self._change_listeners:
91-
listener.on_configs_changed(updated_config_name)
96+
listener.on_configs_changed(updated_configs)
9297

9398
def enable_config(self, config_name: str) -> None:
9499
if not self._reenable_disabled_for_session(config_name):

plugin/core/registry.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,7 @@ def restart_server(self, wm: WindowManager, index: int) -> None:
227227
return
228228

229229
def run_async() -> None:
230-
config_name = self._config_names[index]
231-
if config_name:
232-
wm.restart_sessions_async(config_name)
230+
wm.restart_sessions_async([self._config_names[index]])
233231

234232
sublime.set_timeout_async(run_async)
235233

plugin/core/sessions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,16 @@ def configuration(cls) -> tuple[sublime.Settings, str]:
862862
filepath = f"Packages/LSP-{name}/{basename}"
863863
return sublime.load_settings(basename), filepath
864864

865+
@classmethod
866+
def selector(cls, view: sublime.View, config: ClientConfig) -> str:
867+
"""
868+
Override the default selector used to determine whether server should run on the given view.
869+
870+
:param view: The view
871+
:param config: The config
872+
"""
873+
return config.selector
874+
865875
@classmethod
866876
def additional_variables(cls) -> dict[str, str] | None:
867877
"""

plugin/core/types.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,10 +849,12 @@ def erase_view_status(self, view: sublime.View) -> None:
849849
view.erase_status(self.status_key)
850850

851851
def match_view(self, view: sublime.View, scheme: str) -> bool:
852+
from .sessions import get_plugin
852853
syntax = view.syntax()
853854
if not syntax:
854855
return False
855-
selector = self.selector.strip()
856+
plugin = get_plugin(self.name)
857+
selector = plugin.selector(view, self).strip() if plugin else self.selector.strip()
856858
if not selector:
857859
return False
858860
return scheme in self.schemes and sublime.score_selector(syntax.scope, selector) > 0

plugin/core/windows.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ def _dequeue_listener_async(self) -> None:
163163
listener = self._pending_listeners.pop()
164164
if not listener.view.is_valid():
165165
# debug("listener", listener, "is no longer valid")
166-
return self._dequeue_listener_async()
166+
self._dequeue_listener_async()
167+
return
167168
# debug("adding new pending listener", listener)
168169
self._listeners.add(listener)
169170
except IndexError:
@@ -269,7 +270,8 @@ def start_async(self, config: ClientConfig, initiating_view: sublime.View) -> No
269270
# Continue with handling pending listeners
270271
self._new_session = None
271272
sublime.set_timeout_async(self._dequeue_listener_async)
272-
return self._window.status_message(message)
273+
self._window.status_message(message)
274+
return
273275
cwd = plugin_class.on_pre_start(self._window, initiating_view, workspace_folders, config)
274276
config.set_view_status(initiating_view, "starting...")
275277
session = Session(self, self._create_logger(config.name), workspace_folders, config, plugin_class)
@@ -341,17 +343,17 @@ def handle_message_request(self, session: Session, params: Any, request_id: Any)
341343
if view:
342344
MessageRequestHandler(view, session, request_id, params, session.config.name).show()
343345

344-
def restart_sessions_async(self, config_name: str | None = None) -> None:
345-
self._end_sessions_async(config_name)
346+
def restart_sessions_async(self, config_names: list[str]) -> None:
347+
self._end_sessions_async(config_names)
346348
listeners = list(self._listeners)
347349
self._listeners.clear()
348350
for listener in listeners:
349351
self.register_listener_async(listener)
350352

351-
def _end_sessions_async(self, config_name: str | None = None) -> None:
353+
def _end_sessions_async(self, config_names: list[str] | None = None) -> None:
352354
sessions = list(self._sessions)
353355
for session in sessions:
354-
if config_name is None or config_name == session.config.name:
356+
if config_names is None or session.config.name in config_names:
355357
session.end_async()
356358
self._sessions.discard(session)
357359

@@ -515,8 +517,9 @@ def _update_panel_main_thread(self, characters: str, prephantoms: list[tuple[int
515517

516518
# --- Implements WindowConfigChangeListener ------------------------------------------------------------------------
517519

518-
def on_configs_changed(self, config_name: str | None = None) -> None:
519-
sublime.set_timeout_async(lambda: self.restart_sessions_async(config_name))
520+
def on_configs_changed(self, configs: list[ClientConfig]) -> None:
521+
config_names = [config.name for config in configs]
522+
sublime.set_timeout_async(lambda: self.restart_sessions_async(config_names))
520523

521524

522525
class WindowRegistry(LspSettingsChangeListener):

0 commit comments

Comments
 (0)