Skip to content

Commit 4f227fd

Browse files
authored
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
1 parent 743feb9 commit 4f227fd

File tree

20 files changed

+150
-85
lines changed

20 files changed

+150
-85
lines changed

crates/activity_indicator/src/activity_indicator.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use workspace::{item::ItemHandle, StatusItemView, Workspace};
1919
actions!(activity_indicator, [ShowErrorMessage]);
2020

2121
pub enum Event {
22-
ShowError { lsp_name: Arc<str>, error: String },
22+
ShowError {
23+
lsp_name: LanguageServerName,
24+
error: String,
25+
},
2326
}
2427

2528
pub struct ActivityIndicator {
@@ -123,7 +126,7 @@ impl ActivityIndicator {
123126
self.statuses.retain(|status| {
124127
if let LanguageServerBinaryStatus::Failed { error } = &status.status {
125128
cx.emit(Event::ShowError {
126-
lsp_name: status.name.0.clone(),
129+
lsp_name: status.name.clone(),
127130
error: error.clone(),
128131
});
129132
false

crates/collab/src/tests/remote_editing_collaboration_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ async fn test_sharing_an_ssh_remote_project(
102102
all_language_settings(file, cx)
103103
.language(Some(&("Rust".into())))
104104
.language_servers,
105-
["override-rust-analyzer".into()]
105+
["override-rust-analyzer".to_string()]
106106
)
107107
});
108108

crates/extension/src/wasm_host/wit/since_v0_1_0.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ use futures::{io::BufReader, FutureExt as _};
99
use futures::{lock::Mutex, AsyncReadExt};
1010
use indexed_docs::IndexedDocsDatabase;
1111
use isahc::config::{Configurable, RedirectPolicy};
12-
use language::LanguageName;
1312
use language::{
1413
language_settings::AllLanguageSettings, LanguageServerBinaryStatus, LspAdapterDelegate,
1514
};
15+
use language::{LanguageName, LanguageServerName};
1616
use project::project_settings::ProjectSettings;
1717
use semantic_version::SemanticVersion;
1818
use std::{
@@ -366,7 +366,7 @@ impl ExtensionImports for WasmState {
366366
.and_then(|key| {
367367
ProjectSettings::get(location, cx)
368368
.lsp
369-
.get(&Arc::<str>::from(key))
369+
.get(&LanguageServerName(key.into()))
370370
})
371371
.cloned()
372372
.unwrap_or_default();

crates/extension/src/wasm_host/wit/since_v0_2_0.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ use futures::{io::BufReader, FutureExt as _};
99
use futures::{lock::Mutex, AsyncReadExt};
1010
use indexed_docs::IndexedDocsDatabase;
1111
use isahc::config::{Configurable, RedirectPolicy};
12-
use language::LanguageName;
1312
use language::{
1413
language_settings::AllLanguageSettings, LanguageServerBinaryStatus, LspAdapterDelegate,
1514
};
15+
use language::{LanguageName, LanguageServerName};
1616
use project::project_settings::ProjectSettings;
1717
use semantic_version::SemanticVersion;
1818
use std::{
@@ -412,7 +412,7 @@ impl ExtensionImports for WasmState {
412412
.and_then(|key| {
413413
ProjectSettings::get(location, cx)
414414
.lsp
415-
.get(&Arc::<str>::from(key))
415+
.get(&LanguageServerName::from_proto(key))
416416
})
417417
.cloned()
418418
.unwrap_or_default();

crates/gpui/src/shared_string.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ use util::arc_cow::ArcCow;
99
#[derive(Deref, DerefMut, Eq, PartialEq, PartialOrd, Ord, Hash, Clone)]
1010
pub struct SharedString(ArcCow<'static, str>);
1111

12+
impl SharedString {
13+
/// creates a static SharedString
14+
pub const fn new_static(s: &'static str) -> Self {
15+
Self(ArcCow::Borrowed(s))
16+
}
17+
}
18+
1219
impl Default for SharedString {
1320
fn default() -> Self {
1421
Self(ArcCow::Owned(Arc::default()))

crates/language/src/language.rs

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,52 @@ pub trait ToLspPosition {
139139

140140
/// A name of a language server.
141141
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]
142-
pub struct LanguageServerName(pub Arc<str>);
142+
pub struct LanguageServerName(pub SharedString);
143143

144+
impl std::fmt::Display for LanguageServerName {
145+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
146+
std::fmt::Display::fmt(&self.0, f)
147+
}
148+
}
149+
150+
impl AsRef<str> for LanguageServerName {
151+
fn as_ref(&self) -> &str {
152+
self.0.as_ref()
153+
}
154+
}
155+
156+
impl AsRef<OsStr> for LanguageServerName {
157+
fn as_ref(&self) -> &OsStr {
158+
self.0.as_ref().as_ref()
159+
}
160+
}
161+
162+
impl JsonSchema for LanguageServerName {
163+
fn schema_name() -> String {
164+
"LanguageServerName".into()
165+
}
166+
167+
fn json_schema(_: &mut SchemaGenerator) -> Schema {
168+
SchemaObject {
169+
instance_type: Some(InstanceType::String.into()),
170+
..Default::default()
171+
}
172+
.into()
173+
}
174+
}
144175
impl LanguageServerName {
176+
pub const fn new_static(s: &'static str) -> Self {
177+
Self(SharedString::new_static(s))
178+
}
179+
145180
pub fn from_proto(s: String) -> Self {
146-
Self(Arc::from(s))
181+
Self(s.into())
182+
}
183+
}
184+
185+
impl<'a> From<&'a str> for LanguageServerName {
186+
fn from(str: &'a str) -> LanguageServerName {
187+
LanguageServerName(str.to_string().into())
147188
}
148189
}
149190

@@ -202,8 +243,8 @@ impl CachedLspAdapter {
202243
})
203244
}
204245

205-
pub fn name(&self) -> Arc<str> {
206-
self.adapter.name().0.clone()
246+
pub fn name(&self) -> LanguageServerName {
247+
self.adapter.name().clone()
207248
}
208249

209250
pub async fn get_language_server_command(
@@ -594,7 +635,7 @@ pub struct LanguageConfig {
594635
pub block_comment: Option<(Arc<str>, Arc<str>)>,
595636
/// A list of language servers that are allowed to run on subranges of a given language.
596637
#[serde(default)]
597-
pub scope_opt_in_language_servers: Vec<String>,
638+
pub scope_opt_in_language_servers: Vec<LanguageServerName>,
598639
#[serde(default)]
599640
pub overrides: HashMap<String, LanguageConfigOverride>,
600641
/// A list of characters that Zed should treat as word characters for the
@@ -658,7 +699,7 @@ pub struct LanguageConfigOverride {
658699
#[serde(default)]
659700
pub word_characters: Override<HashSet<char>>,
660701
#[serde(default)]
661-
pub opt_into_language_servers: Vec<String>,
702+
pub opt_into_language_servers: Vec<LanguageServerName>,
662703
}
663704

664705
#[derive(Clone, Deserialize, Debug, Serialize, JsonSchema)]
@@ -1479,9 +1520,9 @@ impl LanguageScope {
14791520
pub fn language_allowed(&self, name: &LanguageServerName) -> bool {
14801521
let config = &self.language.config;
14811522
let opt_in_servers = &config.scope_opt_in_language_servers;
1482-
if opt_in_servers.iter().any(|o| *o == *name.0) {
1523+
if opt_in_servers.iter().any(|o| *o == *name) {
14831524
if let Some(over) = self.config_override() {
1484-
over.opt_into_language_servers.iter().any(|o| *o == *name.0)
1525+
over.opt_into_language_servers.iter().any(|o| *o == *name)
14851526
} else {
14861527
false
14871528
}

crates/language/src/language_settings.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub struct LanguageSettings {
9999
/// special tokens:
100100
/// - `"!<language_server_id>"` - A language server ID prefixed with a `!` will be disabled.
101101
/// - `"..."` - A placeholder to refer to the **rest** of the registered language servers for this language.
102-
pub language_servers: Vec<Arc<str>>,
102+
pub language_servers: Vec<String>,
103103
/// Controls whether inline completions are shown immediately (true)
104104
/// or manually by triggering `editor::ShowInlineCompletion` (false).
105105
pub show_inline_completions: bool,
@@ -137,33 +137,35 @@ impl LanguageSettings {
137137
}
138138

139139
pub(crate) fn resolve_language_servers(
140-
configured_language_servers: &[Arc<str>],
140+
configured_language_servers: &[String],
141141
available_language_servers: &[LanguageServerName],
142142
) -> Vec<LanguageServerName> {
143-
let (disabled_language_servers, enabled_language_servers): (Vec<Arc<str>>, Vec<Arc<str>>) =
144-
configured_language_servers.iter().partition_map(
145-
|language_server| match language_server.strip_prefix('!') {
146-
Some(disabled) => Either::Left(disabled.into()),
147-
None => Either::Right(language_server.clone()),
148-
},
149-
);
143+
let (disabled_language_servers, enabled_language_servers): (
144+
Vec<LanguageServerName>,
145+
Vec<LanguageServerName>,
146+
) = configured_language_servers.iter().partition_map(
147+
|language_server| match language_server.strip_prefix('!') {
148+
Some(disabled) => Either::Left(LanguageServerName(disabled.to_string().into())),
149+
None => Either::Right(LanguageServerName(language_server.clone().into())),
150+
},
151+
);
150152

151153
let rest = available_language_servers
152154
.iter()
153155
.filter(|&available_language_server| {
154-
!disabled_language_servers.contains(&available_language_server.0)
155-
&& !enabled_language_servers.contains(&available_language_server.0)
156+
!disabled_language_servers.contains(&available_language_server)
157+
&& !enabled_language_servers.contains(&available_language_server)
156158
})
157159
.cloned()
158160
.collect::<Vec<_>>();
159161

160162
enabled_language_servers
161163
.into_iter()
162164
.flat_map(|language_server| {
163-
if language_server.as_ref() == Self::REST_OF_LANGUAGE_SERVERS {
165+
if language_server.0.as_ref() == Self::REST_OF_LANGUAGE_SERVERS {
164166
rest.clone()
165167
} else {
166-
vec![LanguageServerName(language_server.clone())]
168+
vec![language_server.clone()]
167169
}
168170
})
169171
.collect::<Vec<_>>()
@@ -295,7 +297,7 @@ pub struct LanguageSettingsContent {
295297
///
296298
/// Default: ["..."]
297299
#[serde(default)]
298-
pub language_servers: Option<Vec<Arc<str>>>,
300+
pub language_servers: Option<Vec<String>>,
299301
/// Controls whether inline completions are shown immediately (true)
300302
/// or manually by triggering `editor::ShowInlineCompletion` (false).
301303
///
@@ -1165,7 +1167,7 @@ mod tests {
11651167
names
11661168
.iter()
11671169
.copied()
1168-
.map(|name| LanguageServerName(name.into()))
1170+
.map(|name| LanguageServerName(name.to_string().into()))
11691171
.collect::<Vec<_>>()
11701172
}
11711173

crates/language_tools/src/lsp_log.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ impl LogStore {
236236
));
237237
this.add_language_server(
238238
LanguageServerKind::Global {
239-
name: LanguageServerName(Arc::from("copilot")),
239+
name: LanguageServerName::new_static("copilot"),
240240
},
241241
server.server_id(),
242242
Some(server.clone()),

crates/languages/src/c.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ use util::{fs::remove_matching, maybe, ResultExt};
1313
pub struct CLspAdapter;
1414

1515
impl CLspAdapter {
16-
const SERVER_NAME: &'static str = "clangd";
16+
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("clangd");
1717
}
1818

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

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

3435
match configured_binary {

crates/languages/src/go.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn server_binary_arguments() -> Vec<OsString> {
3333
pub struct GoLspAdapter;
3434

3535
impl GoLspAdapter {
36-
const SERVER_NAME: &'static str = "gopls";
36+
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("gopls");
3737
}
3838

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

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

7778
match configured_binary {

0 commit comments

Comments
 (0)