Merge pull request #1334 from zed-industries/plugin-id-for-language

Fix association of 'json' lsp language id with JSON language
This commit is contained in:
Max Brunsfeld 2022-07-12 16:03:31 -07:00 committed by GitHub
commit d0d750c559
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 14 deletions

View File

@ -74,7 +74,7 @@ pub struct CachedLspAdapter {
pub initialization_options: Option<Value>, pub initialization_options: Option<Value>,
pub disk_based_diagnostic_sources: Vec<String>, pub disk_based_diagnostic_sources: Vec<String>,
pub disk_based_diagnostics_progress_token: Option<String>, pub disk_based_diagnostics_progress_token: Option<String>,
pub id_for_language: Option<String>, pub language_ids: HashMap<String, String>,
pub adapter: Box<dyn LspAdapter>, pub adapter: Box<dyn LspAdapter>,
} }
@ -87,7 +87,7 @@ impl CachedLspAdapter {
let disk_based_diagnostic_sources = adapter.disk_based_diagnostic_sources().await; let disk_based_diagnostic_sources = adapter.disk_based_diagnostic_sources().await;
let disk_based_diagnostics_progress_token = let disk_based_diagnostics_progress_token =
adapter.disk_based_diagnostics_progress_token().await; adapter.disk_based_diagnostics_progress_token().await;
let id_for_language = adapter.id_for_language(name.0.as_ref()).await; let language_ids = adapter.language_ids().await;
Arc::new(CachedLspAdapter { Arc::new(CachedLspAdapter {
name, name,
@ -95,7 +95,7 @@ impl CachedLspAdapter {
initialization_options, initialization_options,
disk_based_diagnostic_sources, disk_based_diagnostic_sources,
disk_based_diagnostics_progress_token, disk_based_diagnostics_progress_token,
id_for_language, language_ids,
adapter, adapter,
}) })
} }
@ -199,8 +199,8 @@ pub trait LspAdapter: 'static + Send + Sync {
None None
} }
async fn id_for_language(&self, _name: &str) -> Option<String> { async fn language_ids(&self) -> HashMap<String, String> {
None Default::default()
} }
} }

View File

@ -1821,7 +1821,7 @@ impl Project {
if let Some(language) = buffer.language() { if let Some(language) = buffer.language() {
let worktree_id = file.worktree_id(cx); let worktree_id = file.worktree_id(cx);
if let Some(adapter) = language.lsp_adapter() { if let Some(adapter) = language.lsp_adapter() {
language_id = adapter.id_for_language.clone(); language_id = adapter.language_ids.get(language.name().as_ref()).cloned();
language_server = self language_server = self
.language_server_ids .language_server_ids
.get(&(worktree_id, adapter.name.clone())) .get(&(worktree_id, adapter.name.clone()))
@ -2320,8 +2320,9 @@ impl Project {
text_document: lsp::TextDocumentItem::new( text_document: lsp::TextDocumentItem::new(
uri, uri,
adapter adapter
.id_for_language .language_ids
.clone() .get(language.name().as_ref())
.cloned()
.unwrap_or_default(), .unwrap_or_default(),
*version, *version,
initial_snapshot.text(), initial_snapshot.text(),

View File

@ -1,6 +1,7 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use async_trait::async_trait; use async_trait::async_trait;
use client::http::HttpClient; use client::http::HttpClient;
use collections::HashMap;
use futures::lock::Mutex; use futures::lock::Mutex;
use gpui::executor::Background; use gpui::executor::Background;
use language::{LanguageServerName, LspAdapter}; use language::{LanguageServerName, LspAdapter};
@ -35,6 +36,7 @@ pub struct PluginLspAdapter {
fetch_server_binary: WasiFn<(PathBuf, String), Result<PathBuf, String>>, fetch_server_binary: WasiFn<(PathBuf, String), Result<PathBuf, String>>,
cached_server_binary: WasiFn<PathBuf, Option<PathBuf>>, cached_server_binary: WasiFn<PathBuf, Option<PathBuf>>,
initialization_options: WasiFn<(), String>, initialization_options: WasiFn<(), String>,
language_ids: WasiFn<(), Vec<(String, String)>>,
executor: Arc<Background>, executor: Arc<Background>,
runtime: Arc<Mutex<Plugin>>, runtime: Arc<Mutex<Plugin>>,
} }
@ -48,6 +50,7 @@ impl PluginLspAdapter {
fetch_server_binary: plugin.function("fetch_server_binary")?, fetch_server_binary: plugin.function("fetch_server_binary")?,
cached_server_binary: plugin.function("cached_server_binary")?, cached_server_binary: plugin.function("cached_server_binary")?,
initialization_options: plugin.function("initialization_options")?, initialization_options: plugin.function("initialization_options")?,
language_ids: plugin.function("language_ids")?,
executor, executor,
runtime: Arc::new(Mutex::new(plugin)), runtime: Arc::new(Mutex::new(plugin)),
}) })
@ -142,4 +145,16 @@ impl LspAdapter for PluginLspAdapter {
serde_json::from_str(&string).ok() serde_json::from_str(&string).ok()
} }
async fn language_ids(&self) -> HashMap<String, String> {
self.runtime
.lock()
.await
.call(&self.language_ids, ())
.await
.log_err()
.unwrap_or_default()
.into_iter()
.collect()
}
} }

View File

@ -94,10 +94,6 @@ pub fn initialization_options() -> Option<String> {
} }
#[export] #[export]
pub fn id_for_language(name: String) -> Option<String> { pub fn language_ids() -> Vec<(String, String)> {
if name == "JSON" { vec![("JSON".into(), "jsonc".into())]
Some("jsonc".into())
} else {
None
}
} }