diff --git a/Cargo.lock b/Cargo.lock index b42e11d326a8691933a516edb827696bf7c2e274..8a87cb99861712fb0b2f188e0087ec5155dcc2d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9861,6 +9861,7 @@ dependencies = [ "rpc", "rsa", "rust-embed", + "schemars", "search", "semantic_index", "serde", diff --git a/assets/settings/default.json b/assets/settings/default.json index 86def54d323aebc0225fb5c89ee8a7a104c50a40..126407a32dec59cc902d508ba997e371ad001340 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -373,6 +373,27 @@ "enabled": false, "reindexing_delay_seconds": 600 }, + // Settings specific to our elixir integration + "elixir": { + // Set Zed to use the experimental Next LS LSP server. + // Note that changing this setting requires a restart of Zed + // to take effect. + // + // May take 3 values: + // 1. Use the standard elixir-ls LSP server + // "next": "off" + // 2. Use a bundled version of the next Next LS LSP server + // "next": "on", + // 3. Use a locally running version of the next Next LS LSP server, + // on a specific port: + // "next": { + // "local": { + // "port": 4000 + // } + // }, + // + "next": "off" + }, // Different settings for specific languages. "languages": { "Plain Text": { diff --git a/crates/semantic_index/examples/eval.rs b/crates/semantic_index/examples/eval.rs index 15406cf63e3bb99271c5444933a3a01fffd041d1..2994cb29b61bd11ae2d726e0dac35fd3c0f6416e 100644 --- a/crates/semantic_index/examples/eval.rs +++ b/crates/semantic_index/examples/eval.rs @@ -456,7 +456,7 @@ fn main() { let languages = Arc::new(languages); let node_runtime = RealNodeRuntime::new(http.clone()); - languages::init(languages.clone(), node_runtime.clone()); + languages::init(languages.clone(), node_runtime.clone(), cx); language::init(cx); project::Project::init(&client, cx); diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index b2339f998f292161eedeaf4a5ef5f2365d9bee3f..fb41f7a3498d27b7e60ffd6b6a04a90f461604a3 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -99,6 +99,7 @@ rust-embed.workspace = true serde.workspace = true serde_derive.workspace = true serde_json.workspace = true +schemars.workspace = true simplelog = "0.9" smallvec.workspace = true smol.workspace = true diff --git a/crates/zed/src/languages.rs b/crates/zed/src/languages.rs index 0b1fa750c084dd44a006cad258f4e7d11fc153f9..75674e78e0b8fa721da7b6c8edee3ce7eaeb006e 100644 --- a/crates/zed/src/languages.rs +++ b/crates/zed/src/languages.rs @@ -1,13 +1,17 @@ use anyhow::Context; +use gpui::AppContext; pub use language::*; use node_runtime::NodeRuntime; use rust_embed::RustEmbed; use std::{borrow::Cow, str, sync::Arc}; use util::asset_str; +use self::elixir_next::ElixirSettings; + mod c; mod css; mod elixir; +mod elixir_next; mod go; mod html; mod json; @@ -37,7 +41,13 @@ mod yaml; #[exclude = "*.rs"] struct LanguageDir; -pub fn init(languages: Arc, node_runtime: Arc) { +pub fn init( + languages: Arc, + node_runtime: Arc, + cx: &mut AppContext, +) { + settings::register::(cx); + let language = |name, grammar, adapters| { languages.register(name, load_config(name), grammar, adapters, load_queries) }; @@ -61,11 +71,25 @@ pub fn init(languages: Arc, node_runtime: Arc Arc::new(tailwind::TailwindLspAdapter::new(node_runtime.clone())), ], ); - language( - "elixir", - tree_sitter_elixir::language(), - vec![Arc::new(elixir::ElixirLspAdapter)], - ); + + match settings::get::(cx).next { + elixir_next::ElixirNextSetting::Off => language( + "elixir", + tree_sitter_elixir::language(), + vec![Arc::new(elixir::ElixirLspAdapter)], + ), + elixir_next::ElixirNextSetting::On => language( + "elixir", + tree_sitter_elixir::language(), + vec![Arc::new(elixir_next::BundledNextLspAdapter)], + ), + elixir_next::ElixirNextSetting::Local { port } => unimplemented!(), /*language( + "elixir", + tree_sitter_elixir::language(), + vec![Arc::new(elixir_next::LocalNextLspAdapter { port })], + )*/ + } + language( "go", tree_sitter_go::language(), diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index c800e4e11097b02101c730b6e47b2263294a38cd..7c69bc2db11da61b12afb728d2b9ab6613f58cb8 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -134,7 +134,7 @@ fn main() { let languages = Arc::new(languages); let node_runtime = RealNodeRuntime::new(http.clone()); - languages::init(languages.clone(), node_runtime.clone()); + languages::init(languages.clone(), node_runtime.clone(), cx); let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http.clone(), cx)); let channel_store = cx.add_model(|cx| ChannelStore::new(client.clone(), user_store.clone(), cx)); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index d968a92646c1d3854193e28f196d7f5597268bc8..8a74522df1a40574efb3df2fc47fcc4c87b3c7db 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -2392,7 +2392,7 @@ mod tests { languages.set_executor(cx.background().clone()); let languages = Arc::new(languages); let node_runtime = node_runtime::FakeNodeRuntime::new(); - languages::init(languages.clone(), node_runtime); + languages::init(languages.clone(), node_runtime, cx); for name in languages.language_names() { languages.language_for_name(&name); }