From 82d85fd2ed0454478905aac35613e2645dd6d1ba Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Wed, 5 Mar 2025 10:31:21 -0500 Subject: [PATCH] deno: Extract to zed-extensions/deno repository (#26129) This PR extracts the Deno extension to the [zed-extensions/deno](https://github.com/zed-extensions/deno) repository. Release Notes: - N/A --- Cargo.lock | 7 -- Cargo.toml | 1 - docs/src/languages/deno.md | 2 +- extensions/deno/Cargo.toml | 16 ---- extensions/deno/LICENSE-APACHE | 1 - extensions/deno/extension.toml | 13 --- extensions/deno/src/deno.rs | 169 --------------------------------- 7 files changed, 1 insertion(+), 208 deletions(-) delete mode 100644 extensions/deno/Cargo.toml delete mode 120000 extensions/deno/LICENSE-APACHE delete mode 100644 extensions/deno/extension.toml delete mode 100644 extensions/deno/src/deno.rs diff --git a/Cargo.lock b/Cargo.lock index d9a731b371..e457da95a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17001,13 +17001,6 @@ dependencies = [ "zed_extension_api 0.1.0", ] -[[package]] -name = "zed_deno" -version = "0.1.0" -dependencies = [ - "zed_extension_api 0.1.0", -] - [[package]] name = "zed_elixir" version = "0.1.4" diff --git a/Cargo.toml b/Cargo.toml index 59626e60b2..1ed42b7109 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -169,7 +169,6 @@ members = [ # "extensions/csharp", - "extensions/deno", "extensions/elixir", "extensions/emmet", "extensions/erlang", diff --git a/docs/src/languages/deno.md b/docs/src/languages/deno.md index 9ba1526ab0..15d3efd772 100644 --- a/docs/src/languages/deno.md +++ b/docs/src/languages/deno.md @@ -1,6 +1,6 @@ # Deno -Deno support is available through the [Deno extension](https://github.com/zed-industries/zed/tree/main/extensions/deno). +Deno support is available through the [Deno extension](https://github.com/zed-extensions/deno). - Language server: [Deno Language Server](https://docs.deno.com/runtime/manual/advanced/language_server/overview/) diff --git a/extensions/deno/Cargo.toml b/extensions/deno/Cargo.toml deleted file mode 100644 index e2ebc7a677..0000000000 --- a/extensions/deno/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "zed_deno" -version = "0.1.0" -edition.workspace = true -publish.workspace = true -license = "Apache-2.0" - -[lints] -workspace = true - -[lib] -path = "src/deno.rs" -crate-type = ["cdylib"] - -[dependencies] -zed_extension_api = "0.1.0" diff --git a/extensions/deno/LICENSE-APACHE b/extensions/deno/LICENSE-APACHE deleted file mode 120000 index 1cd601d0a3..0000000000 --- a/extensions/deno/LICENSE-APACHE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE-APACHE \ No newline at end of file diff --git a/extensions/deno/extension.toml b/extensions/deno/extension.toml deleted file mode 100644 index 0c0984216f..0000000000 --- a/extensions/deno/extension.toml +++ /dev/null @@ -1,13 +0,0 @@ -id = "deno" -name = "Deno" -description = "Deno support." -version = "0.1.0" -schema_version = 1 -authors = ["Lino Le Van <11367844+lino-levan@users.noreply.github.com>"] -repository = "https://github.com/zed-industries/zed" - -[language_servers.deno] -name = "Deno Language Server" -languages = ["TypeScript", "TSX", "JavaScript", "JSDoc"] -language_ids = { "TypeScript" = "typescript", "TSX" = "typescriptreact", "JavaScript" = "javascript" } -code_action_kinds = ["quickfix", "refactor", "refactor.extract", "source"] diff --git a/extensions/deno/src/deno.rs b/extensions/deno/src/deno.rs deleted file mode 100644 index 7ef83574ab..0000000000 --- a/extensions/deno/src/deno.rs +++ /dev/null @@ -1,169 +0,0 @@ -use std::fs; -use zed::lsp::CompletionKind; -use zed::{serde_json, CodeLabel, CodeLabelSpan, LanguageServerId}; -use zed_extension_api::settings::LspSettings; -use zed_extension_api::{self as zed, Result}; - -struct DenoExtension { - cached_binary_path: Option, -} - -impl DenoExtension { - fn language_server_binary_path( - &mut self, - language_server_id: &LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - if let Some(path) = worktree.which("deno") { - return Ok(path); - } - - if let Some(path) = &self.cached_binary_path { - if fs::metadata(path).map_or(false, |stat| stat.is_file()) { - return Ok(path.clone()); - } - } - - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::CheckingForUpdate, - ); - let release = zed::latest_github_release( - "denoland/deno", - zed::GithubReleaseOptions { - require_assets: true, - pre_release: false, - }, - )?; - - let (platform, arch) = zed::current_platform(); - let asset_name = format!( - "deno-{arch}-{os}.zip", - arch = match arch { - zed::Architecture::Aarch64 => "aarch64", - zed::Architecture::X8664 => "x86_64", - zed::Architecture::X86 => - return Err(format!("unsupported architecture: {arch:?}")), - }, - os = match platform { - zed::Os::Mac => "apple-darwin", - zed::Os::Linux => "unknown-linux-gnu", - zed::Os::Windows => "pc-windows-msvc", - }, - ); - - let asset = release - .assets - .iter() - .find(|asset| asset.name == asset_name) - .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?; - - let version_dir = format!("deno-{}", release.version); - let binary_path = format!("{version_dir}/deno"); - - if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) { - zed::set_language_server_installation_status( - language_server_id, - &zed::LanguageServerInstallationStatus::Downloading, - ); - - zed::download_file( - &asset.download_url, - &version_dir, - zed::DownloadedFileType::Zip, - ) - .map_err(|e| format!("failed to download file: {e}"))?; - - zed::make_file_executable(&binary_path)?; - - let entries = - fs::read_dir(".").map_err(|e| format!("failed to list working directory {e}"))?; - for entry in entries { - let entry = entry.map_err(|e| format!("failed to load directory entry {e}"))?; - if entry.file_name().to_str() != Some(&version_dir) { - fs::remove_dir_all(entry.path()).ok(); - } - } - } - - self.cached_binary_path = Some(binary_path.clone()); - Ok(binary_path) - } -} - -impl zed::Extension for DenoExtension { - fn new() -> Self { - Self { - cached_binary_path: None, - } - } - - fn language_server_command( - &mut self, - language_server_id: &LanguageServerId, - worktree: &zed::Worktree, - ) -> Result { - Ok(zed::Command { - command: self.language_server_binary_path(language_server_id, worktree)?, - args: vec!["lsp".to_string()], - env: Default::default(), - }) - } - - fn language_server_initialization_options( - &mut self, - _language_server_id: &zed::LanguageServerId, - _worktree: &zed::Worktree, - ) -> Result> { - Ok(Some(serde_json::json!({ - "provideFormatter": true, - }))) - } - - fn language_server_workspace_configuration( - &mut self, - _language_server_id: &zed::LanguageServerId, - worktree: &zed::Worktree, - ) -> Result> { - let settings = LspSettings::for_worktree("deno", worktree) - .ok() - .and_then(|lsp_settings| lsp_settings.settings.clone()) - .unwrap_or_default(); - Ok(Some(settings)) - } - - fn label_for_completion( - &self, - _language_server_id: &LanguageServerId, - completion: zed::lsp::Completion, - ) -> Option { - let highlight_name = match completion.kind? { - CompletionKind::Class | CompletionKind::Interface | CompletionKind::Constructor => { - "type" - } - CompletionKind::Constant => "constant", - CompletionKind::Function | CompletionKind::Method => "function", - CompletionKind::Property | CompletionKind::Field => "property", - _ => return None, - }; - - let len = completion.label.len(); - let name_span = CodeLabelSpan::literal(completion.label, Some(highlight_name.to_string())); - - Some(zed::CodeLabel { - code: Default::default(), - spans: if let Some(detail) = completion.detail { - vec![ - name_span, - CodeLabelSpan::literal(" ", None), - CodeLabelSpan::literal(detail, None), - ] - } else { - vec![name_span] - }, - filter_range: (0..len).into(), - }) - } -} - -zed::register_extension!(DenoExtension);