Commit Graph

289 Commits (b2c28b8c3787c3c82ff021d08c34f2e9d2957d86)

Author SHA1 Message Date
Matt Paras 2fe135cf7d set up integration to listen to lsp notifications that aren't handled by helix 2025-06-14 09:44:08 -07:00
Matt Paras 1eecadb050 merge from master 2025-06-14 07:22:13 -07:00
yuri 9dbfb9b4eb
Merge formatting options and `config.format` in range format request (#13734) 2025-06-10 09:55:46 -05:00
Michael Davis 01341cbbf6
minor: Add missing call to `Vec::clear` for a buffer 2025-06-06 12:23:22 -04:00
Skyler Hawthorne ca4ae7f287
set working dir of the lsp command to workspace root (#13691) 2025-06-06 10:16:36 -05:00
Michael Davis 8d2870b94a
Reuse content buffer in JSONRPC recv for LSP and DAP
Previously `recv` for new messages from the language server or debug
adapter allocated a fresh Vec for each message. Instead we can reuse
the buffer. This resolves TODO comments.

Co-authored-by: Rolo <roloedits@gmail.com>
2025-06-06 10:19:33 -04:00
Matt Paras 8eae56f548 merge latest from master 2025-06-05 22:54:31 -07:00
Michael Davis c94fde8d1c
syntax: Move config types to a separate module 2025-05-13 18:30:21 -04:00
Michael Davis 47cdd23e50
LSP: Fix `Client::supports_feature` check for 'colorProvider'
The old check would allow sending textDocument/documentColor requests
when the server declared `{"colorProvider": false}` in its capabilities
as this was `Some`:

    Some(ColorProviderCapability::Simple(false))

The Julia language server sets this explicitly to `false` in the wild.
2025-04-28 09:44:25 -04:00
Rolo 5b72b59448 perf: use `next_back` on `DoubleEndedIterator` 2025-04-06 12:03:14 -05:00
Keir Lawson 7929c0719d
Track progress title an display in place of internal token (#13180)
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
2025-03-27 12:00:23 -05:00
Matt Paras fffa86e682 merge from master 2025-03-25 19:48:34 -07:00
Nik Revenco 0ee5850016
Color swatches ( 🟩 green 🟥 #ffaaaa ) (#12308) 2025-03-23 16:07:02 -05:00
Michael Davis 7e7a98560e
LSP: Eagerly decode request results in the client
Previously the `call` helper (and its related functions) returned a
`serde_json::Value` which was then decoded either later in the client
(see signature help and hover) or by the client's caller. This led to
some unnecessary boilerplate in the client:

    let resp = self.call::<MyRequest>(params);
    Some(async move { Ok(serde_json::from_value(resp.await?)?) })

and in the caller. It also allowed for mistakes with the types. The
workspace symbol request's calling code for example mistakenly decoded a
`lsp::WorkspaceSymbolResponse` as `Vec<lsp::SymbolInformation>` - one of
the untagged enum members (so it parsed successfully) but not the
correct type.

With this change, the `call` helper eagerly decodes the response to a
request as the `lsp::request::Request::Result` trait item. This is
similar to the old helper `request` (which has become redundant and has
been eliminated) but all work is done within the same async block which
avoids some awkward lifetimes. The return types of functions like
`Client::text_document_range_inlay_hints` are now more verbose but it is
no longer possible to accidentally decode as an incorrect type.

Additionally `Client::resolve_code_action` now uses the `call_with_ref`
helper to avoid an unnecessary clone.
2025-03-22 14:40:29 -04:00
Michael Davis c4d314d7ba
LSP: Fix offset encoding test case
Co-authored-by: Isaac Mills <rooster0055@protonmail.com>
2025-03-06 17:13:38 -05:00
Michael Davis fbc0f956b3
minor: Move json deserialization into text_document_hover future
This follows a pattern used in the signature help request for example.
Moving the json deserialization into the return future of
`text_document_hover` makes the types easier for callers to work with.
2025-03-04 12:01:07 -05:00
Michael Davis ab56f9e26b
minor: Tweak some verbose LSP logs
The info log within `process_request_response` duplicated the body of
the JSON message printed earlier by the transport which was confusing.

The error log in the completion handler was easy to hit during normal
use and is not actually an error - dropping is the graceful way to
handle changes occurring while completion requests are in flight.
2025-03-04 11:25:11 -05:00
Matt Paras d17dd3115f merge from master 2025-02-27 08:37:29 -08:00
Michael Davis d031260180
Avoid cloning configured env vars when starting a language server
The clone of the hashmap can be avoided by passing a ref instead. This
commit also changes the `server_environment` type to match the bounds
expected by `Command::envs` - this will avoid future refactoring if the
underlying type changes (for example switching to `hashbrown::HashMap`).
2025-02-19 10:30:06 -05:00
Michael Davis f0fa905622
LSP: Eagerly send requests in `Client::request`
This is a similar change to the parent commit but for `request`. The
requests should be sent eagerly so that the ordering stays consistent.

Co-authored-by: Pascal Kuthe <pascalkuthe@pm.me>
2025-02-01 19:32:37 -05:00
Michael Davis 5532ef35d9
LSP: Remove future wrapper from `Client::notify`, `Client::reply`
Previously LSP notifications were sent within a future and most callers
used a `tokio::spawn` to send the notification, silently discarding any
failures like problems serializing parameters or sending on the channel.
It's possible that tokio could schedule futures out of intended order
though which could cause notifications where order is important, like
document synchronization, to become partially shuffled. This change
removes the future wrapper and logs all internal failures.

Also included in this commit is the same change for `Client::reply`
which was also unnecessarily wrapped in a future.

Co-authored-by: Pascal Kuthe <pascalkuthe@pm.me>
2025-02-01 19:32:37 -05:00
Nikita Revenco a63a2ad281
feat: specify custom lang server(s) for `:lsp-stop` and `:lsp-restart` (#12578)
Co-authored-by: Nikita Revenco <154856872+NikitaRevenco@users.noreply.github.com>
2025-01-23 18:14:35 -06:00
Rolo c1d382a532 fix(lints): clippy 1.84 2025-01-23 15:18:16 -05:00
Matt Paras a9d5557a3b merge from master 2025-01-11 10:14:03 -08:00
Samuel Selleck 4a59f68a0d
LSP Client: Accept floats with trailing zeros as valid JSONRPC IDs (#12376) 2024-12-31 12:45:47 -06:00
Maurice Hieronymus b946b21b01
fix: Respect workspace-lsp-roots on doc opening (#12223)
When a new language server is started, find_lsp_workspace is called
with LanguageConfiguration::workspace_lsp_roots as the root_dirs.

This behavior is different when a new document is opened.
find_lsp_workspace is called with editor::Config::workspace_lsp_roots
which is never set.

This leads to a bug where workspace-lsp-roots is not respected when
opening a new document. This commit fixes this bug.
2024-12-22 08:08:41 -06:00
Pascal Kuthe 1badd9e434
implement snippet tabstop support 2024-12-17 13:34:40 -05:00
RoloEdits 5ba97ba41e
fix(clippy): clippy 1.83 lints (#12150) 2024-12-02 08:23:32 -06:00
Tobias Kohlbau 7ebfd90d92
Merge remote-tracking branch 'upstream/master' into steel-event-system 2024-10-09 11:07:30 +02:00
Matt Paras 884e9580bc first pass at lsp extensions 2024-08-25 13:49:06 -07:00
Pascal Kuthe 3fcf168c33
Merge pull request #11355 from helix-editor/helix-lsp-types
Vendor `lsp-types`
2024-07-31 02:02:15 +02:00
Pascal Kuthe 8e041c99df
stable sort lsp edits (#11357) 2024-07-29 06:22:28 +09:00
Michael Davis e21e4eb825
Replace lsp-types in helix-lsp with helix-lsp-types 2024-07-28 10:41:29 -04:00
Michael Davis ae72a1dc42 Tombstone LSP clients stopped with :lsp-stop
We use the empty vec in `inner_by_name` as a tombstone value. When the
vec is empty `get` should not automatically restart the server.
2024-07-28 22:16:39 +09:00
Michael Davis 59429e18d6 Lower log level for message about removing clients from the registry
Servers stopped with `:lsp-stop` will show this message when the server
exits. If the client isn't in the registry there isn't any work to do
to remove it so this branch is benign.
2024-07-28 22:16:39 +09:00
RoloEdits 7c5e5f4e41
fix(lsp): `find_completion_range` off-by-one (#11266) 2024-07-24 10:34:20 -05:00
Ricardo Fernández Serrata 6997ee9151
`&Option<T>` -> `Option<&T>` (#11091)
* refactor `starting_request_args` to only `ref` non-`Copy`

* refactor `needs_recompile` to only `ref` non-`Copy`

* refactor `add_workspace_folder` to only `ref` `Some`

---------

Co-authored-by: Rudxain <rudxain@localhost.localdomain>
2024-07-09 18:34:28 +09:00
Robin 64f8660d3e
Tell language servers that Helix can request formatting (#11064)
Without providing the formatting capability, the language server might not advertise its ability to format in return, causing the :format command to be broken.
2024-07-02 09:42:51 +09:00
Michael Davis 5c11af1479 `cargo fmt` 2024-05-07 15:15:52 -04:00
Michael Davis 9dd51e75e0 Resolve new Clippy lints 2024-05-07 15:15:52 -04:00
Pascal Kuthe a1d7997fe3
fix lsp restart (#10614) 2024-04-28 12:11:17 +09:00
Pascal Kuthe 38ee845b05 don't overload LS with completion resolve requests
While moving completion resolve to the event system in #9668 we introduced what
is essentially a "DOS attack" on slow LSPs. Completion resolve requests were
made in the render loop and debounced with a timeout. Once the timeout expired
the resolve request was made. The problem is the next frame would immediately
request a new completion resolve request (and mark the old one as obsolete but
because LSP has no notion of cancelation the server would still process it). So
we were in essence sending one completion request to the server every 150ms and
only stopped if the server managed to respond before we rendered a new frame.
This caused overload on slower machines/with slower LS.

In this PR I revamped the resolve handler so that a request is only ever
resolved once. Both by checking if a request is already in-flight and by marking
failed resolve requests as resolved.
2024-04-22 12:27:47 +09:00
Pascal Kuthe b834806dbc use newtype parttern for langauge server id 2024-04-22 12:27:47 +09:00
Pascal Kuthe 6f5ea6be58
fix off by one error for completion-replace option (#10279) 2024-04-08 12:31:23 +09:00
Eduardo Farinati d3bfa3e063
Fix crash on lsp text edits with invalid ranges (#9649) 2024-04-06 04:17:22 +02:00
Tshepang Mbambo 3e2b85c61b
remove redundant imports (#10154) 2024-04-04 23:28:44 +09:00
Michael Davis 5ca6a448e9
Support LSP diagnostic tags (#9780) 2024-03-02 13:37:11 +09:00
Michael Davis b7b6f30084 Use a hook for resolving completion items
Previously we used the IdleTimeout event to trigger LSP
`completion/resolveItem` requests. We can now refactor this to use an
event system hook instead and lower the timeout.
2024-02-22 22:37:23 -05:00
kyfanc fe869e5dc7
fix lsp config reload (#9415)
`syn_loader` was replaced rather than interior value being replace,
old value was still being referenced and not updated after `:config-refresh`.
By using `ArcSwap` like for `config`, each `.load()` call will return the most
updated value.

Co-authored-by: kyfan <kyfan@email>
2024-02-13 11:58:53 +01:00
ontley 6a90166d0a
Add required-root-patterns for situational lsp activation (#8696)
* Added required-root-patterns for situational lsp activation using globbing

* Replaced filter_map with flatten

* updated book to include required-root-patterns option

* fixed wrong function name for path

* Added globset to helix-core. Moved globset building to config parsing.

* Normalize implements AsRef

* cargo fmt

* Revert "cargo fmt"

This reverts commit ca8ce123e8.
2024-02-12 02:35:25 +01:00