aboutsummaryrefslogtreecommitdiff
path: root/helix-lsp/src/transport.rs
Commit message (Collapse)AuthorAge
* LSP: Forcefully shutdown uninitialized servers (#7449)Michael Davis2023-06-29
| | | | | | | | | | | | | | | | | | The LSP spec has this to say about initialize: > Until the server has responded to the `initialize` request with an > `InitializeResult`, the client must not send any additional requests > or notifications to the server. (https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initialize) The spec is not really explicit about how to handle this scenario. Before a client sends the 'initialize' request we are allowed to send an 'exit' notification, but after 'initialize' we can't send any requests (like shutdown) or notifications (like exit). So my intepretation is that we should forcefully close the server in this state. This matches the behavior of Neovim's built-in LSP client: https://github.com/neovim/neovim/blob/5ceb2238d3685255cd517ca87fd7edae9ed88811/runtime/lua/vim/lsp.lua#L1610-L1628
* Adds support for multiple language servers per language.Philipp Mildenberger2023-05-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Language Servers are now configured in a separate table in `languages.toml`: ```toml [langauge-server.mylang-lsp] command = "mylang-lsp" args = ["--stdio"] config = { provideFormatter = true } [language-server.efm-lsp-prettier] command = "efm-langserver" [language-server.efm-lsp-prettier.config] documentFormatting = true languages = { typescript = [ { formatCommand ="prettier --stdin-filepath ${INPUT}", formatStdin = true } ] } ``` The language server for a language is configured like this (`typescript-language-server` is configured by default): ```toml [[language]] name = "typescript" language-servers = [ { name = "efm-lsp-prettier", only-features = [ "format" ] }, "typescript-language-server" ] ``` or equivalent: ```toml [[language]] name = "typescript" language-servers = [ { name = "typescript-language-server", except-features = [ "format" ] }, "efm-lsp-prettier" ] ``` Each requested LSP feature is priorized in the order of the `language-servers` array. For example the first `goto-definition` supported language server (in this case `typescript-language-server`) will be taken for the relevant LSP request (command `goto_definition`). If no `except-features` or `only-features` is given all features for the language server are enabled, as long as the language server supports these. If it doesn't the next language server which supports the feature is tried. The list of supported features are: - `format` - `goto-definition` - `goto-declaration` - `goto-type-definition` - `goto-reference` - `goto-implementation` - `signature-help` - `hover` - `document-highlight` - `completion` - `code-action` - `workspace-command` - `document-symbols` - `workspace-symbols` - `diagnostics` - `rename-symbol` - `inlay-hints` Another side-effect/difference that comes with this PR, is that only one language server instance is started if different languages use the same language server.
* Drain pending requests on language server termination (#4852)Michael Davis2022-11-24
| | | | | | | | | This prevents a freeze while shutting down when using `efm-langserver`. `efm-langserver` exits immediately after seeing a shutdown request, without responding to the request. We block awaiting the reply to the shutdown request which will never come, so we time out. This change responds to any pending requests with `Err` saying that the stream has been closed.
* Handle language server termination (#4797)Michael Davis2022-11-19
| | | | | | | | | | | | | This change handles a language server exiting. This was a UX sore-spot: if a language server crashed, Helix did not recognize the exit and continued to send requests to it. All requests would timeout since they would not receive responses. This would also hold-up Helix closing itself down since it would try to gracefully shutdown the server which is implemented in the LSP spec as a request. We could attempt to automatically restart the language server on crash. I left this for future work since that change will need to be slightly complicated: it will need to cover the case of a language server repeatedly crashing.
* embed jsonrpc types from jsonrpc-core crate (#2801)Michael Davis2022-06-18
| | | | | | | | | | | | | | We should not depend on jsonrpc-core anymore: * The project just announced it's no longer actively maintained[^1], preferring their new implementation in `jsonrpsee`. * The types are too strict: we would benefit from removing some `#[serde(deny_unknown_fields)]` annotations to allow language servers that disrespect the spec[^2]. * We don't use much of the project. Just the types out of core. These are easy to embed directly into the `helix-lsp` crate. [^1]: https://github.com/paritytech/jsonrpc/pull/674 [^2]: https://github.com/helix-editor/helix/issues/2786
* prevent panic when handling an LSP response with no request (#2475)Michael Davis2022-05-17
| | | | | | | | | | | A language server may push a response which doesn't belong to any request. With this change, we discard the response rather than crashing. In the case of #2474, the language server sends an error message with a null request ID which should not ever exist in the `pending_requests` HashMap. closes #2474
* lsp: This doesn't need to be a mutable referenceBlaž Hrastnik2021-09-06
|
* lsp: Don't send notifications until initialize completesBlaž Hrastnik2021-09-06
| | | | Then send open events for all documents with the LSP attached.
* lsp: Delay requests & notifications until initialization is completeBlaž Hrastnik2021-09-06
|
* fix: lsp: Terminate transport on EOFBlaž Hrastnik2021-09-06
| | | | If stdout/stderr is closed, read_line will return 0 indicating EOF.
* fix: Work around crashes on LSPs that don't just emit JSON-RPCBlaž Hrastnik2021-08-29
|
* lsp: slightly refactor header parsing, add more loggingBlaž Hrastnik2021-08-29
|
* don't panic on defunct lsp process (#583)Timothy DeHerrera2021-08-23
|
* lsp: Refactor duplex to avoid issues with select! + read_exactBlaž Hrastnik2021-08-07
| | | | | | read_exact isn't cancellation safe. Fixes #504
* Fix unwraps in lsp::transportwojciechkepka2021-06-19
|
* Add unique id to each lsp client/server pairwojciechkepka2021-06-18
|
* Derive debug without featureIvan Tham2021-06-10
| | | | Note that this also removed those `finish_non_exhaustive()`.
* Implement Debug for data structure as a featurenotoria2021-06-10
|
* helix-lsp cleanupEgor Karavaev2021-06-08
|
* clippy lintBlaž Hrastnik2021-05-06
|
* Tokio migration.Blaž Hrastnik2021-05-06
|
* clippy lintBlaž Hrastnik2021-03-31
|
* minor: Simplify some code.Blaž Hrastnik2021-02-24
|
* lsp: Handle responses being returned after request timed out.Blaž Hrastnik2021-02-22
|
* Increase the log level in LSP and log server errors.Blaž Hrastnik2021-02-16
|
* Address clippy lints.Blaž Hrastnik2021-01-08
|
* lsp: Fix pos_to_lsp_pos calculation.Blaž Hrastnik2020-12-25
|
* lsp: generate_transaction_from_text_editsBlaž Hrastnik2020-12-23
|
* wip: Move to new rendering structure.Blaž Hrastnik2020-12-13
|
* Text change generation, RPC call handling.Blaž Hrastnik2020-12-03
|
* Configure logging (-vv for debug level logs)Blaž Hrastnik2020-12-03
|
* clippy lintBlaž Hrastnik2020-12-03
|
* Improve error typing.Blaž Hrastnik2020-12-03
|
* Reroute LSP notification events into the main app event loop.Blaž Hrastnik2020-12-03
|
* wip: Fetching diagnostics, parsing notifications.Blaž Hrastnik2020-12-03