Skip to content

Commit f33d02c

Browse files
authored
lsp_store: Do not associate a language server with the language for symbol highlighting (#23401)
This unblocks work on #22182; a single language server might actually be required by multiple languages (think of e.g. C/C++, Javascript/Typescript), in which case it doesn't make sense to use a single grammar. We already use primary language of a buffer for highlights and this PR makes this the only supported syntax highlighting flavour for returned symbols. Closes #ISSUE Release Notes: - N/A
1 parent e2c7934 commit f33d02c

File tree

1 file changed

+15
-39
lines changed

1 file changed

+15
-39
lines changed

crates/project/src/lsp_store.rs

Lines changed: 15 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::{
1616
use anyhow::{anyhow, Context as _, Result};
1717
use async_trait::async_trait;
1818
use client::{proto, TypedEnvelope};
19-
use collections::{btree_map, BTreeMap, HashMap, HashSet};
19+
use collections::{btree_map, BTreeMap, BTreeSet, HashMap, HashSet};
2020
use futures::{
2121
future::{join_all, Shared},
2222
select,
@@ -172,7 +172,6 @@ impl LocalLspStore {
172172
worktree_handle: &Model<Worktree>,
173173
delegate: Arc<LocalLspAdapterDelegate>,
174174
adapter: Arc<CachedLspAdapter>,
175-
language: LanguageName,
176175
cx: &mut ModelContext<LspStore>,
177176
) {
178177
let worktree = worktree_handle.read(cx);
@@ -243,7 +242,6 @@ impl LocalLspStore {
243242
let state = LanguageServerState::Starting({
244243
let server_name = adapter.name.0.clone();
245244
let delegate = delegate as Arc<dyn LspAdapterDelegate>;
246-
let language = language.clone();
247245
let key = key.clone();
248246
let adapter = adapter.clone();
249247

@@ -324,7 +322,6 @@ impl LocalLspStore {
324322
Ok(server) => {
325323
this.update(&mut cx, |this, mut cx| {
326324
this.insert_newly_running_language_server(
327-
language,
328325
adapter,
329326
server.clone(),
330327
server_id,
@@ -416,7 +413,7 @@ impl LocalLspStore {
416413
self.fs.clone(),
417414
cx,
418415
);
419-
self.start_language_server(worktree, delegate, adapter.clone(), language.clone(), cx);
416+
self.start_language_server(worktree, delegate, adapter.clone(), cx);
420417
}
421418

422419
// After starting all the language servers, reorder them to reflect the desired order
@@ -4797,20 +4794,13 @@ impl LspStore {
47974794
.into_iter()
47984795
.filter_map(|symbol| Self::deserialize_symbol(symbol).log_err())
47994796
.collect::<Vec<_>>();
4800-
populate_labels_for_symbols(
4801-
core_symbols,
4802-
&language_registry,
4803-
None,
4804-
None,
4805-
&mut symbols,
4806-
)
4807-
.await;
4797+
populate_labels_for_symbols(core_symbols, &language_registry, None, &mut symbols)
4798+
.await;
48084799
Ok(symbols)
48094800
})
48104801
} else if let Some(local) = self.as_local() {
48114802
struct WorkspaceSymbolsResult {
48124803
lsp_adapter: Arc<CachedLspAdapter>,
4813-
language: LanguageName,
48144804
worktree: WeakModel<Worktree>,
48154805
worktree_abs_path: Arc<Path>,
48164806
lsp_symbols: Vec<(String, SymbolKind, lsp::Location)>,
@@ -4831,13 +4821,10 @@ impl LspStore {
48314821
}
48324822
let worktree_abs_path = worktree.abs_path().clone();
48334823

4834-
let (lsp_adapter, language, server) = match local.language_servers.get(server_id) {
4824+
let (lsp_adapter, server) = match local.language_servers.get(server_id) {
48354825
Some(LanguageServerState::Running {
4836-
adapter,
4837-
language,
4838-
server,
4839-
..
4840-
}) => (adapter.clone(), language.clone(), server),
4826+
adapter, server, ..
4827+
}) => (adapter.clone(), server),
48414828

48424829
_ => continue,
48434830
};
@@ -4874,7 +4861,7 @@ impl LspStore {
48744861

48754862
WorkspaceSymbolsResult {
48764863
lsp_adapter,
4877-
language,
4864+
48784865
worktree: worktree_handle.downgrade(),
48794866
worktree_abs_path,
48804867
lsp_symbols,
@@ -4935,7 +4922,6 @@ impl LspStore {
49354922
populate_labels_for_symbols(
49364923
core_symbols,
49374924
&language_registry,
4938-
Some(result.language),
49394925
Some(result.lsp_adapter),
49404926
&mut symbols,
49414927
)
@@ -7467,7 +7453,6 @@ impl LspStore {
74677453

74687454
fn insert_newly_running_language_server(
74697455
&mut self,
7470-
language: LanguageName,
74717456
adapter: Arc<CachedLspAdapter>,
74727457
language_server: Arc<LanguageServer>,
74737458
server_id: LanguageServerId,
@@ -7494,7 +7479,6 @@ impl LspStore {
74947479
server_id,
74957480
LanguageServerState::Running {
74967481
adapter: adapter.clone(),
7497-
language: language.clone(),
74987482
server: language_server.clone(),
74997483
simulate_disk_based_diagnostics_completion: None,
75007484
},
@@ -8298,7 +8282,6 @@ pub enum LanguageServerState {
82988282
Starting(Task<Option<Arc<LanguageServer>>>),
82998283

83008284
Running {
8301-
language: LanguageName,
83028285
adapter: Arc<CachedLspAdapter>,
83038286
server: Arc<LanguageServer>,
83048287
simulate_disk_based_diagnostics_completion: Option<Task<()>>,
@@ -8311,10 +8294,9 @@ impl std::fmt::Debug for LanguageServerState {
83118294
LanguageServerState::Starting(_) => {
83128295
f.debug_struct("LanguageServerState::Starting").finish()
83138296
}
8314-
LanguageServerState::Running { language, .. } => f
8315-
.debug_struct("LanguageServerState::Running")
8316-
.field("language", &language)
8317-
.finish(),
8297+
LanguageServerState::Running { .. } => {
8298+
f.debug_struct("LanguageServerState::Running").finish()
8299+
}
83188300
}
83198301
}
83208302
}
@@ -8654,35 +8636,29 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate {
86548636
async fn populate_labels_for_symbols(
86558637
symbols: Vec<CoreSymbol>,
86568638
language_registry: &Arc<LanguageRegistry>,
8657-
default_language: Option<LanguageName>,
86588639
lsp_adapter: Option<Arc<CachedLspAdapter>>,
86598640
output: &mut Vec<Symbol>,
86608641
) {
86618642
#[allow(clippy::mutable_key_type)]
86628643
let mut symbols_by_language = HashMap::<Option<Arc<Language>>, Vec<CoreSymbol>>::default();
86638644

8664-
let mut unknown_path = None;
8645+
let mut unknown_paths = BTreeSet::new();
86658646
for symbol in symbols {
86668647
let language = language_registry
86678648
.language_for_file_path(&symbol.path.path)
86688649
.await
86698650
.ok()
86708651
.or_else(|| {
8671-
unknown_path.get_or_insert(symbol.path.path.clone());
8672-
default_language.as_ref().and_then(|name| {
8673-
language_registry
8674-
.language_for_name(&name.0)
8675-
.now_or_never()?
8676-
.ok()
8677-
})
8652+
unknown_paths.insert(symbol.path.path.clone());
8653+
None
86788654
});
86798655
symbols_by_language
86808656
.entry(language)
86818657
.or_default()
86828658
.push(symbol);
86838659
}
86848660

8685-
if let Some(unknown_path) = unknown_path {
8661+
for unknown_path in unknown_paths {
86868662
log::info!(
86878663
"no language found for symbol path {}",
86888664
unknown_path.display()

0 commit comments

Comments
 (0)