Skip to content

Commit

Permalink
Use LanguageServerName in more places (#18167)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ConradIrwin committed Sep 21, 2024
1 parent 743feb9 commit 4f227fd
Show file tree
Hide file tree
Showing 20 changed files with 150 additions and 85 deletions.
7 changes: 5 additions & 2 deletions crates/activity_indicator/src/activity_indicator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ use workspace::{item::ItemHandle, StatusItemView, Workspace};
actions!(activity_indicator, [ShowErrorMessage]);

pub enum Event {
ShowError { lsp_name: Arc<str>, error: String },
ShowError {
lsp_name: LanguageServerName,
error: String,
},
}

pub struct ActivityIndicator {
Expand Down Expand Up @@ -123,7 +126,7 @@ impl ActivityIndicator {
self.statuses.retain(|status| {
if let LanguageServerBinaryStatus::Failed { error } = &status.status {
cx.emit(Event::ShowError {
lsp_name: status.name.0.clone(),
lsp_name: status.name.clone(),
error: error.clone(),
});
false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ async fn test_sharing_an_ssh_remote_project(
all_language_settings(file, cx)
.language(Some(&("Rust".into())))
.language_servers,
["override-rust-analyzer".into()]
["override-rust-analyzer".to_string()]
)
});

Expand Down
4 changes: 2 additions & 2 deletions crates/extension/src/wasm_host/wit/since_v0_1_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ use futures::{io::BufReader, FutureExt as _};
use futures::{lock::Mutex, AsyncReadExt};
use indexed_docs::IndexedDocsDatabase;
use isahc::config::{Configurable, RedirectPolicy};
use language::LanguageName;
use language::{
language_settings::AllLanguageSettings, LanguageServerBinaryStatus, LspAdapterDelegate,
};
use language::{LanguageName, LanguageServerName};
use project::project_settings::ProjectSettings;
use semantic_version::SemanticVersion;
use std::{
Expand Down Expand Up @@ -366,7 +366,7 @@ impl ExtensionImports for WasmState {
.and_then(|key| {
ProjectSettings::get(location, cx)
.lsp
.get(&Arc::<str>::from(key))
.get(&LanguageServerName(key.into()))
})
.cloned()
.unwrap_or_default();
Expand Down
4 changes: 2 additions & 2 deletions crates/extension/src/wasm_host/wit/since_v0_2_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ use futures::{io::BufReader, FutureExt as _};
use futures::{lock::Mutex, AsyncReadExt};
use indexed_docs::IndexedDocsDatabase;
use isahc::config::{Configurable, RedirectPolicy};
use language::LanguageName;
use language::{
language_settings::AllLanguageSettings, LanguageServerBinaryStatus, LspAdapterDelegate,
};
use language::{LanguageName, LanguageServerName};
use project::project_settings::ProjectSettings;
use semantic_version::SemanticVersion;
use std::{
Expand Down Expand Up @@ -412,7 +412,7 @@ impl ExtensionImports for WasmState {
.and_then(|key| {
ProjectSettings::get(location, cx)
.lsp
.get(&Arc::<str>::from(key))
.get(&LanguageServerName::from_proto(key))
})
.cloned()
.unwrap_or_default();
Expand Down
7 changes: 7 additions & 0 deletions crates/gpui/src/shared_string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ use util::arc_cow::ArcCow;
#[derive(Deref, DerefMut, Eq, PartialEq, PartialOrd, Ord, Hash, Clone)]
pub struct SharedString(ArcCow<'static, str>);

impl SharedString {
/// creates a static SharedString
pub const fn new_static(s: &'static str) -> Self {
Self(ArcCow::Borrowed(s))
}
}

impl Default for SharedString {
fn default() -> Self {
Self(ArcCow::Owned(Arc::default()))
Expand Down
57 changes: 49 additions & 8 deletions crates/language/src/language.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
}

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)]
Expand Down Expand Up @@ -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
}
Expand Down
32 changes: 17 additions & 15 deletions crates/language/src/language_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -137,33 +137,35 @@ 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<_>>();

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<_>>()
Expand Down Expand Up @@ -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).
///
Expand Down Expand Up @@ -1165,7 +1167,7 @@ mod tests {
names
.iter()
.copied()
.map(|name| LanguageServerName(name.into()))
.map(|name| LanguageServerName(name.to_string().into()))
.collect::<Vec<_>>()
}

Expand Down
2 changes: 1 addition & 1 deletion crates/language_tools/src/lsp_log.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ impl LogStore {
));
this.add_language_server(
LanguageServerKind::Global {
name: LanguageServerName(Arc::from("copilot")),
name: LanguageServerName::new_static("copilot"),
},
server.server_id(),
Some(server.clone()),
Expand Down
7 changes: 4 additions & 3 deletions crates/languages/src/c.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ use util::{fs::remove_matching, maybe, ResultExt};
pub struct CLspAdapter;

impl CLspAdapter {
const SERVER_NAME: &'static str = "clangd";
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("clangd");
}

#[async_trait(?Send)]
impl super::LspAdapter for CLspAdapter {
fn name(&self) -> LanguageServerName {
LanguageServerName(Self::SERVER_NAME.into())
Self::SERVER_NAME.clone()
}

async fn check_if_user_installed(
Expand All @@ -28,7 +28,8 @@ impl super::LspAdapter for CLspAdapter {
cx: &AsyncAppContext,
) -> Option<LanguageServerBinary> {
let configured_binary = cx.update(|cx| {
language_server_settings(delegate, Self::SERVER_NAME, cx).and_then(|s| s.binary.clone())
language_server_settings(delegate, &Self::SERVER_NAME, cx)
.and_then(|s| s.binary.clone())
});

match configured_binary {
Expand Down
7 changes: 4 additions & 3 deletions crates/languages/src/go.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ fn server_binary_arguments() -> Vec<OsString> {
pub struct GoLspAdapter;

impl GoLspAdapter {
const SERVER_NAME: &'static str = "gopls";
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("gopls");
}

static GOPLS_VERSION_REGEX: LazyLock<Regex> =
Expand All @@ -46,7 +46,7 @@ static GO_ESCAPE_SUBTEST_NAME_REGEX: LazyLock<Regex> = LazyLock::new(|| {
#[async_trait(?Send)]
impl super::LspAdapter for GoLspAdapter {
fn name(&self) -> LanguageServerName {
LanguageServerName(Self::SERVER_NAME.into())
Self::SERVER_NAME.clone()
}

async fn fetch_latest_server_version(
Expand All @@ -71,7 +71,8 @@ impl super::LspAdapter for GoLspAdapter {
cx: &AsyncAppContext,
) -> Option<LanguageServerBinary> {
let configured_binary = cx.update(|cx| {
language_server_settings(delegate, Self::SERVER_NAME, cx).and_then(|s| s.binary.clone())
language_server_settings(delegate, &Self::SERVER_NAME, cx)
.and_then(|s| s.binary.clone())
});

match configured_binary {
Expand Down
21 changes: 14 additions & 7 deletions crates/languages/src/python.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pub struct PythonLspAdapter {
}

impl PythonLspAdapter {
const SERVER_NAME: &'static str = "pyright";
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("pyright");

pub fn new(node: Arc<dyn NodeRuntime>) -> Self {
PythonLspAdapter { node }
Expand All @@ -40,7 +40,7 @@ impl PythonLspAdapter {
#[async_trait(?Send)]
impl LspAdapter for PythonLspAdapter {
fn name(&self) -> LanguageServerName {
LanguageServerName(Self::SERVER_NAME.into())
Self::SERVER_NAME.clone()
}

async fn fetch_latest_server_version(
Expand All @@ -49,7 +49,7 @@ impl LspAdapter for PythonLspAdapter {
) -> Result<Box<dyn 'static + Any + Send>> {
Ok(Box::new(
self.node
.npm_package_latest_version(Self::SERVER_NAME)
.npm_package_latest_version(Self::SERVER_NAME.as_ref())
.await?,
) as Box<_>)
}
Expand All @@ -62,16 +62,23 @@ impl LspAdapter for PythonLspAdapter {
) -> Result<LanguageServerBinary> {
let latest_version = latest_version.downcast::<String>().unwrap();
let server_path = container_dir.join(SERVER_PATH);
let package_name = Self::SERVER_NAME;

let should_install_language_server = self
.node
.should_install_npm_package(package_name, &server_path, &container_dir, &latest_version)
.should_install_npm_package(
Self::SERVER_NAME.as_ref(),
&server_path,
&container_dir,
&latest_version,
)
.await;

if should_install_language_server {
self.node
.npm_install_packages(&container_dir, &[(package_name, latest_version.as_str())])
.npm_install_packages(
&container_dir,
&[(Self::SERVER_NAME.as_ref(), latest_version.as_str())],
)
.await?;
}

Expand Down Expand Up @@ -182,7 +189,7 @@ impl LspAdapter for PythonLspAdapter {
cx: &mut AsyncAppContext,
) -> Result<Value> {
cx.update(|cx| {
language_server_settings(adapter.as_ref(), Self::SERVER_NAME, cx)
language_server_settings(adapter.as_ref(), &Self::SERVER_NAME, cx)
.and_then(|s| s.settings.clone())
.unwrap_or_default()
})
Expand Down
Loading

0 comments on commit 4f227fd

Please sign in to comment.