@@ -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"]
@@ -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<String>,
-}
-
-impl DenoExtension {
- fn language_server_binary_path(
- &mut self,
- language_server_id: &LanguageServerId,
- worktree: &zed::Worktree,
- ) -> Result<String> {
- 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<zed::Command> {
- 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<Option<serde_json::Value>> {
- Ok(Some(serde_json::json!({
- "provideFormatter": true,
- })))
- }
-
- fn language_server_workspace_configuration(
- &mut self,
- _language_server_id: &zed::LanguageServerId,
- worktree: &zed::Worktree,
- ) -> Result<Option<serde_json::Value>> {
- 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<CodeLabel> {
- 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);