Skip to content

Commit deb7fbf

Browse files
authored
Trigger diagnostic requests after provider registration (#2766)
1 parent 98d391a commit deb7fbf

1 file changed

Lines changed: 51 additions & 47 deletions

File tree

plugin/core/sessions.py

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,8 +1499,7 @@ def register_session_buffer_async(self, sb: SessionBufferProtocol) -> None:
14991499
def _publish_diagnostics_to_session_buffer_async(
15001500
self, sb: SessionBufferProtocol, diagnostics: list[Diagnostic], version: int | None = None
15011501
) -> None:
1502-
visible_session_views, _ = self.session_views_by_visibility()
1503-
sb.on_diagnostics_async(diagnostics, version, visible_session_views)
1502+
sb.on_diagnostics_async(diagnostics, version, self.visible_session_views())
15041503

15051504
def unregister_session_buffer_async(self, sb: SessionBufferProtocol) -> None:
15061505
self._session_buffers.discard(sb)
@@ -2099,24 +2098,25 @@ def decode_semantic_token(
20992098
return decode_semantic_token(
21002099
types_legend, modifiers_legend, self._semantic_tokens_map, token_type_encoded, token_modifiers_encoded)
21012100

2102-
def session_views_by_visibility(self) -> tuple[set[SessionViewProtocol], set[SessionViewProtocol]]:
2103-
visible_session_views: set[SessionViewProtocol] = set()
2104-
not_visible_session_views: set[SessionViewProtocol] = set()
2105-
selected_sheets: set[sublime.Sheet] = set()
2106-
for group in range(self.window.num_groups()):
2107-
selected_sheets = selected_sheets.union(self.window.selected_sheets_in_group(group))
2108-
for sheet in self.window.sheets():
2109-
view = sheet.view()
2110-
if not view:
2111-
continue
2112-
sv = self.session_view_for_view_async(view)
2113-
if not sv:
2114-
continue
2115-
if sheet in selected_sheets:
2116-
visible_session_views.add(sv)
2101+
def session_buffers_by_visibility(
2102+
self
2103+
) -> tuple[list[tuple[SessionBufferProtocol, SessionViewProtocol]], list[SessionBufferProtocol]]:
2104+
selected_sheets = set(itertools.chain.from_iterable(
2105+
self.window.selected_sheets_in_group(group) for group in range(self.window.num_groups())
2106+
))
2107+
visible_session_buffers: list[tuple[SessionBufferProtocol, SessionViewProtocol]] = []
2108+
not_visible_session_buffers: list[SessionBufferProtocol] = []
2109+
for session_buffer in self.session_buffers_async():
2110+
for session_view in session_buffer.session_views:
2111+
if (sheet := session_view.view.sheet()) and sheet in selected_sheets:
2112+
visible_session_buffers.append((session_buffer, session_view))
2113+
break
21172114
else:
2118-
not_visible_session_views.add(sv)
2119-
return visible_session_views, not_visible_session_views
2115+
not_visible_session_buffers.append(session_buffer)
2116+
return visible_session_buffers, not_visible_session_buffers
2117+
2118+
def visible_session_views(self) -> set[SessionViewProtocol]:
2119+
return set(sv for sv in self.session_views_async() if (sheet := sv.view.sheet()) and sheet.is_selected())
21202120

21212121
# --- Workspace Pull Diagnostics -----------------------------------------------------------------------------------
21222122

@@ -2225,11 +2225,11 @@ def on_workspace_apply_edit(self, params: ApplyWorkspaceEditParams) -> Promise[A
22252225
def on_workspace_code_lens_refresh(self, _: None) -> Promise[None]:
22262226

22272227
def continue_after_response() -> None:
2228-
visible_session_views, not_visible_session_views = self.session_views_by_visibility()
2229-
for sv in visible_session_views:
2230-
sv.session_buffer.do_code_lenses_async(sv.view)
2231-
for sv in not_visible_session_views:
2232-
sv.session_buffer.set_code_lenses_pending_refresh()
2228+
visible_session_buffers, not_visible_session_buffers = self.session_buffers_by_visibility()
2229+
for session_buffer, session_view in visible_session_buffers:
2230+
session_buffer.do_code_lenses_async(session_view.view)
2231+
for session_buffer in not_visible_session_buffers:
2232+
session_buffer.set_code_lenses_pending_refresh()
22332233

22342234
sublime.set_timeout_async(continue_after_response)
22352235
return Promise.resolve(None)
@@ -2238,14 +2238,14 @@ def continue_after_response() -> None:
22382238
def on_workspace_semantic_tokens_refresh(self, _: None) -> Promise[None]:
22392239

22402240
def continue_after_response() -> None:
2241-
visible_session_views, not_visible_session_views = self.session_views_by_visibility()
2242-
for sv in visible_session_views:
2243-
if sv.get_request_flags() & RequestFlags.SEMANTIC_TOKENS:
2244-
sv.session_buffer.do_semantic_tokens_async(sv.view)
2241+
visible_session_buffers, not_visible_session_buffers = self.session_buffers_by_visibility()
2242+
for session_buffer, session_view in visible_session_buffers:
2243+
if session_view.get_request_flags() & RequestFlags.SEMANTIC_TOKENS:
2244+
session_buffer.do_semantic_tokens_async(session_view.view)
22452245
else:
2246-
sv.session_buffer.set_semantic_tokens_pending_refresh()
2247-
for sv in not_visible_session_views:
2248-
sv.session_buffer.set_semantic_tokens_pending_refresh()
2246+
session_buffer.set_semantic_tokens_pending_refresh()
2247+
for session_buffer in not_visible_session_buffers:
2248+
session_buffer.set_semantic_tokens_pending_refresh()
22492249

22502250
sublime.set_timeout_async(continue_after_response)
22512251
return Promise.resolve(None)
@@ -2254,31 +2254,31 @@ def continue_after_response() -> None:
22542254
def on_workspace_inlay_hint_refresh(self, _: None) -> Promise[None]:
22552255

22562256
def continue_after_response() -> None:
2257-
visible_session_views, not_visible_session_views = self.session_views_by_visibility()
2258-
for sv in visible_session_views:
2259-
if sv.get_request_flags() & RequestFlags.INLAY_HINT:
2260-
sv.session_buffer.do_inlay_hints_async(sv.view)
2257+
visible_session_buffers, not_visible_session_buffers = self.session_buffers_by_visibility()
2258+
for session_buffer, session_view in visible_session_buffers:
2259+
if session_view.get_request_flags() & RequestFlags.INLAY_HINT:
2260+
session_buffer.do_inlay_hints_async(session_view.view)
22612261
else:
2262-
sv.session_buffer.set_inlay_hints_pending_refresh()
2263-
for sv in not_visible_session_views:
2264-
sv.session_buffer.set_inlay_hints_pending_refresh()
2262+
session_buffer.set_inlay_hints_pending_refresh()
2263+
for session_buffer in not_visible_session_buffers:
2264+
session_buffer.set_inlay_hints_pending_refresh()
22652265

22662266
sublime.set_timeout_async(continue_after_response)
22672267
return Promise.resolve(None)
22682268

22692269
@request_handler('workspace/diagnostic/refresh')
22702270
def on_workspace_diagnostic_refresh(self, _: None) -> Promise[None]:
2271-
2272-
def continue_after_response() -> None:
2273-
visible_session_views, not_visible_session_views = self.session_views_by_visibility()
2274-
for sv in visible_session_views:
2275-
sv.session_buffer.do_document_diagnostic_async(sv.view, sv.view.change_count(), forced_update=True)
2276-
for sv in not_visible_session_views:
2277-
sv.session_buffer.set_document_diagnostic_pending_refresh()
2278-
2279-
sublime.set_timeout_async(continue_after_response)
2271+
sublime.set_timeout_async(self._refresh_diagnostics)
22802272
return Promise.resolve(None)
22812273

2274+
def _refresh_diagnostics(self) -> None:
2275+
visible_session_buffers, not_visible_session_buffers = self.session_buffers_by_visibility()
2276+
for session_buffer, session_view in visible_session_buffers:
2277+
view = session_view.view
2278+
session_buffer.do_document_diagnostic_async(view, view.change_count(), forced_update=True)
2279+
for session_buffer in not_visible_session_buffers:
2280+
session_buffer.set_document_diagnostic_pending_refresh()
2281+
22822282
@notification_handler('textDocument/publishDiagnostics')
22832283
def on_text_document_publish_diagnostics(self, params: PublishDiagnosticsParams) -> None:
22842284
self.handle_diagnostics_async(params['uri'], None, None, params['diagnostics'])
@@ -2301,6 +2301,7 @@ def handle_diagnostics_async(
23012301

23022302
@request_handler('client/registerCapability')
23032303
def on_client_register_capability(self, params: RegistrationParams) -> Promise[None]:
2304+
new_diagnostics_provider = False
23042305
new_workspace_diagnostics_provider = False
23052306
for registration in params["registrations"]:
23062307
capability_path, registration_path = method_to_capability(registration["method"])
@@ -2312,6 +2313,7 @@ def on_client_register_capability(self, params: RegistrationParams) -> Promise[N
23122313
options = self.config.filter_out_disabled_capabilities(capability_path, options)
23132314
registration_id = registration["id"]
23142315
if capability_path == 'diagnosticProvider':
2316+
new_diagnostics_provider = True
23152317
options = cast(DiagnosticOptions, options)
23162318
self.diagnostics.register_provider(registration_id, options)
23172319
if options['workspaceDiagnostics']:
@@ -2339,6 +2341,8 @@ def on_client_register_capability(self, params: RegistrationParams) -> Promise[N
23392341
self.register_file_system_watchers(registration_id, capability_options['watchers'])
23402342

23412343
def continue_after_response() -> None:
2344+
if new_diagnostics_provider:
2345+
self._refresh_diagnostics()
23422346
if new_workspace_diagnostics_provider:
23432347
self.do_workspace_diagnostics_async()
23442348

0 commit comments

Comments
 (0)