diff --git a/crates/zed/src/languages/language_plugin.rs b/crates/zed/src/languages/language_plugin.rs index 45eff32316..4def96beb5 100644 --- a/crates/zed/src/languages/language_plugin.rs +++ b/crates/zed/src/languages/language_plugin.rs @@ -61,21 +61,20 @@ impl LspAdapter for PluginLspAdapter { &self, _: Arc, ) -> BoxFuture<'static, Result>> { - todo!() - // async move { - // let versions: Result = self - // .runtime - // .lock() - // .call::<_, Option>("fetch_latest_server_version", ()) - // .await?; - // versions.map(|(language_version, server_version)| { - // Box::new(Versions { - // language_version, - // server_version, - // }) as Box<_> - // }) - // } - // .boxed() + let versions: Result> = call_block!(self, "fetch_latest_server_version", ()); + async move { + // let versions: Result> = self + // .runtime + // .lock() + // .call::<_, Option>("fetch_latest_server_version", ()) + // .await; + + versions + .map_err(|e| anyhow!("{}", e))? + .ok_or_else(|| anyhow!("Could not fetch latest server version")) + .map(|v| Box::new(v) as Box<_>) + } + .boxed() } fn fetch_server_binary( @@ -84,37 +83,30 @@ impl LspAdapter for PluginLspAdapter { _: Arc, container_dir: PathBuf, ) -> BoxFuture<'static, Result> { - todo!() - // let version = version.downcast::().unwrap(); + let version = version.downcast::().unwrap(); + let mut runtime = self.runtime.lock(); + let result = (|| { + let handle = runtime.attach_path(&container_dir)?; + let result: Option = + call_block!(self, "fetch_server_binary", (container_dir, version))?; + runtime.remove_resource(handle)?; + result.ok_or_else(|| anyhow!("Could not load cached server binary")) + })(); - // async move { - // let runtime = self.runtime.clone(); - // let handle = runtime.lock().attach_path(&container_dir).unwrap(); - // let result = runtime - // .lock() - // .call::<_, Option>("fetch_server_binary", container_dir) - // .await - // .unwrap() - // .ok_or_else(|| anyhow!("Could not load cached server binary")); - // // runtime.remove_resource(handle).ok(); - // result - // } - // .boxed() + async move { result }.boxed() } fn cached_server_binary(&self, container_dir: PathBuf) -> BoxFuture<'static, Option> { - todo!() - // let runtime = self.runtime.clone(); - // async move { - // let handle = runtime.lock().attach_path(&container_dir).ok()?; - // let result = runtime - // .lock() - // .call::<_, Option>("cached_server_binary", container_dir); - // let result = result.await; - // runtime.lock().remove_resource(handle).ok()?; - // result.ok()? - // } - // .boxed() + let mut runtime = self.runtime.lock(); + let result: Option = (|| { + let handle = runtime.attach_path(&container_dir).ok()?; + let result: Option = + call_block!(self, "cached_server_binary", container_dir).ok()?; + runtime.remove_resource(handle).ok()?; + result + })(); + + async move { result }.boxed() } fn process_diagnostics(&self, _: &mut lsp::PublishDiagnosticsParams) {} diff --git a/plugins/json_language/src/lib.rs b/plugins/json_language/src/lib.rs index f0ffc74598..8828d3c566 100644 --- a/plugins/json_language/src/lib.rs +++ b/plugins/json_language/src/lib.rs @@ -41,24 +41,24 @@ pub fn server_args() -> Vec { vec!["--stdio".into()] } -// #[bind] -// pub fn fetch_latest_server_version() -> Option { -// #[derive(Deserialize)] -// struct NpmInfo { -// versions: Vec, -// } +#[bind] +pub fn fetch_latest_server_version() -> Option { + #[derive(Deserialize)] + struct NpmInfo { + versions: Vec, + } -// let output = command("npm info vscode-json-languageserver --json")?; -// if !output.status.success() { -// return None; -// } + let output = command("npm info vscode-json-languageserver --json")?; + if !output.status.success() { + return None; + } -// let mut info: NpmInfo = serde_json::from_slice(&output.stdout)?; -// info.versions.pop() -// } + let mut info: NpmInfo = serde_json::from_slice(&output.stdout)?; + info.versions.pop() +} // #[bind] -// pub fn fetch_server_binary(container_dir: PathBuf, version: String) -> Result { +// pub fn fetch_server_binary(container_dir: PathBuf, version: String) -> Option { // let version_dir = container_dir.join(version.as_str()); // fs::create_dir_all(&version_dir) // .or_or_else(|| "failed to create version directory".to_string())?;