diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 8b8184b174..fef7ace24f 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -63,48 +63,62 @@ pub trait ToLspPosition { #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct LanguageServerName(pub Arc); +use async_trait::async_trait; + +#[async_trait] pub trait LspAdapter: 'static + Send + Sync { - fn name(&self) -> LanguageServerName; - fn fetch_latest_server_version( + async fn name(&self) -> LanguageServerName; + async fn fetch_latest_server_version( &self, http: Arc, - ) -> BoxFuture<'static, Result>>; - fn fetch_server_binary( + ) -> Result>; + async fn fetch_server_binary( &self, version: Box, http: Arc, - container_dir: Arc, - ) -> BoxFuture<'static, Result>; - fn cached_server_binary(&self, container_dir: Arc) - -> BoxFuture<'static, Option>; + container_dir: PathBuf, + ) -> Result; + async fn cached_server_binary( + &self, + container_dir: PathBuf, + ) -> BoxFuture<'static, Option>; - fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {} + async fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {} - fn label_for_completion(&self, _: &lsp::CompletionItem, _: &Language) -> Option { + async fn label_for_completion( + &self, + _: &lsp::CompletionItem, + _: &Language, + ) -> Option { None } - fn label_for_symbol(&self, _: &str, _: lsp::SymbolKind, _: &Language) -> Option { + async fn label_for_symbol( + &self, + _: &str, + _: lsp::SymbolKind, + _: &Language, + ) -> Option { None } - fn server_args(&self) -> Vec { + async fn server_args(&self) -> Vec { Vec::new() } - fn initialization_options(&self) -> Option { + async fn initialization_options(&self) -> Option { None } - fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] { + async fn disk_based_diagnostic_sources(&self) -> &'static [&'static str] { Default::default() } - fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> { + async fn disk_based_diagnostics_progress_token(&self) -> Option<&'static str> { None } - fn id_for_language(&self, _name: &str) -> Option { + async fn id_for_language(&self, _name: &str) -> Option { None } } diff --git a/crates/zed/src/languages/language_plugin.rs b/crates/zed/src/languages/language_plugin.rs index 762e088333..cd935fc3f3 100644 --- a/crates/zed/src/languages/language_plugin.rs +++ b/crates/zed/src/languages/language_plugin.rs @@ -91,38 +91,41 @@ struct Versions { // I wish there was high-level instrumentation for this... // - it's totally a deadlock, the proof is in the pudding -macro_rules! call_block { - ($self:ident, $name:expr, $arg:expr) => { - $self.executor.block(async { - dbg!("starting to block on something"); - let locked = $self.runtime.lock(); - dbg!("locked runtime"); - // TODO: No blocking calls! - let mut awaited = locked.await; - dbg!("awaited lock"); - let called = awaited.call($name, $arg); - dbg!("called function"); - let result = called.await; - dbg!("awaited result"); - result - }) - }; -} +// macro_rules! call_block { +// ($self:ident, $name:expr, $arg:expr) => { +// $self.executor.block(async { +// dbg!("starting to block on something"); +// let locked = $self.runtime.lock(); +// dbg!("locked runtime"); +// // TODO: No blocking calls! +// let mut awaited = locked.await; +// dbg!("awaited lock"); +// let called = awaited.call($name, $arg); +// dbg!("called function"); +// let result = called.await; +// dbg!("awaited result"); +// result +// }) +// }; +// } +// TODO: convert to async trait + +#[async_trait] impl LspAdapter for PluginLspAdapter { - fn name(&self) -> LanguageServerName { + async fn name(&self) -> LanguageServerName { let name: String = call_block!(self, &self.name, ()).unwrap(); LanguageServerName(name.into()) } - fn server_args<'a>(&'a self) -> Vec { + async fn server_args<'a>(&'a self) -> Vec { call_block!(self, &self.server_args, ()).unwrap() } - fn fetch_latest_server_version( + async fn fetch_latest_server_version( &self, _: Arc, - ) -> BoxFuture<'static, Result>> { + ) -> Result> { // let versions: Result> = call_block!(self, "fetch_latest_server_version", ()); let runtime = self.runtime.clone(); let function = self.fetch_latest_server_version;