Use a better type for language IDs field (#35566)

Part of the preparation for proto capabilities.

Release Notes:

- N/A
This commit is contained in:
Kirill Bulatov 2025-08-04 10:12:02 +03:00 committed by GitHub
parent 1b3d6139b8
commit 5ca5d90234
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 52 additions and 50 deletions

View file

@ -163,7 +163,7 @@ pub struct LanguageServerManifestEntry {
#[serde(default)] #[serde(default)]
languages: Vec<LanguageName>, languages: Vec<LanguageName>,
#[serde(default)] #[serde(default)]
pub language_ids: HashMap<String, String>, pub language_ids: HashMap<LanguageName, String>,
#[serde(default)] #[serde(default)]
pub code_action_kinds: Option<Vec<lsp::CodeActionKind>>, pub code_action_kinds: Option<Vec<lsp::CodeActionKind>>,
} }

View file

@ -161,7 +161,7 @@ pub struct CachedLspAdapter {
pub name: LanguageServerName, pub name: LanguageServerName,
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>,
language_ids: HashMap<String, String>, language_ids: HashMap<LanguageName, String>,
pub adapter: Arc<dyn LspAdapter>, pub adapter: Arc<dyn LspAdapter>,
pub reinstall_attempt_count: AtomicU64, pub reinstall_attempt_count: AtomicU64,
cached_binary: futures::lock::Mutex<Option<LanguageServerBinary>>, cached_binary: futures::lock::Mutex<Option<LanguageServerBinary>>,
@ -277,10 +277,11 @@ impl CachedLspAdapter {
pub fn language_id(&self, language_name: &LanguageName) -> String { pub fn language_id(&self, language_name: &LanguageName) -> String {
self.language_ids self.language_ids
.get(language_name.as_ref()) .get(language_name)
.cloned() .cloned()
.unwrap_or_else(|| language_name.lsp_id()) .unwrap_or_else(|| language_name.lsp_id())
} }
pub fn manifest_name(&self) -> Option<ManifestName> { pub fn manifest_name(&self) -> Option<ManifestName> {
self.manifest_name self.manifest_name
.get_or_init(|| self.adapter.manifest_name()) .get_or_init(|| self.adapter.manifest_name())
@ -573,8 +574,8 @@ pub trait LspAdapter: 'static + Send + Sync {
None None
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
Default::default() HashMap::default()
} }
/// Support custom initialize params. /// Support custom initialize params.

View file

@ -242,7 +242,7 @@ impl LspAdapter for ExtensionLspAdapter {
])) ]))
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
// TODO: The language IDs can be provided via the language server options // TODO: The language IDs can be provided via the language server options
// in `extension.toml now but we're leaving these existing usages in place temporarily // in `extension.toml now but we're leaving these existing usages in place temporarily
// to avoid any compatibility issues between Zed and the extension versions. // to avoid any compatibility issues between Zed and the extension versions.
@ -250,7 +250,7 @@ impl LspAdapter for ExtensionLspAdapter {
// We can remove once the following extension versions no longer see any use: // We can remove once the following extension versions no longer see any use:
// - php@0.0.1 // - php@0.0.1
if self.extension.manifest().id.as_ref() == "php" { if self.extension.manifest().id.as_ref() == "php" {
return HashMap::from_iter([("PHP".into(), "php".into())]); return HashMap::from_iter([(LanguageName::new("PHP"), "php".into())]);
} }
self.extension self.extension

View file

@ -8,8 +8,8 @@ use futures::StreamExt;
use gpui::{App, AsyncApp, Task}; use gpui::{App, AsyncApp, Task};
use http_client::github::{GitHubLspBinaryVersion, latest_github_release}; use http_client::github::{GitHubLspBinaryVersion, latest_github_release};
use language::{ use language::{
ContextProvider, LanguageRegistry, LanguageToolchainStore, LocalFile as _, LspAdapter, ContextProvider, LanguageName, LanguageRegistry, LanguageToolchainStore, LocalFile as _,
LspAdapterDelegate, LspAdapter, LspAdapterDelegate,
}; };
use lsp::{LanguageServerBinary, LanguageServerName}; use lsp::{LanguageServerBinary, LanguageServerName};
use node_runtime::NodeRuntime; use node_runtime::NodeRuntime;
@ -408,10 +408,10 @@ impl LspAdapter for JsonLspAdapter {
Ok(config) Ok(config)
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
[ [
("JSON".into(), "json".into()), (LanguageName::new("JSON"), "json".into()),
("JSONC".into(), "jsonc".into()), (LanguageName::new("JSONC"), "jsonc".into()),
] ]
.into_iter() .into_iter()
.collect() .collect()

View file

@ -3,7 +3,7 @@ use async_trait::async_trait;
use collections::HashMap; use collections::HashMap;
use futures::StreamExt; use futures::StreamExt;
use gpui::AsyncApp; use gpui::AsyncApp;
use language::{LanguageToolchainStore, LspAdapter, LspAdapterDelegate}; use language::{LanguageName, LanguageToolchainStore, LspAdapter, LspAdapterDelegate};
use lsp::{LanguageServerBinary, LanguageServerName}; use lsp::{LanguageServerBinary, LanguageServerName};
use node_runtime::NodeRuntime; use node_runtime::NodeRuntime;
use project::{Fs, lsp_store::language_server_settings}; use project::{Fs, lsp_store::language_server_settings};
@ -168,20 +168,20 @@ impl LspAdapter for TailwindLspAdapter {
})) }))
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
HashMap::from_iter([ HashMap::from_iter([
("Astro".to_string(), "astro".to_string()), (LanguageName::new("Astro"), "astro".to_string()),
("HTML".to_string(), "html".to_string()), (LanguageName::new("HTML"), "html".to_string()),
("CSS".to_string(), "css".to_string()), (LanguageName::new("CSS"), "css".to_string()),
("JavaScript".to_string(), "javascript".to_string()), (LanguageName::new("JavaScript"), "javascript".to_string()),
("TSX".to_string(), "typescriptreact".to_string()), (LanguageName::new("TSX"), "typescriptreact".to_string()),
("Svelte".to_string(), "svelte".to_string()), (LanguageName::new("Svelte"), "svelte".to_string()),
("Elixir".to_string(), "phoenix-heex".to_string()), (LanguageName::new("Elixir"), "phoenix-heex".to_string()),
("HEEX".to_string(), "phoenix-heex".to_string()), (LanguageName::new("HEEX"), "phoenix-heex".to_string()),
("ERB".to_string(), "erb".to_string()), (LanguageName::new("ERB"), "erb".to_string()),
("HTML/ERB".to_string(), "erb".to_string()), (LanguageName::new("HTML/ERB"), "erb".to_string()),
("PHP".to_string(), "php".to_string()), (LanguageName::new("PHP"), "php".to_string()),
("Vue.js".to_string(), "vue".to_string()), (LanguageName::new("Vue.js"), "vue".to_string()),
]) ])
} }
} }

View file

@ -8,7 +8,8 @@ use futures::future::join_all;
use gpui::{App, AppContext, AsyncApp, Task}; use gpui::{App, AppContext, AsyncApp, Task};
use http_client::github::{AssetKind, GitHubLspBinaryVersion, build_asset_url}; use http_client::github::{AssetKind, GitHubLspBinaryVersion, build_asset_url};
use language::{ use language::{
ContextLocation, ContextProvider, File, LanguageToolchainStore, LspAdapter, LspAdapterDelegate, ContextLocation, ContextProvider, File, LanguageName, LanguageToolchainStore, LspAdapter,
LspAdapterDelegate,
}; };
use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName}; use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName};
use node_runtime::NodeRuntime; use node_runtime::NodeRuntime;
@ -741,11 +742,11 @@ impl LspAdapter for TypeScriptLspAdapter {
})) }))
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
HashMap::from_iter([ HashMap::from_iter([
("TypeScript".into(), "typescript".into()), (LanguageName::new("TypeScript"), "typescript".into()),
("JavaScript".into(), "javascript".into()), (LanguageName::new("JavaScript"), "javascript".into()),
("TSX".into(), "typescriptreact".into()), (LanguageName::new("TSX"), "typescriptreact".into()),
]) ])
} }
} }

View file

@ -2,7 +2,7 @@ use anyhow::Result;
use async_trait::async_trait; use async_trait::async_trait;
use collections::HashMap; use collections::HashMap;
use gpui::AsyncApp; use gpui::AsyncApp;
use language::{LanguageToolchainStore, LspAdapter, LspAdapterDelegate}; use language::{LanguageName, LanguageToolchainStore, LspAdapter, LspAdapterDelegate};
use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName}; use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName};
use node_runtime::NodeRuntime; use node_runtime::NodeRuntime;
use project::{Fs, lsp_store::language_server_settings}; use project::{Fs, lsp_store::language_server_settings};
@ -273,11 +273,11 @@ impl LspAdapter for VtslsLspAdapter {
Ok(default_workspace_configuration) Ok(default_workspace_configuration)
} }
fn language_ids(&self) -> HashMap<String, String> { fn language_ids(&self) -> HashMap<LanguageName, String> {
HashMap::from_iter([ HashMap::from_iter([
("TypeScript".into(), "typescript".into()), (LanguageName::new("TypeScript"), "typescript".into()),
("JavaScript".into(), "javascript".into()), (LanguageName::new("JavaScript"), "javascript".into()),
("TSX".into(), "typescriptreact".into()), (LanguageName::new("TSX"), "typescriptreact".into()),
]) ])
} }
} }

View file

@ -3580,6 +3580,18 @@ impl LspCommand for GetCodeLens {
} }
} }
impl LinkedEditingRange {
pub fn check_server_capabilities(capabilities: ServerCapabilities) -> bool {
let Some(linked_editing_options) = capabilities.linked_editing_range_provider else {
return false;
};
if let LinkedEditingRangeServerCapabilities::Simple(false) = linked_editing_options {
return false;
}
true
}
}
#[async_trait(?Send)] #[async_trait(?Send)]
impl LspCommand for LinkedEditingRange { impl LspCommand for LinkedEditingRange {
type Response = Vec<Range<Anchor>>; type Response = Vec<Range<Anchor>>;
@ -3591,16 +3603,7 @@ impl LspCommand for LinkedEditingRange {
} }
fn check_capabilities(&self, capabilities: AdapterServerCapabilities) -> bool { fn check_capabilities(&self, capabilities: AdapterServerCapabilities) -> bool {
let Some(linked_editing_options) = &capabilities Self::check_server_capabilities(capabilities.server_capabilities)
.server_capabilities
.linked_editing_range_provider
else {
return false;
};
if let LinkedEditingRangeServerCapabilities::Simple(false) = linked_editing_options {
return false;
}
true
} }
fn to_lsp( fn to_lsp(

View file

@ -5069,10 +5069,7 @@ impl LspStore {
local local
.language_servers_for_buffer(buffer, cx) .language_servers_for_buffer(buffer, cx)
.filter(|(_, server)| { .filter(|(_, server)| {
server LinkedEditingRange::check_server_capabilities(server.capabilities())
.capabilities()
.linked_editing_range_provider
.is_some()
}) })
.filter(|(adapter, _)| { .filter(|(adapter, _)| {
scope scope