diff --git a/docs/src/migrating_to_lsp_plugin.md b/docs/src/migrating_to_lsp_plugin.md index b89343e24..a6b101e0f 100644 --- a/docs/src/migrating_to_lsp_plugin.md +++ b/docs/src/migrating_to_lsp_plugin.md @@ -435,7 +435,7 @@ from LSP.plugin import uri_handler def on_open_foo_uri(self, uri: DocumentUri, flags: sublime.NewFileFlags) -> Promise[sublime.Sheet | None]: title, content, syntax = render_foo_uri(uri) if session := self.weaksession(): - return session.open_scratch_buffer(title, content, syntax, uri, None, flags) + return session.open_scratch_buffer(title, content, syntax, flags).then(lambda view: view.sheet()) return Promise.resolve(None) ``` diff --git a/plugin/core/sessions.py b/plugin/core/sessions.py index eeafe5449..f1c3a8f86 100644 --- a/plugin/core/sessions.py +++ b/plugin/core/sessions.py @@ -172,6 +172,7 @@ from typing import Union from typing_extensions import TypeAlias from typing_extensions import TypeGuard +from urllib.parse import urldefrag from weakref import WeakSet import itertools import mdpopups @@ -1520,32 +1521,29 @@ def _open_uri_with_plugin_async( group: int, ) -> Promise[sublime.View | None] | None: # I cannot type-hint an unpacked tuple - pair: PackagedTask[tuple[str | None, str, str]] = Promise.packaged_task() + pair: PackagedTask[tuple[str, str, str]] = Promise.packaged_task() + promise, resolve = pair # It'd be nice to have automatic tuple unpacking continuations - callback = lambda a, b, c: pair[1]((a, b, c)) # noqa: E731 + callback = lambda a, b, c: resolve((a or 'untitled', b, c)) # noqa: E731 if plugin.on_open_uri_async(uri, callback): - result: PackagedTask[sublime.View | None] = Promise.packaged_task() - pair[0].then(lambda tup: self.open_scratch_buffer(*tup, uri, r, flags, group)).then(result[1]) - return result[0] + return promise.then(lambda tup: self.open_scratch_buffer(*tup, flags, group)) \ + .then(lambda view: self._on_sheet_opened(view.sheet(), uri, r)) + # resolve unused promise + resolve(('', '', '')) return None def open_scratch_buffer( self, - title: str | None, + title: str, content: str, syntax: str, - uri: DocumentUri, - r: Range | None, flags: sublime.NewFileFlags = sublime.NewFileFlags.NONE, group: int = -1, - ) -> Promise[sublime.View | None]: - task: PackagedTask[sublime.View | None] = Promise.packaged_task() + ) -> Promise[sublime.View]: + task: PackagedTask[sublime.View] = Promise.packaged_task() promise, resolve = task def continue_on_main_thread() -> None: - if title is None: - resolve(None) - return if group > -1: self.window.focus_group(group) view = self.window.new_file(syntax=syntax, flags=flags) @@ -1555,20 +1553,19 @@ def continue_on_main_thread() -> None: view.set_name(title) view.run_command("append", {"characters": content}) view.set_read_only(True) - self._on_sheet_opened(view.sheet(), uri, r).then(resolve) + resolve(view) sublime.set_timeout(continue_on_main_thread) return promise - def _on_sheet_opened( - self, sheet: sublime.Sheet | None, uri: DocumentUri, r: Range | None - ) -> Promise[sublime.View | None]: + def _on_sheet_opened(self, sheet: sublime.Sheet | None, uri: DocumentUri, r: Range | None) -> sublime.View | None: if sheet and (view := sheet.view()): - view.settings().set('lsp_uri', uri) # Preserve original URI given by the language server + uri_no_fragment = urldefrag(uri).url + view.settings().set('lsp_uri', uri_no_fragment) if r: center_selection(view, r) - return Promise.resolve(view) - return Promise.resolve(None) + return view + return None def open_location_async( self,