diff --git a/crates/zed/src/languages/elm.rs b/crates/zed/src/languages/elm.rs index 6eb5645102..9c50184498 100644 --- a/crates/zed/src/languages/elm.rs +++ b/crates/zed/src/languages/elm.rs @@ -1,9 +1,13 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; use futures::StreamExt; +use gpui::AppContext; use language::{LanguageServerName, LspAdapter, LspAdapterDelegate}; use lsp::LanguageServerBinary; use node_runtime::NodeRuntime; +use project::project_settings::ProjectSettings; +use serde_json::Value; +use settings::Settings; use smol::fs; use std::{ any::Any, @@ -13,6 +17,7 @@ use std::{ }; use util::ResultExt; +const SERVER_NAME: &'static str = "elm-language-server"; const SERVER_PATH: &'static str = "node_modules/@elm-tooling/elm-language-server/out/node/index.js"; fn server_binary_arguments(server_path: &Path) -> Vec { @@ -32,7 +37,7 @@ impl ElmLspAdapter { #[async_trait] impl LspAdapter for ElmLspAdapter { fn name(&self) -> LanguageServerName { - LanguageServerName("elm-language-server".into()) + LanguageServerName(SERVER_NAME.into()) } fn short_name(&self) -> &'static str { @@ -88,6 +93,27 @@ impl LspAdapter for ElmLspAdapter { ) -> Option { get_cached_server_binary(container_dir, &*self.node).await } + + fn workspace_configuration(&self, _workspace_root: &Path, cx: &mut AppContext) -> Value { + // elm-language-server expects workspace didChangeConfiguration notification + // params to be the same as lsp initialization_options + let override_options = ProjectSettings::get_global(cx) + .lsp + .get(SERVER_NAME) + .and_then(|s| s.initialization_options.clone()) + .unwrap_or_default(); + + match override_options.clone().as_object_mut() { + Some(op) => { + // elm-language-server requests workspace configuration + // for the `elmLS` section, so we have to nest + // another copy of initialization_options there + op.insert("elmLS".into(), override_options); + serde_json::to_value(op).unwrap_or_default() + } + None => override_options, + } + } } async fn get_cached_server_binary( diff --git a/docs/src/languages/elm.md b/docs/src/languages/elm.md index ec6aa46c7a..02bd4a88a6 100644 --- a/docs/src/languages/elm.md +++ b/docs/src/languages/elm.md @@ -2,3 +2,24 @@ - Tree Sitter: [tree-sitter-elm](https://github.com/elm-tooling/tree-sitter-elm) - Language Server: [elm-language-server](https://github.com/elm-tooling/elm-language-server) + +### Setting up `elm-language-server` + +Elm language server can be configured in your `settings.json`, e.g.: + +```json +{ + "lsp": { + "elm-language-server": { + "initialization_options": { + "disableElmLSDiagnostics": true, + "onlyUpdateDiagnosticsOnSave": false, + "elmReviewDiagnostics": "warning" + } + } + } +} +``` + +`elm-format`, `elm-review` and `elm` need to be installed and made available in the environment +or configured in the settings. See the [full list of server settings here](https://github.com/elm-tooling/elm-language-server?tab=readme-ov-file#server-settings).