Use LanguageServerName in more places (#18167)

This pushes the new LanguageServerName type to more places.

As both languages and language servers were identified by Arc<str>, it
was
sometimes hard to tell which was intended.

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin 2024-09-20 18:51:34 -06:00 committed by GitHub
parent 743feb98bc
commit 4f227fd3bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 150 additions and 85 deletions

View file

@ -139,11 +139,52 @@ pub trait ToLspPosition {
/// A name of a language server.
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]
pub struct LanguageServerName(pub Arc<str>);
pub struct LanguageServerName(pub SharedString);
impl std::fmt::Display for LanguageServerName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(&self.0, f)
}
}
impl AsRef<str> for LanguageServerName {
fn as_ref(&self) -> &str {
self.0.as_ref()
}
}
impl AsRef<OsStr> for LanguageServerName {
fn as_ref(&self) -> &OsStr {
self.0.as_ref().as_ref()
}
}
impl JsonSchema for LanguageServerName {
fn schema_name() -> String {
"LanguageServerName".into()
}
fn json_schema(_: &mut SchemaGenerator) -> Schema {
SchemaObject {
instance_type: Some(InstanceType::String.into()),
..Default::default()
}
.into()
}
}
impl LanguageServerName {
pub const fn new_static(s: &'static str) -> Self {
Self(SharedString::new_static(s))
}
pub fn from_proto(s: String) -> Self {
Self(Arc::from(s))
Self(s.into())
}
}
impl<'a> From<&'a str> for LanguageServerName {
fn from(str: &'a str) -> LanguageServerName {
LanguageServerName(str.to_string().into())
}
}
@ -202,8 +243,8 @@ impl CachedLspAdapter {
})
}
pub fn name(&self) -> Arc<str> {
self.adapter.name().0.clone()
pub fn name(&self) -> LanguageServerName {
self.adapter.name().clone()
}
pub async fn get_language_server_command(
@ -594,7 +635,7 @@ pub struct LanguageConfig {
pub block_comment: Option<(Arc<str>, Arc<str>)>,
/// A list of language servers that are allowed to run on subranges of a given language.
#[serde(default)]
pub scope_opt_in_language_servers: Vec<String>,
pub scope_opt_in_language_servers: Vec<LanguageServerName>,
#[serde(default)]
pub overrides: HashMap<String, LanguageConfigOverride>,
/// A list of characters that Zed should treat as word characters for the
@ -658,7 +699,7 @@ pub struct LanguageConfigOverride {
#[serde(default)]
pub word_characters: Override<HashSet<char>>,
#[serde(default)]
pub opt_into_language_servers: Vec<String>,
pub opt_into_language_servers: Vec<LanguageServerName>,
}
#[derive(Clone, Deserialize, Debug, Serialize, JsonSchema)]
@ -1479,9 +1520,9 @@ impl LanguageScope {
pub fn language_allowed(&self, name: &LanguageServerName) -> bool {
let config = &self.language.config;
let opt_in_servers = &config.scope_opt_in_language_servers;
if opt_in_servers.iter().any(|o| *o == *name.0) {
if opt_in_servers.iter().any(|o| *o == *name) {
if let Some(over) = self.config_override() {
over.opt_into_language_servers.iter().any(|o| *o == *name.0)
over.opt_into_language_servers.iter().any(|o| *o == *name)
} else {
false
}

View file

@ -99,7 +99,7 @@ pub struct LanguageSettings {
/// special tokens:
/// - `"!<language_server_id>"` - A language server ID prefixed with a `!` will be disabled.
/// - `"..."` - A placeholder to refer to the **rest** of the registered language servers for this language.
pub language_servers: Vec<Arc<str>>,
pub language_servers: Vec<String>,
/// Controls whether inline completions are shown immediately (true)
/// or manually by triggering `editor::ShowInlineCompletion` (false).
pub show_inline_completions: bool,
@ -137,22 +137,24 @@ impl LanguageSettings {
}
pub(crate) fn resolve_language_servers(
configured_language_servers: &[Arc<str>],
configured_language_servers: &[String],
available_language_servers: &[LanguageServerName],
) -> Vec<LanguageServerName> {
let (disabled_language_servers, enabled_language_servers): (Vec<Arc<str>>, Vec<Arc<str>>) =
configured_language_servers.iter().partition_map(
|language_server| match language_server.strip_prefix('!') {
Some(disabled) => Either::Left(disabled.into()),
None => Either::Right(language_server.clone()),
},
);
let (disabled_language_servers, enabled_language_servers): (
Vec<LanguageServerName>,
Vec<LanguageServerName>,
) = configured_language_servers.iter().partition_map(
|language_server| match language_server.strip_prefix('!') {
Some(disabled) => Either::Left(LanguageServerName(disabled.to_string().into())),
None => Either::Right(LanguageServerName(language_server.clone().into())),
},
);
let rest = available_language_servers
.iter()
.filter(|&available_language_server| {
!disabled_language_servers.contains(&available_language_server.0)
&& !enabled_language_servers.contains(&available_language_server.0)
!disabled_language_servers.contains(&available_language_server)
&& !enabled_language_servers.contains(&available_language_server)
})
.cloned()
.collect::<Vec<_>>();
@ -160,10 +162,10 @@ impl LanguageSettings {
enabled_language_servers
.into_iter()
.flat_map(|language_server| {
if language_server.as_ref() == Self::REST_OF_LANGUAGE_SERVERS {
if language_server.0.as_ref() == Self::REST_OF_LANGUAGE_SERVERS {
rest.clone()
} else {
vec![LanguageServerName(language_server.clone())]
vec![language_server.clone()]
}
})
.collect::<Vec<_>>()
@ -295,7 +297,7 @@ pub struct LanguageSettingsContent {
///
/// Default: ["..."]
#[serde(default)]
pub language_servers: Option<Vec<Arc<str>>>,
pub language_servers: Option<Vec<String>>,
/// Controls whether inline completions are shown immediately (true)
/// or manually by triggering `editor::ShowInlineCompletion` (false).
///
@ -1165,7 +1167,7 @@ mod tests {
names
.iter()
.copied()
.map(|name| LanguageServerName(name.into()))
.map(|name| LanguageServerName(name.to_string().into()))
.collect::<Vec<_>>()
}