From f52050a9ecac737788dbd6cbdb8d3784359aaf56 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 21 Apr 2022 12:08:16 -0700 Subject: [PATCH] Use the 'jsonc' language id for all JSON files This way, comments are allowed by the language server. --- crates/language/src/language.rs | 4 ++++ crates/project/src/project.rs | 21 +++++++++++++++++---- crates/zed/src/languages/json.rs | 8 ++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 37377b6eef79d628a646396088ae5f8aea832f63..8b7f751593b9c8fe77f155f24c4d6d78802ea845 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -102,6 +102,10 @@ pub trait LspAdapter: 'static + Send + Sync { fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> { None } + + fn id_for_language(&self, _name: &str) -> Option { + None + } } #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 5c1064400edbd0c411a71b536e2932f7fbe9291f..fbbba31d8f945cfa928d51ec5a0d4689a8a4b79a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1132,7 +1132,19 @@ impl Project { if file.is_local() { let uri = lsp::Url::from_file_path(file.abs_path(cx)).unwrap(); let initial_snapshot = buffer.text_snapshot(); - let language_server = self.language_server_for_buffer(buffer, cx).cloned(); + + let mut language_server = None; + let mut language_id = None; + if let Some(language) = buffer.language() { + let worktree_id = file.worktree_id(cx); + if let Some(adapter) = language.lsp_adapter() { + language_id = adapter.id_for_language(language.name().as_ref()); + language_server = self + .language_servers + .get(&(worktree_id, adapter.name())) + .cloned(); + } + } if let Some(local_worktree) = file.worktree.read(cx).as_local() { if let Some(diagnostics) = local_worktree.diagnostics_for_path(file.path()) { @@ -1147,7 +1159,7 @@ impl Project { lsp::DidOpenTextDocumentParams { text_document: lsp::TextDocumentItem::new( uri, - Default::default(), + language_id.unwrap_or_default(), 0, initial_snapshot.text(), ), @@ -1437,7 +1449,7 @@ impl Project { this.update(&mut cx, |this, cx| { this.language_servers - .insert(key.clone(), (adapter, language_server.clone())); + .insert(key.clone(), (adapter.clone(), language_server.clone())); this.language_server_statuses.insert( server_id, LanguageServerStatus { @@ -1494,12 +1506,13 @@ impl Project { .or_insert_with(|| vec![(0, buffer.text_snapshot())]); let (version, initial_snapshot) = versions.last().unwrap(); let uri = lsp::Url::from_file_path(file.abs_path(cx)).unwrap(); + let language_id = adapter.id_for_language(language.name().as_ref()); language_server .notify::( lsp::DidOpenTextDocumentParams { text_document: lsp::TextDocumentItem::new( uri, - Default::default(), + language_id.unwrap_or_default(), *version, initial_snapshot.text(), ), diff --git a/crates/zed/src/languages/json.rs b/crates/zed/src/languages/json.rs index 4069413f11129f826add608995bf5c792db709d1..5bbaba8d908fa49c89f735df2376e4ec8d0976fe 100644 --- a/crates/zed/src/languages/json.rs +++ b/crates/zed/src/languages/json.rs @@ -127,4 +127,12 @@ impl LspAdapter for JsonLspAdapter { "provideFormatter": true })) } + + fn id_for_language(&self, name: &str) -> Option { + if name == "JSON" { + Some("jsonc".into()) + } else { + None + } + } }