Get nextLS running

Mikayla created

Change summary

Cargo.lock                             |  1 
assets/settings/default.json           | 21 ++++++++++++++++
crates/semantic_index/examples/eval.rs |  2 
crates/zed/Cargo.toml                  |  1 
crates/zed/src/languages.rs            | 36 +++++++++++++++++++++++----
crates/zed/src/main.rs                 |  2 
crates/zed/src/zed.rs                  |  2 
7 files changed, 56 insertions(+), 9 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -9861,6 +9861,7 @@ dependencies = [
  "rpc",
  "rsa",
  "rust-embed",
+ "schemars",
  "search",
  "semantic_index",
  "serde",

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": {

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);

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

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<LanguageRegistry>, node_runtime: Arc<dyn NodeRuntime>) {
+pub fn init(
+    languages: Arc<LanguageRegistry>,
+    node_runtime: Arc<dyn NodeRuntime>,
+    cx: &mut AppContext,
+) {
+    settings::register::<elixir_next::ElixirSettings>(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<LanguageRegistry>, node_runtime: Arc<dyn NodeRuntime>
             Arc::new(tailwind::TailwindLspAdapter::new(node_runtime.clone())),
         ],
     );
-    language(
-        "elixir",
-        tree_sitter_elixir::language(),
-        vec![Arc::new(elixir::ElixirLspAdapter)],
-    );
+
+    match settings::get::<ElixirSettings>(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(),

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));

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);
         }