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:
parent
743feb98bc
commit
4f227fd3bf
20 changed files with 150 additions and 85 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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<_>>()
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue