[{"id":"14450624164","type":"PullRequestEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"opened","number":3021,"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/3021","id":4445405837,"number":3021,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-09-04T18:18:28Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"14450507391","type":"PullRequestEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"closed","number":2880,"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-09-04T18:16:04Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"14450497285","type":"IssueCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","issue":{"url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880","repository_url":"https://api.github.com/repos/sublimelsp/LSP","labels_url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880/labels{/name}","comments_url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880/comments","events_url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880/events","html_url":"https://github.com/sublimelsp/LSP/pull/2880","id":4310767345,"node_id":"PR_kwDOBTlcgc7Utiui","number":2880,"title":"Use asyncio","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignees":[],"milestone":null,"comments":35,"created_at":"2026-04-22T17:34:21Z","updated_at":"2026-09-04T18:16:15Z","closed_at":"2026-09-04T18:16:15Z","assignee":null,"issue_field_values":[],"type":null,"active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","html_url":"https://github.com/sublimelsp/LSP/pull/2880","diff_url":"https://github.com/sublimelsp/LSP/pull/2880.diff","patch_url":"https://github.com/sublimelsp/LSP/pull/2880.patch","merged_at":null},"body":"This PR switches the codebase to using `async def` functions and `asyncio`. The loop provider is `sublime_aio`.\r\n\r\nclose #2863.\r\n\r\nshould be merged (and released) at the same time as:\r\n\r\n- [ ] https://github.com/sublimelsp/LSP-rust-analyzer/pull/224\r\n- [ ] https://github.com/sublimelsp/LSP-json/pull/237\r\n- [ ] https://github.com/sublimelsp/LSP-yaml/pull/94\r\n- [ ] https://github.com/sublimelsp/LSP-leo/pull/10\r\n- [ ] https://github.com/sublimelsp/LSP-Tinymist/pull/30\r\n\r\nThe main driver for doing this is to decrease the thread usage of this plugin from O(n) to O(1) threads, where `n` is the number of language servers running. The secondary driver is syntax sugar.\r\n\r\nWhy is this PR so large? Please read: [What color is your function?](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function)\r\n\r\nSelf-contained bits:\r\n\r\n- https://github.com/sublimelsp/LSP/pull/2991\r\n- https://github.com/sublimelsp/LSP/pull/2994\r\n- https://github.com/sublimelsp/LSP/pull/2995\r\n\r\n| Topic | Old Way | New Way |\r\n|----------|----------|------|\r\n| Running a short function on a thread that's not the main thread | `sublime.set_timeout_async` | `LSP.plugin.core.aio.call_soon_threadsafe` |\r\n| Defining a function that's asynchronous | `def f() -> Promise[T]: ...`  | `async def f() -> T: ...` |\r\n| Chaining asynchronous functions | `Promise.then(lambda x: ...)` | `x = await f()` |\r\n| Doing something when a server request is done | `session.send_request_async(R(), lambda x: ...)` | `x = await session.request(R())` |\r\n| Doing something when a server request fails | define an on_error callback | use a `try ... except ResponseException:` block |\r\n| Handling partial request results | define an on_partial_result callback | ~`async for partial_result in session.stream(R()):` (caveat: only works for `list[...]`-style responses)~ |\r\n| Starting a coroutine from a regular function | n/a | `LSP.plugin.core.aio.run_coroutine_threadsafe(f())` |\r\n| Awaiting old-style `Promise` objects | `Promise.then` | `await promise` |\r\n| Waiting for all asynchronous operations to complete | `Promise.all` | `asyncio.gather` |\r\n| Doing something later | `sublime.set_timeout_async(f, timeout_ms=1000)` | `await asyncio.sleep(1)` |\r\n| Enforcing a critical section | use `threading.Lock`, or write very complicated queueing logic | use `asyncio.Lock` |\r\n| Wrapping a new `async` function in a `Promise` | n/a | `Promise.wrap_task` |\r\n\r\n\r\n| `f` calls `g` | async `g` | blocking `g` |\r\n|----------|----------|------|\r\n| **async `f`** | `async def f(): await g()` | `async def f(): g()` |\r\n| **blocking `f`, guaranteed called from asyncio thread** | use `aio.TaskContainer.create_task(g())`  | `def f(): g()` |\r\n| **blocking `f`, any thread** | `def f(): aio.run_coroutine_threadsafe(g())`, or use `aio.TaskContainer.create_task_threadsafe(g())` | `def f(): g()`\r\n\r\n# The Plan\r\n\r\n## Make \"most\" code run on the sublime_aio thread\r\n\r\nMost code is doing bookkeeping. This type of code used to run on the Sublime \"async\" thread. It should run on the asyncio loop thread.\r\n\r\nPreviously, the code attempted to make most code run on the ST async thread. We never really enforced this. We tried to make it clear that a function/method should be running on the ST async thread by suffixing it with `_async`.\r\n\r\nIf you have an `async def` coroutine function, then such a coroutine function is _forced_ to run on the asyncio loop thread. So enforcement becomes automatic.\r\n\r\n## Keep `_async` suffixes, assume they run on the asyncio thread\r\n\r\nWhen a method or function has the suffix `_async` in its name, we tried to ensure these functions run on the ST async thread. These can now be assumed to be running on the asyncio thread.\r\n\r\n## Make compute-intensive function run on the Sublime \"async\" thread\r\n\r\nThe only compute-intensive code we deal with are parsing and emitting JSON. Only the JSON parser/emitter should run on the ST async thread.\r\n\r\n## Bridging code for existing LSP-* plugins\r\n\r\nWe made sure that all AbstractPlugin and LspPlugin related (class)methods ran on the ST async thread. I want to now make sure all these (class)methods run on the sublime_aio thread with this pull request.\r\n\r\nCertain methods may also be marked `async` for LspPlugin, most notably `on_pre_start` and perhaps `on_initialize`.\r\n\r\nThe `Promise` object can be awaited, so older AbstractPlugin/LspPlugin-related functionality returning promises from request handlers work.","reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880/reactions","total_count":2,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":1},"timeline_url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880/timeline","performed_via_github_app":null,"state_reason":null},"comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/issues/comments/5544691399","html_url":"https://github.com/sublimelsp/LSP/pull/2880#issuecomment-5544691399","issue_url":"https://api.github.com/repos/sublimelsp/LSP/issues/2880","id":5544691399,"node_id":"IC_kwDOBTlcgc8AAAABSn1Gxw","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2026-09-04T18:16:04Z","updated_at":"2026-09-04T18:16:04Z","body":"I'm recreating the PR because GitHub has trouble rendering the diff...","reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/issues/comments/5544691399/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null,"minimized":null}},"public":true,"created_at":"2026-09-04T18:16:04Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"14233111583","type":"IssueCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":296415399,"name":"sublimelsp/repository","url":"https://api.github.com/repos/sublimelsp/repository"},"payload":{"action":"created","issue":{"url":"https://api.github.com/repos/sublimelsp/repository/issues/171","repository_url":"https://api.github.com/repos/sublimelsp/repository","labels_url":"https://api.github.com/repos/sublimelsp/repository/issues/171/labels{/name}","comments_url":"https://api.github.com/repos/sublimelsp/repository/issues/171/comments","events_url":"https://api.github.com/repos/sublimelsp/repository/issues/171/events","html_url":"https://github.com/sublimelsp/repository/pull/171","id":5283168513,"node_id":"PR_kwDOEarwp88AAAABBZg1Ow","number":171,"title":"Add LSP-systemd","user":{"login":"macowie","id":2200578,"node_id":"MDQ6VXNlcjIyMDA1Nzg=","avatar_url":"https://avatars.githubusercontent.com/u/2200578?v=4","gravatar_id":"","url":"https://api.github.com/users/macowie","html_url":"https://github.com/macowie","followers_url":"https://api.github.com/users/macowie/followers","following_url":"https://api.github.com/users/macowie/following{/other_user}","gists_url":"https://api.github.com/users/macowie/gists{/gist_id}","starred_url":"https://api.github.com/users/macowie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/macowie/subscriptions","organizations_url":"https://api.github.com/users/macowie/orgs","repos_url":"https://api.github.com/users/macowie/repos","events_url":"https://api.github.com/users/macowie/events{/privacy}","received_events_url":"https://api.github.com/users/macowie/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignees":[],"milestone":null,"comments":9,"created_at":"2026-08-28T23:28:12Z","updated_at":"2026-09-01T20:07:16Z","closed_at":"2026-09-01T17:27:15Z","assignee":null,"issue_field_values":[],"type":null,"active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/sublimelsp/repository/pulls/171","html_url":"https://github.com/sublimelsp/repository/pull/171","diff_url":"https://github.com/sublimelsp/repository/pull/171.diff","patch_url":"https://github.com/sublimelsp/repository/pull/171.patch","merged_at":"2026-09-01T17:27:15Z"},"body":"I've created a package to support [systemd-lsp](https://github.com/JFryy/systemd-lsp). I've been using this locally for a bit on a few different machines without issue. The [corresponding language package](https://github.com/macowie/sublime-systemd) (awaiting approval in main Package Control) defines the source types supported here.","reactions":{"url":"https://api.github.com/repos/sublimelsp/repository/issues/171/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/sublimelsp/repository/issues/171/timeline","performed_via_github_app":null,"state_reason":null},"comment":{"url":"https://api.github.com/repos/sublimelsp/repository/issues/comments/5499738845","html_url":"https://github.com/sublimelsp/repository/pull/171#issuecomment-5499738845","issue_url":"https://api.github.com/repos/sublimelsp/repository/issues/171","id":5499738845,"node_id":"IC_kwDOEarwp88AAAABR89a3Q","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2026-09-01T20:07:16Z","updated_at":"2026-09-01T20:07:16Z","body":"> Another benefit of tying specific server version to package release is that there is no need for doing version checks on server start. In theory that can add delays and if there is no internet connection perhaps even quite long ones.\r\n> \r\n> But the con is that it adds extra maintenance as the PRs need to be merged and new package releases triggered.\r\n> \r\n> I'm fine with this having updater script.\r\n\r\nThere are disadvantages to having an update script:\r\n\r\n- end-users need an internet connection when opening a file. Some end-users may not have an internet connection in “air-gapped” high-security networks.\r\n- The update script may fail to load the newest releases; the remote server may be broken. This occurred for LSP-jdtls in fact.\r\n\r\nI’m personally not a fan of dynamic update scripts at startup…\r\n\r\n","reactions":{"url":"https://api.github.com/repos/sublimelsp/repository/issues/comments/5499738845/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null,"minimized":null}},"public":true,"created_at":"2026-09-01T20:07:16Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"19556338202","type":"PushEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"repository_id":87645313,"push_id":41964581908,"ref":"refs/heads/main","head":"91b438d3d0db53274b9df39cbd02cd381932c7e9","before":"bb1122c6f7df5ff5d273ccd659eac1f28da4f20f"},"public":true,"created_at":"2026-08-31T15:14:19Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"14148565185","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5068076624,"node_id":"PRR_kwDOBTlcgc8AAAABLhS2UA","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"5396d02ef296e835a18ba0753680a99aa00650d0","state":"approved","html_url":"https://github.com/sublimelsp/LSP/pull/3020#pullrequestreview-5068076624","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/3020","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/3020#pullrequestreview-5068076624"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/3020"}},"submitted_at":"2026-08-31T15:13:56Z","updated_at":"2026-08-31T15:13:56Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/3020","id":4402675915,"number":3020,"head":{"ref":"fix-git-scopes","sha":"5396d02ef296e835a18ba0753680a99aa00650d0","repo":{"id":195684696,"url":"https://api.github.com/repos/jwortmann/LSP","name":"LSP"}},"base":{"ref":"main","sha":"bb1122c6f7df5ff5d273ccd659eac1f28da4f20f","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-31T15:13:58Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"19442452197","type":"PushEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"repository_id":87645313,"push_id":41825711641,"ref":"refs/heads/feat/asyncio","head":"43f19ac19d814a3c027ef690b98b21e2044bdfec","before":"df4b3fbc1432b905ee5d7aba5dd5137b71fbbcad"},"public":true,"created_at":"2026-08-30T13:23:40Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"14094433089","type":"IssuesEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":959438025,"name":"packagecontrol/sublime_aio","url":"https://api.github.com/repos/packagecontrol/sublime_aio"},"payload":{"action":"opened","issue":{"url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40","repository_url":"https://api.github.com/repos/packagecontrol/sublime_aio","labels_url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40/labels{/name}","comments_url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40/comments","events_url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40/events","html_url":"https://github.com/packagecontrol/sublime_aio/issues/40","id":5291639258,"node_id":"I_kwDOOS_cyc8AAAABO2gB2g","number":40,"title":"asyncio.get_event_loop will raise RuntimeError on py 3.14","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignees":[],"milestone":null,"comments":1,"created_at":"2026-08-30T10:47:55Z","updated_at":"2026-08-30T13:05:46Z","closed_at":"2026-08-30T13:05:46Z","assignee":null,"issue_field_values":[],"type":null,"active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"issue_dependencies_summary":{"blocked_by":0,"total_blocked_by":0,"blocking":0,"total_blocking":0},"body":"this line:\n\nhttps://github.com/packagecontrol/sublime_aio/blob/21998585197d418da1b6668d73f8ce55e6ae1ecc/src/sublime_aio.py#L69\n\nthrows on python 3.14:\n\n```\nreloading plugin LSP-dockerfile.plugin\nTraceback (most recent call last):\n  File \"/home/raoul/.config/sublime-text-3/Lib/python314/sublime_aio.py\", line 67, in <module>\n    _loop, _tasks, _thread = sublime_plugin._sublime_aio_globals\n                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: module 'sublime_plugin' has no attribute '_sublime_aio_globals'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/opt/sublime_text/Lib/python314/sublime_plugin.py\", line 316, in reload_plugin\n    m = importlib.import_module(modulename)\n  File \"./python3.14/importlib/__init__.py\", line 88, in import_module\n  File \"<frozen importlib._bootstrap>\", line 1406, in _gcd_import\n  File \"<frozen importlib._bootstrap>\", line 1371, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 1342, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 938, in _load_unlocked\n  File \"<frozen importlib._bootstrap_external>\", line 784, in exec_module\n  File \"<frozen importlib._bootstrap>\", line 491, in _call_with_frames_removed\n  File \"/home/raoul/.config/sublime-text-3/Installed Packages/LSP-dockerfile.sublime-package/plugin.py\", line 3, in <module>\n    from LSP.plugin import LspPlugin\n  File \"/home/raoul/.config/sublime-text-3/Packages/LSP/plugin/__init__.py\", line 3, in <module>\n    from .api import AbstractPlugin\n  File \"/home/raoul/.config/sublime-text-3/Packages/LSP/plugin/api.py\", line 4, in <module>\n    from .core.aio import run_on_threadpool\n  File \"/home/raoul/.config/sublime-text-3/Packages/LSP/plugin/core/aio.py\", line 14, in <module>\n    import sublime_aio\n  File \"/home/raoul/.config/sublime-text-3/Lib/python314/sublime_aio.py\", line 69, in <module>\n    _loop = asyncio.get_event_loop()\n  File \"./python3.14/asyncio/events.py\", line 718, in get_event_loop\nRuntimeError: There is no current event loop in thread 'MainThread'.\n```\n\nit's a change in behavior introduced in python 3.14:\n\nhttps://docs.python.org/3/library/asyncio-eventloop.html#asyncio.get_event_loop\n","reactions":{"url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/packagecontrol/sublime_aio/issues/40/timeline","performed_via_github_app":null,"state_reason":"completed","pinned_comment":null}},"public":true,"created_at":"2026-08-30T10:47:56Z","org":{"id":9866449,"login":"packagecontrol","gravatar_id":"","url":"https://api.github.com/orgs/packagecontrol","avatar_url":"https://avatars.githubusercontent.com/u/9866449?"}},{"id":"13809687392","type":"IssueCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":313062962,"name":"sublimelsp/LSP-jdtls","url":"https://api.github.com/repos/sublimelsp/LSP-jdtls"},"payload":{"action":"created","issue":{"url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74","repository_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls","labels_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74/labels{/name}","comments_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74/comments","events_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74/events","html_url":"https://github.com/sublimelsp/LSP-jdtls/pull/74","id":4803083915,"node_id":"PR_kwDOEqj2Ms7tkMIi","number":74,"title":"chore: update server version to 1.60","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"closed","locked":false,"assignees":[],"milestone":null,"comments":2,"created_at":"2026-07-03T11:32:07Z","updated_at":"2026-08-26T07:01:05Z","closed_at":"2026-08-24T19:35:58Z","assignee":null,"issue_field_values":[],"type":null,"active_lock_reason":null,"draft":false,"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/pulls/74","html_url":"https://github.com/sublimelsp/LSP-jdtls/pull/74","diff_url":"https://github.com/sublimelsp/LSP-jdtls/pull/74.diff","patch_url":"https://github.com/sublimelsp/LSP-jdtls/pull/74.patch","merged_at":"2026-08-24T19:35:58Z"},"body":"close #73 ","reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74/timeline","performed_via_github_app":null,"state_reason":null},"comment":{"url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/comments/5406857215","html_url":"https://github.com/sublimelsp/LSP-jdtls/pull/74#issuecomment-5406857215","issue_url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/74","id":5406857215,"node_id":"IC_kwDOEqj2Ms8AAAABQkYX_w","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2026-08-25T07:15:56Z","updated_at":"2026-08-25T07:16:51Z","body":"@LDAP, you asked [in this comment](https://github.com/sublimelsp/LSP-jdtls/pull/68#issuecomment-3854500976) whether debugging unit tests would still work. I haven't tested that in this PR.\r\n\r\nHow would one go about doing that?\r\n\r\nOr actually, seems like you're only asking whether _running_ unit tests would still work. I think that should be testable just by clicking a code lens in the right place.","reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP-jdtls/issues/comments/5406857215/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null,"minimized":null}},"public":true,"created_at":"2026-08-25T07:15:56Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809327501","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015872118,"node_id":"PRR_kwDOBTlcgc8AAAABKvgidg","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015872118","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015872118"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:08:17Z","updated_at":"2026-08-25T07:08:17Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:08:19Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809325872","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850360886","pull_request_review_id":5015872118,"id":3850360886,"node_id":"PRRC_kwDOBTlcgc7lf9g2","diff_hunk":"@@ -4,24 +4,25 @@\n from .progress import ViewProgressReporter\n from .progress import WindowProgressReporter\n from typing import Any\n+from typing import Coroutine\n from typing import TYPE_CHECKING\n from weakref import ref\n import sublime\n \n if TYPE_CHECKING:\n     from .protocol import Request\n+    from .sessions import RequestController\n     from .sessions import SessionViewProtocol\n \n \n class ActiveRequest:\n     \"\"\"Holds state per request.\"\"\"\n \n-    def __init__(self, sv: SessionViewProtocol, request_id: int, request: Request[Any, Any]) -> None:\n+    def __init__(self, sv: SessionViewProtocol, cancellable: RequestController, request: Request[Any, Any]) -> None:","path":"plugin/core/active_request.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/537a5419751254b25b675a08c0480afad4112dab","created_at":"2026-08-25T07:08:16Z","updated_at":"2026-08-25T07:08:17Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850360886","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850360886"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850360886"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850360886/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836161519,"original_position":19,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:08:16Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809316703","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015870490,"node_id":"PRR_kwDOBTlcgc8AAAABKvgcGg","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015870490","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015870490"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:08:04Z","updated_at":"2026-08-25T07:08:04Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:08:05Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809315571","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850359437","pull_request_review_id":5015870490,"id":3850359437,"node_id":"PRRC_kwDOBTlcgc7lf9KN","diff_hunk":"@@ -0,0 +1,250 @@\n+\"\"\"Functionality wrapping asyncio, sublime_aio, and interaction nuances with Sublime Text.\"\"\"\n+\n+from __future__ import annotations\n+\n+from .logging import debug\n+from .logging import exception_log\n+from enum import IntFlag\n+from functools import partial\n+from typing import Any\n+from typing import Callable\n+from typing import Coroutine\n+from typing import TYPE_CHECKING\n+import asyncio\n+import sublime\n+import sublime_aio\n+\n+if TYPE_CHECKING:\n+    from contextvars import Context\n+    from sublime_aio import T\n+    from sublime_aio import Ts\n+    from typing_extensions import ParamSpec\n+    from typing_extensions import Unpack\n+    import concurrent.futures\n+    P = ParamSpec(\"P\")\n+\n+\n+class ExceptionPolicy(IntFlag):\n+    IGNORE = 0\n+    STACKTRACE = 1\n+    MESSAGEBOX = 2\n+\n+\n+_futures: set[concurrent.futures.Future] = set()\n+\n+\n+def _on_future_done(exception_policy: ExceptionPolicy, fut: concurrent.futures.Future[Any]) -> None:\n+    _futures.discard(fut)\n+    if not fut.cancelled() and (ex := fut.exception()):\n+        if exception_policy & ExceptionPolicy.STACKTRACE:\n+            exception_log(\"coroutine finished with exception\", ex)\n+        if exception_policy & ExceptionPolicy.MESSAGEBOX:\n+            message = f\"Error: {ex}\"\n+            if exception_policy & ExceptionPolicy.STACKTRACE:\n+                message += \"\\n\\n(See the Console for more information)\"\n+            sublime.error_message(message)\n+\n+\n+def run_coroutine(\n+    coroutine: Coroutine[object, object, T], *, exception_policy: ExceptionPolicy = ExceptionPolicy.STACKTRACE","path":"plugin/core/aio.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/92bc61451b060c9b84266bfbd41e24704ff70d28","created_at":"2026-08-25T07:08:03Z","updated_at":"2026-08-25T07:08:04Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850359437","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850359437"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850359437"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850359437/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836175805,"original_position":49,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:08:03Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809304422","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015868575,"node_id":"PRR_kwDOBTlcgc8AAAABKvgUnw","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015868575","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015868575"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:07:47Z","updated_at":"2026-08-25T07:07:47Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:07:49Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809302746","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850357739","pull_request_review_id":5015868575,"id":3850357739,"node_id":"PRRC_kwDOBTlcgc7lf8vr","diff_hunk":"@@ -0,0 +1,250 @@\n+\"\"\"Functionality wrapping asyncio, sublime_aio, and interaction nuances with Sublime Text.\"\"\"\n+\n+from __future__ import annotations\n+\n+from .logging import debug\n+from .logging import exception_log\n+from enum import IntFlag\n+from functools import partial\n+from typing import Any\n+from typing import Callable\n+from typing import Coroutine\n+from typing import TYPE_CHECKING\n+import asyncio\n+import sublime\n+import sublime_aio\n+\n+if TYPE_CHECKING:\n+    from contextvars import Context\n+    from sublime_aio import T\n+    from sublime_aio import Ts\n+    from typing_extensions import ParamSpec\n+    from typing_extensions import Unpack\n+    import concurrent.futures\n+    P = ParamSpec(\"P\")\n+\n+\n+class ExceptionPolicy(IntFlag):\n+    IGNORE = 0\n+    STACKTRACE = 1\n+    MESSAGEBOX = 2\n+\n+\n+_futures: set[concurrent.futures.Future] = set()\n+\n+\n+def _on_future_done(exception_policy: ExceptionPolicy, fut: concurrent.futures.Future[Any]) -> None:\n+    _futures.discard(fut)\n+    if not fut.cancelled() and (ex := fut.exception()):\n+        if exception_policy & ExceptionPolicy.STACKTRACE:\n+            exception_log(\"coroutine finished with exception\", ex)\n+        if exception_policy & ExceptionPolicy.MESSAGEBOX:\n+            message = f\"Error: {ex}\"\n+            if exception_policy & ExceptionPolicy.STACKTRACE:\n+                message += \"\\n\\n(See the Console for more information)\"\n+            sublime.error_message(message)\n+\n+\n+def run_coroutine(\n+    coroutine: Coroutine[object, object, T], *, exception_policy: ExceptionPolicy = ExceptionPolicy.STACKTRACE\n+) -> concurrent.futures.Future[T]:\n+    \"\"\"\n+    Start the execution of a coroutine in the asyncio thread, from any thread.\n+\n+    :param coroutine: a coroutine to run.\n+    :param exception_policy: what to do when the coroutine finishes with an uncaught exception.\n+    :return: a handle to a concurrent future object.\n+\n+    When you are certain you are already in the asyncio thread, then use one of:\n+\n+    * [asyncio.create_task](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.create_task). The\n+    caveat for asyncio.create_task is that the returned [Task](https://docs.python.org/3/library/asyncio-task.html#asyncio.Task)\n+    object must be kept alive manually. The event loop only keeps a weak reference to the Task object.\n+    * `TaskContainer.create_task`: restricts the lifetime of the task to the lifetime of the `TaskContainer`. Unlike\n+      `asyncio.create_task`, keeps a (strong) reference to the Task object.\n+    \"\"\"\n+    future = sublime_aio.run_coroutine(coroutine)\n+    future.add_done_callback(partial(_on_future_done, exception_policy))\n+    _futures.add(future)\n+    return future\n+\n+\n+def run_on_asyncio_thread(\n+    f: Callable[[Unpack[Ts]], Any], *args: Unpack[Ts], context: Context | None = None\n+) -> asyncio.Handle:\n+    \"\"\"Invoke a function in the asyncio thread, from any thread.\"\"\"\n+    return sublime_aio.call_soon_threadsafe(f, *args, context=context)\n+\n+\n+def run_on_threadpool(f: Callable[[Unpack[Ts]], T], *args: Unpack[Ts]) -> asyncio.Future[T]:\n+    \"\"\"Invoke a function on the loop's default thread pool. Must be invoked from the asyncio thread.\"\"\"\n+    return sublime_aio.run_in_worker(f, *args)\n+\n+\n+def _run_on_st_thread(\n+    dispatch_func: Callable[[Callable[[], None]], None], f: Callable[P, T], *args: P.args, **kwargs: P.kwargs\n+) -> asyncio.Future[T]:\n+    loop = asyncio.get_running_loop()\n+    future = loop.create_future()\n+\n+    def on_done(result: T) -> None:\n+        if not future.done():\n+            future.set_result(result)\n+\n+    def on_exception(ex: BaseException) -> None:\n+        if not future.done():\n+            future.set_exception(ex)\n+\n+    def wrap() -> None:\n+        try:\n+            loop.call_soon_threadsafe(on_done, f(*args, **kwargs))\n+        except BaseException as ex:\n+            loop.call_soon_threadsafe(on_exception, ex)\n+\n+    dispatch_func(wrap)\n+    return future\n+\n+\n+def run_on_main_thread(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> asyncio.Future[T]:\n+    \"\"\"\n+    Run a function in Sublime's main (UI) thread.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    return _run_on_st_thread(sublime.set_timeout, f, *args, **kwargs)\n+\n+\n+def run_on_worker_thread(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> asyncio.Future[T]:\n+    \"\"\"\n+    Run a function in Sublime's async, or worker, thread.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    return _run_on_st_thread(sublime.set_timeout_async, f, *args, **kwargs)\n+\n+\n+def tick(n: int = 1) -> asyncio.Future[None]:","path":"plugin/core/aio.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/308adf6fce9892ab3d9652c4cbd714574a916abc","created_at":"2026-08-25T07:07:46Z","updated_at":"2026-08-25T07:07:47Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850357739","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850357739"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850357739"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850357739/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836190641,"original_position":126,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:07:46Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809288340","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015866206,"node_id":"PRR_kwDOBTlcgc8AAAABKvgLXg","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015866206","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015866206"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:07:27Z","updated_at":"2026-08-25T07:07:27Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:07:29Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809286882","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850355636","pull_request_review_id":5015866206,"id":3850355636,"node_id":"PRRC_kwDOBTlcgc7lf8O0","diff_hunk":"@@ -0,0 +1,250 @@\n+\"\"\"Functionality wrapping asyncio, sublime_aio, and interaction nuances with Sublime Text.\"\"\"\n+\n+from __future__ import annotations\n+\n+from .logging import debug\n+from .logging import exception_log\n+from enum import IntFlag\n+from functools import partial\n+from typing import Any\n+from typing import Callable\n+from typing import Coroutine\n+from typing import TYPE_CHECKING\n+import asyncio\n+import sublime\n+import sublime_aio\n+\n+if TYPE_CHECKING:\n+    from contextvars import Context\n+    from sublime_aio import T\n+    from sublime_aio import Ts\n+    from typing_extensions import ParamSpec\n+    from typing_extensions import Unpack\n+    import concurrent.futures\n+    P = ParamSpec(\"P\")\n+\n+\n+class ExceptionPolicy(IntFlag):\n+    IGNORE = 0\n+    STACKTRACE = 1\n+    MESSAGEBOX = 2\n+\n+\n+_futures: set[concurrent.futures.Future] = set()\n+\n+\n+def _on_future_done(exception_policy: ExceptionPolicy, fut: concurrent.futures.Future[Any]) -> None:\n+    _futures.discard(fut)\n+    if not fut.cancelled() and (ex := fut.exception()):\n+        if exception_policy & ExceptionPolicy.STACKTRACE:\n+            exception_log(\"coroutine finished with exception\", ex)\n+        if exception_policy & ExceptionPolicy.MESSAGEBOX:\n+            message = f\"Error: {ex}\"\n+            if exception_policy & ExceptionPolicy.STACKTRACE:\n+                message += \"\\n\\n(See the Console for more information)\"\n+            sublime.error_message(message)\n+\n+\n+def run_coroutine(\n+    coroutine: Coroutine[object, object, T], *, exception_policy: ExceptionPolicy = ExceptionPolicy.STACKTRACE\n+) -> concurrent.futures.Future[T]:\n+    \"\"\"\n+    Start the execution of a coroutine in the asyncio thread, from any thread.\n+\n+    :param coroutine: a coroutine to run.\n+    :param exception_policy: what to do when the coroutine finishes with an uncaught exception.\n+    :return: a handle to a concurrent future object.\n+\n+    When you are certain you are already in the asyncio thread, then use one of:\n+\n+    * [asyncio.create_task](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.create_task). The\n+    caveat for asyncio.create_task is that the returned [Task](https://docs.python.org/3/library/asyncio-task.html#asyncio.Task)\n+    object must be kept alive manually. The event loop only keeps a weak reference to the Task object.\n+    * `TaskContainer.create_task`: restricts the lifetime of the task to the lifetime of the `TaskContainer`. Unlike\n+      `asyncio.create_task`, keeps a (strong) reference to the Task object.\n+    \"\"\"\n+    future = sublime_aio.run_coroutine(coroutine)\n+    future.add_done_callback(partial(_on_future_done, exception_policy))\n+    _futures.add(future)\n+    return future\n+\n+\n+def run_on_asyncio_thread(\n+    f: Callable[[Unpack[Ts]], Any], *args: Unpack[Ts], context: Context | None = None\n+) -> asyncio.Handle:\n+    \"\"\"Invoke a function in the asyncio thread, from any thread.\"\"\"\n+    return sublime_aio.call_soon_threadsafe(f, *args, context=context)\n+\n+\n+def run_on_threadpool(f: Callable[[Unpack[Ts]], T], *args: Unpack[Ts]) -> asyncio.Future[T]:\n+    \"\"\"Invoke a function on the loop's default thread pool. Must be invoked from the asyncio thread.\"\"\"\n+    return sublime_aio.run_in_worker(f, *args)\n+\n+\n+def _run_on_st_thread(\n+    dispatch_func: Callable[[Callable[[], None]], None], f: Callable[P, T], *args: P.args, **kwargs: P.kwargs\n+) -> asyncio.Future[T]:\n+    loop = asyncio.get_running_loop()\n+    future = loop.create_future()\n+\n+    def on_done(result: T) -> None:\n+        if not future.done():\n+            future.set_result(result)\n+\n+    def on_exception(ex: BaseException) -> None:\n+        if not future.done():\n+            future.set_exception(ex)\n+\n+    def wrap() -> None:\n+        try:\n+            loop.call_soon_threadsafe(on_done, f(*args, **kwargs))\n+        except BaseException as ex:\n+            loop.call_soon_threadsafe(on_exception, ex)\n+\n+    dispatch_func(wrap)\n+    return future\n+\n+\n+def run_on_main_thread(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> asyncio.Future[T]:\n+    \"\"\"\n+    Run a function in Sublime's main (UI) thread.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    return _run_on_st_thread(sublime.set_timeout, f, *args, **kwargs)\n+\n+\n+def run_on_worker_thread(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> asyncio.Future[T]:\n+    \"\"\"\n+    Run a function in Sublime's async, or worker, thread.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    return _run_on_st_thread(sublime.set_timeout_async, f, *args, **kwargs)\n+\n+\n+def tick(n: int = 1) -> asyncio.Future[None]:\n+    \"\"\"\n+    Wait until n ticks have occurred on the main thread.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    loop = asyncio.get_running_loop()\n+    future = loop.create_future()\n+\n+    def on_done() -> None:\n+        # Future may have been cancelled.\n+        if not future.done():\n+            future.set_result(None)\n+\n+    def iterate() -> None:\n+        nonlocal n\n+        n -= 1\n+        if n > 0:\n+            sublime.set_timeout(iterate)\n+        else:\n+            loop.call_soon_threadsafe(on_done)\n+\n+    sublime.set_timeout(iterate)\n+    return future\n+\n+\n+def get_clipboard() -> asyncio.Future[str]:\n+    \"\"\"\n+    Get the clipboard content.\n+\n+    Must be called from the asyncio thread. You must await the returned future.\n+    \"\"\"\n+    loop = asyncio.get_running_loop()\n+    future = loop.create_future()\n+\n+    def on_done(content: str) -> None:\n+        # Future may have been cancelled.\n+        if not future.done():\n+            future.set_result(content)\n+\n+    # See: https://github.com/sublimehq/sublime_text/issues/6920\n+    sublime.get_clipboard_async(partial(loop.call_soon_threadsafe, on_done))  # type: ignore\n+    return future\n+\n+\n+async def gather_and_flatten_exceptions(*coros: Coroutine[Any, Any, list[Exception]]) -> list[Exception]:\n+    \"\"\"\n+    Takes a list of coroutines, runs them concurrently using asyncio.gather, collects all exceptions, and returns a\n+    flattened list of Exceptions that occurred for each coroutine. BaseExceptions are filtered out.\n+    \"\"\"\n+    exceptions: list[Exception] = []\n+    items: list[BaseException | list[Exception]] = await asyncio.gather(*coros, return_exceptions=True)","path":"plugin/core/aio.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/84fc08862099ae5c07de4d45f4a58415a1a48e51","created_at":"2026-08-25T07:07:26Z","updated_at":"2026-08-25T07:07:27Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850355636","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850355636"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850355636"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850355636/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836198262,"original_position":177,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:07:26Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809275881","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015864197,"node_id":"PRR_kwDOBTlcgc8AAAABKvgDhQ","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015864197","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015864197"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:07:11Z","updated_at":"2026-08-25T07:07:11Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:07:13Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809274141","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850354037","pull_request_review_id":5015864197,"id":3850354037,"node_id":"PRRC_kwDOBTlcgc7lf711","diff_hunk":"@@ -119,16 +119,19 @@ def apply_text_edits(\n             }\n         )\n     elif required_view_version is None or required_view_version == view.change_count():\n+        # TODO: Communicate results back.\n         view.run_command('lsp_apply_text_document_edit', {'edits': edits, 'label': label})\n     # Resolving from the next message loop iteration guarantees that the edits have already been applied in the main\n     # thread, and that we've received view changes in the asynchronous thread.\n     return Promise(lambda resolve: sublime.set_timeout_async(lambda: resolve(view if view.is_valid() else None)))\n \n \n def show_summary_message(\n-    window: sublime.Window, result: ApplyWorkspaceEditResult, summary: WorkspaceEditSummary\n+    window: sublime.Window, result: ApplyWorkspaceEditResult, summary: WorkspaceEditSummary | BaseException","path":"plugin/core/edit.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/f9922e29cf9a7830d017cac354a564bf82cd4bfa","created_at":"2026-08-25T07:07:10Z","updated_at":"2026-08-25T07:07:11Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850354037","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850354037"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850354037"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850354037/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836238296,"original_position":13,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:07:10Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809262932","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015862491,"node_id":"PRR_kwDOBTlcgc8AAAABKvf82w","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015862491","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015862491"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:06:55Z","updated_at":"2026-08-25T07:06:55Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:06:56Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809261971","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850352470","pull_request_review_id":5015862491,"id":3850352470,"node_id":"PRRC_kwDOBTlcgc7lf7dW","diff_hunk":"@@ -48,21 +56,16 @@ def lsp_range_from_uri_fragment(fragment: str) -> Range | None:\n     return None\n \n \n-def open_file_uri(\n+async def open_file_uri(\n     window: sublime.Window, uri: DocumentUri, flags: sublime.NewFileFlags = sublime.NewFileFlags.NONE, group: int = -1\n-) -> Promise[sublime.View | None]:\n+) -> sublime.View | None:\n     decoded_uri = unquote(uri)  # decode percent-encoded characters\n-    open_promise = open_file(window, decoded_uri, flags, group)\n-    if fragment := urlparse(decoded_uri).fragment:\n-        if selection := lsp_range_from_uri_fragment(fragment):\n-            return open_promise.then(lambda view: _select_and_center(view, selection))\n-    return open_promise\n-\n-\n-def _select_and_center(view: sublime.View | None, r: Range) -> sublime.View | None:\n+    view = await open_file(window, decoded_uri, flags, group)\n     if view:\n-        return center_selection(view, r)\n-    return None\n+        if fragment := urlparse(decoded_uri).fragment:\n+            if selection := lsp_range_from_uri_fragment(fragment):\n+                center_selection(view, selection)\n+    return view","path":"plugin/core/open.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/56bd63f4bfd4bc6643ce127c6575eee5f98669e9","created_at":"2026-08-25T07:06:55Z","updated_at":"2026-08-25T07:06:55Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850352470","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850352470"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850352470"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850352470/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836248772,"original_position":65,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:06:55Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809252164","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015860962,"node_id":"PRR_kwDOBTlcgc8AAAABKvf24g","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015860962","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015860962"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:06:41Z","updated_at":"2026-08-25T07:06:41Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:06:42Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809251060","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850351103","pull_request_review_id":5015860962,"id":3850351103,"node_id":"PRRC_kwDOBTlcgc7lf7H_","diff_hunk":"@@ -84,52 +87,62 @@ def _find_open_file(window: sublime.Window, fname: str, group: int = -1) -> subl\n     return window.find_open_file(fname, group) if ST_VERSION >= 4136 else window.find_open_file(fname)\n \n \n-def open_file(\n+async def open_file(\n     window: sublime.Window, uri: DocumentUri, flags: sublime.NewFileFlags = sublime.NewFileFlags.NONE, group: int = -1\n-) -> Promise[sublime.View | None]:\n+) -> sublime.View | None:\n     \"\"\"\n-    Open a file asynchronously.\n-    It is only safe to call this function from the UI thread.\n+    Open a file and wait for it to be done loading.\n     The provided uri MUST be a file URI.\n     \"\"\"\n+    future: asyncio.Future[sublime.View | None] | None = None\n     file = parse_uri(uri)[1]\n-    # window.open_file brings the file to focus if it's already opened, which we don't want (unless it's supposed\n-    # to open as a separate view).\n-    view = _find_open_file(window, file)\n-    if view and _return_existing_view(flags, window.get_view_index(view)[0], window.active_group(), group):\n-        return Promise.resolve(view)\n-\n-    was_already_open = view is not None\n-    if not was_already_open and not os.path.isfile(file):\n-        # window.open_file creates a new view with empty content if the path from the given URI doesn't exist as a file\n-        # on disk, but we don't want that here. If the language server wants to create a new file for a given URI, it\n-        # must use the CreateFile resource operation in a WorkspaceEdit.\n-        return Promise.resolve(None)\n-    view = window.open_file(file, flags, group)\n-    if not view.is_loading():\n-        if was_already_open and (flags & sublime.NewFileFlags.SEMI_TRANSIENT):\n-            # workaround bug https://github.com/sublimehq/sublime_text/issues/2411 where transient view might not get\n-            # its view listeners initialized.\n-            sublime_plugin.check_view_event_listeners(view)  # type: ignore\n-        # It's already loaded. Possibly already open in a tab.\n-        return Promise.resolve(view)\n-\n-    # Is the view opening right now? Then return the associated unresolved promise\n-    for fn, value in g_opening_files.items():\n-        if fn == file or os.path.samefile(fn, file):\n-            # Return the unresolved promise. A future on_load event will resolve the promise.\n-            return value[0]\n-\n-    # Prepare a new promise to be resolved by a future on_load event (see the event listener in main.py)\n-    def fullfill(resolve: ResolveFunc[sublime.View | None]) -> None:\n-        # Save the promise in the first element of the tuple -- except we cannot yet do that here\n-        g_opening_files[file] = (None, resolve)  # type: ignore\n-\n-    promise = Promise(fullfill)\n-    tup = g_opening_files[file]\n-    # Save the promise in the first element of the tuple so that the for-loop above can return it\n-    g_opening_files[file] = (promise, tup[1])\n-    return promise\n+    async with _get_opening_files_lock():\n+        # Is the view opening right now? Then return the associated unresolved future\n+        for fn, fut in g_opening_files.items():\n+            if fn == file or os.path.samefile(fn, file):  # noqa ASYNC240\n+                # Return the unresolved future. A future on_load event will resolve the future.\n+                future = fut\n+                break\n+        if future is None:\n+            loop = asyncio.get_running_loop()\n+            future = loop.create_future()\n+\n+            def resolve_right_now(view: sublime.View | None) -> None:\n+                future.set_result(view)\n+\n+            def resolve_later() -> None:\n+                g_opening_files[file] = future\n+\n+            def on_main_thread() -> None:\n+\n+                # window.open_file brings the file to focus if it's already opened, which we don't want (unless it's\n+                # supposed to open as a separate view).\n+                view = _find_open_file(window, file)\n+                if view and _return_existing_view(flags, window.get_view_index(view)[0], window.active_group(), group):\n+                    loop.call_soon_threadsafe(lambda: resolve_right_now(view))\n+                    return\n+\n+                was_already_open = view is not None\n+                if not was_already_open and not os.path.isfile(file):\n+                    # window.open_file creates a new view with empty content if the path from the given URI doesn't\n+                    # exist as a file on disk, but we don't want that here. If the language server wants to create a new\n+                    # file for a given URI, it must use the CreateFile resource operation in a WorkspaceEdit.\n+                    loop.call_soon_threadsafe(lambda: resolve_right_now(view))\n+                    return\n+\n+                view = window.open_file(file, flags, group)\n+                if not view.is_loading():\n+                    if was_already_open and (flags & sublime.NewFileFlags.SEMI_TRANSIENT):\n+                        # workaround bug https://github.com/sublimehq/sublime_text/issues/2411 where transient view\n+                        # might not get its view listeners initialized.\n+                        sublime_plugin.check_view_event_listeners(view)  # type: ignore\n+                    # It's already loaded. Possibly already open in a tab.\n+                    loop.call_soon_threadsafe(lambda: resolve_right_now(view))\n+\n+                loop.call_soon_threadsafe(resolve_later)","path":"plugin/core/open.py","commit_id":"e6ea018400a3cf05487dd244231c0ceab48e550b","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"I don't think so... this function returns nothing.","created_at":"2026-08-25T07:06:41Z","updated_at":"2026-08-25T07:06:41Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850351103","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850351103"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850351103"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850351103/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836263101,"original_position":166,"position":164,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:06:41Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"18805083568","type":"PushEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"repository_id":87645313,"push_id":41137434752,"ref":"refs/heads/feat/transport-ready-api","head":"e27392cd983f556b5b4cfef19f2f79ad5ac2109d","before":"99a206cda46a1984d62673349d51aec34028d0db"},"public":true,"created_at":"2026-08-25T07:05:50Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809234384","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015858157,"node_id":"PRR_kwDOBTlcgc8AAAABKvfr7Q","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015858157","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015858157"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:06:19Z","updated_at":"2026-08-25T07:06:19Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:06:20Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809233329","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850348923","pull_request_review_id":5015858157,"id":3850348923,"node_id":"PRRC_kwDOBTlcgc7lf6l7","diff_hunk":"@@ -1456,138 +1582,163 @@ def run_code_action_async(\n             if isinstance(arguments, list):\n                 command_params['arguments'] = arguments\n             is_refactoring = kind_contains_other_kind(CodeActionKind.Refactor, code_action.get('kind', ''))\n-            return self.execute_command(command_params, progress=progress, view=view, is_refactoring=is_refactoring) \\\n-                .then(lambda _: None)\n+            return await self.run_command(\n+                command_params, progress=progress, view=view, is_refactoring=is_refactoring\n+            )\n         # At this point it cannot be a command anymore, it has to be a proper code action.\n         # A code action can have an edit and/or command. Note that it can have *both*. In case both are present, we\n         # must apply the edits before running the command.\n         code_action = cast('CodeAction', code_action)\n-        return self._maybe_resolve_code_action(code_action, view) \\\n-            .then(lambda code_action: self._apply_code_action_async(code_action, view))\n+        code_action_or_error = await self._maybe_resolve_code_action(code_action, view)\n+        if isinstance(code_action_or_error, Error):\n+            return code_action_or_error\n+        return await self._apply_code_action(code_action_or_error, view)\n \n-    def try_open_uri_async(\n+    @deprecated(\"use Session.run_code_action instead\")\n+    def run_code_action_async(","path":"plugin/core/sessions.py","commit_id":"e070761a0e50248efc1d18f4a288c9ed319594df","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"https://github.com/sublimelsp/LSP/pull/2880/commits/df4b3fbc1432b905ee5d7aba5dd5137b71fbbcad","created_at":"2026-08-25T07:06:19Z","updated_at":"2026-08-25T07:06:19Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850348923","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850348923"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850348923"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850348923/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836284715,"original_position":626,"position":1,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:06:19Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"18804926874","type":"PushEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"repository_id":87645313,"push_id":41137255455,"ref":"refs/heads/feat/asyncio","head":"df4b3fbc1432b905ee5d7aba5dd5137b71fbbcad","before":"e070761a0e50248efc1d18f4a288c9ed319594df"},"public":true,"created_at":"2026-08-25T07:04:13Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809000997","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015823064,"node_id":"PRR_kwDOBTlcgc8AAAABKvdi2A","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015823064","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015823064"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:01:17Z","updated_at":"2026-08-25T07:01:17Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:01:18Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13809000100","type":"PullRequestReviewCommentEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"action":"created","comment":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850319066","pull_request_review_id":5015823064,"id":3850319066,"node_id":"PRRC_kwDOBTlcgc7lfzTa","diff_hunk":"@@ -995,6 +1025,7 @@ def remove_all_inlay_hints(self) -> None:\n \n     # --- textDocument/codeAction --------------------------------------------------------------------------------------\n \n+    @deprecated(\"use SessionBuffer.request_code_actions instead\")\n     def request_code_actions_async(","path":"plugin/session_buffer.py","commit_id":"e6ea018400a3cf05487dd244231c0ceab48e550b","original_commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"although that's going to be refactored in follow-up PRs.","created_at":"2026-08-25T07:01:16Z","updated_at":"2026-08-25T07:01:17Z","html_url":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850319066","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"self":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850319066"},"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#discussion_r3850319066"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"reactions":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/comments/3850319066/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"in_reply_to_id":3836281583,"original_position":684,"position":684,"subject_type":"line"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}}},"public":true,"created_at":"2026-08-25T07:01:16Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}},{"id":"13808970492","type":"PullRequestReviewEvent","actor":{"id":2431823,"login":"rwols","display_login":"rwols","gravatar_id":"","url":"https://api.github.com/users/rwols","avatar_url":"https://avatars.githubusercontent.com/u/2431823?"},"repo":{"id":87645313,"name":"sublimelsp/LSP","url":"https://api.github.com/repos/sublimelsp/LSP"},"payload":{"review":{"id":5015818457,"node_id":"PRR_kwDOBTlcgc8AAAABKvdQ2Q","user":{"login":"rwols","id":2431823,"node_id":"MDQ6VXNlcjI0MzE4MjM=","avatar_url":"https://avatars.githubusercontent.com/u/2431823?v=4","gravatar_id":"","url":"https://api.github.com/users/rwols","html_url":"https://github.com/rwols","followers_url":"https://api.github.com/users/rwols/followers","following_url":"https://api.github.com/users/rwols/following{/other_user}","gists_url":"https://api.github.com/users/rwols/gists{/gist_id}","starred_url":"https://api.github.com/users/rwols/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwols/subscriptions","organizations_url":"https://api.github.com/users/rwols/orgs","repos_url":"https://api.github.com/users/rwols/repos","events_url":"https://api.github.com/users/rwols/events{/privacy}","received_events_url":"https://api.github.com/users/rwols/received_events","type":"User","user_view_type":"public","site_admin":false},"body":null,"commit_id":"02fcfd39c3bbb669df8128c6096445f6506dd0bd","state":"commented","html_url":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015818457","pull_request_url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","_links":{"html":{"href":"https://github.com/sublimelsp/LSP/pull/2880#pullrequestreview-5015818457"},"pull_request":{"href":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880"}},"submitted_at":"2026-08-25T07:00:35Z","updated_at":"2026-08-25T07:00:35Z"},"pull_request":{"url":"https://api.github.com/repos/sublimelsp/LSP/pulls/2880","id":3568708514,"number":2880,"head":{"ref":"feat/asyncio","sha":"e6ea018400a3cf05487dd244231c0ceab48e550b","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}},"base":{"ref":"main","sha":"91b438d3d0db53274b9df39cbd02cd381932c7e9","repo":{"id":87645313,"url":"https://api.github.com/repos/sublimelsp/LSP","name":"LSP"}}},"action":"created"},"public":true,"created_at":"2026-08-25T07:00:36Z","org":{"id":48095564,"login":"sublimelsp","gravatar_id":"","url":"https://api.github.com/orgs/sublimelsp","avatar_url":"https://avatars.githubusercontent.com/u/48095564?"}}]