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
This commit is contained in:
Piotr Osiewicz 2025-01-21 13:35:15 +01:00 committed by GitHub
parent e2c7934783
commit f33d02c4c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -16,7 +16,7 @@ use crate::{
use anyhow::{anyhow, Context as _, Result}; use anyhow::{anyhow, Context as _, Result};
use async_trait::async_trait; use async_trait::async_trait;
use client::{proto, TypedEnvelope}; use client::{proto, TypedEnvelope};
use collections::{btree_map, BTreeMap, HashMap, HashSet}; use collections::{btree_map, BTreeMap, BTreeSet, HashMap, HashSet};
use futures::{ use futures::{
future::{join_all, Shared}, future::{join_all, Shared},
select, select,
@ -172,7 +172,6 @@ impl LocalLspStore {
worktree_handle: &Model<Worktree>, worktree_handle: &Model<Worktree>,
delegate: Arc<LocalLspAdapterDelegate>, delegate: Arc<LocalLspAdapterDelegate>,
adapter: Arc<CachedLspAdapter>, adapter: Arc<CachedLspAdapter>,
language: LanguageName,
cx: &mut ModelContext<LspStore>, cx: &mut ModelContext<LspStore>,
) { ) {
let worktree = worktree_handle.read(cx); let worktree = worktree_handle.read(cx);
@ -243,7 +242,6 @@ impl LocalLspStore {
let state = LanguageServerState::Starting({ let state = LanguageServerState::Starting({
let server_name = adapter.name.0.clone(); let server_name = adapter.name.0.clone();
let delegate = delegate as Arc<dyn LspAdapterDelegate>; let delegate = delegate as Arc<dyn LspAdapterDelegate>;
let language = language.clone();
let key = key.clone(); let key = key.clone();
let adapter = adapter.clone(); let adapter = adapter.clone();
@ -324,7 +322,6 @@ impl LocalLspStore {
Ok(server) => { Ok(server) => {
this.update(&mut cx, |this, mut cx| { this.update(&mut cx, |this, mut cx| {
this.insert_newly_running_language_server( this.insert_newly_running_language_server(
language,
adapter, adapter,
server.clone(), server.clone(),
server_id, server_id,
@ -416,7 +413,7 @@ impl LocalLspStore {
self.fs.clone(), self.fs.clone(),
cx, cx,
); );
self.start_language_server(worktree, delegate, adapter.clone(), language.clone(), cx); self.start_language_server(worktree, delegate, adapter.clone(), cx);
} }
// After starting all the language servers, reorder them to reflect the desired order // After starting all the language servers, reorder them to reflect the desired order
@ -4797,20 +4794,13 @@ impl LspStore {
.into_iter() .into_iter()
.filter_map(|symbol| Self::deserialize_symbol(symbol).log_err()) .filter_map(|symbol| Self::deserialize_symbol(symbol).log_err())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
populate_labels_for_symbols( populate_labels_for_symbols(core_symbols, &language_registry, None, &mut symbols)
core_symbols, .await;
&language_registry,
None,
None,
&mut symbols,
)
.await;
Ok(symbols) Ok(symbols)
}) })
} else if let Some(local) = self.as_local() { } else if let Some(local) = self.as_local() {
struct WorkspaceSymbolsResult { struct WorkspaceSymbolsResult {
lsp_adapter: Arc<CachedLspAdapter>, lsp_adapter: Arc<CachedLspAdapter>,
language: LanguageName,
worktree: WeakModel<Worktree>, worktree: WeakModel<Worktree>,
worktree_abs_path: Arc<Path>, worktree_abs_path: Arc<Path>,
lsp_symbols: Vec<(String, SymbolKind, lsp::Location)>, lsp_symbols: Vec<(String, SymbolKind, lsp::Location)>,
@ -4831,13 +4821,10 @@ impl LspStore {
} }
let worktree_abs_path = worktree.abs_path().clone(); let worktree_abs_path = worktree.abs_path().clone();
let (lsp_adapter, language, server) = match local.language_servers.get(server_id) { let (lsp_adapter, server) = match local.language_servers.get(server_id) {
Some(LanguageServerState::Running { Some(LanguageServerState::Running {
adapter, adapter, server, ..
language, }) => (adapter.clone(), server),
server,
..
}) => (adapter.clone(), language.clone(), server),
_ => continue, _ => continue,
}; };
@ -4874,7 +4861,7 @@ impl LspStore {
WorkspaceSymbolsResult { WorkspaceSymbolsResult {
lsp_adapter, lsp_adapter,
language,
worktree: worktree_handle.downgrade(), worktree: worktree_handle.downgrade(),
worktree_abs_path, worktree_abs_path,
lsp_symbols, lsp_symbols,
@ -4935,7 +4922,6 @@ impl LspStore {
populate_labels_for_symbols( populate_labels_for_symbols(
core_symbols, core_symbols,
&language_registry, &language_registry,
Some(result.language),
Some(result.lsp_adapter), Some(result.lsp_adapter),
&mut symbols, &mut symbols,
) )
@ -7467,7 +7453,6 @@ impl LspStore {
fn insert_newly_running_language_server( fn insert_newly_running_language_server(
&mut self, &mut self,
language: LanguageName,
adapter: Arc<CachedLspAdapter>, adapter: Arc<CachedLspAdapter>,
language_server: Arc<LanguageServer>, language_server: Arc<LanguageServer>,
server_id: LanguageServerId, server_id: LanguageServerId,
@ -7494,7 +7479,6 @@ impl LspStore {
server_id, server_id,
LanguageServerState::Running { LanguageServerState::Running {
adapter: adapter.clone(), adapter: adapter.clone(),
language: language.clone(),
server: language_server.clone(), server: language_server.clone(),
simulate_disk_based_diagnostics_completion: None, simulate_disk_based_diagnostics_completion: None,
}, },
@ -8298,7 +8282,6 @@ pub enum LanguageServerState {
Starting(Task<Option<Arc<LanguageServer>>>), Starting(Task<Option<Arc<LanguageServer>>>),
Running { Running {
language: LanguageName,
adapter: Arc<CachedLspAdapter>, adapter: Arc<CachedLspAdapter>,
server: Arc<LanguageServer>, server: Arc<LanguageServer>,
simulate_disk_based_diagnostics_completion: Option<Task<()>>, simulate_disk_based_diagnostics_completion: Option<Task<()>>,
@ -8311,10 +8294,9 @@ impl std::fmt::Debug for LanguageServerState {
LanguageServerState::Starting(_) => { LanguageServerState::Starting(_) => {
f.debug_struct("LanguageServerState::Starting").finish() f.debug_struct("LanguageServerState::Starting").finish()
} }
LanguageServerState::Running { language, .. } => f LanguageServerState::Running { .. } => {
.debug_struct("LanguageServerState::Running") f.debug_struct("LanguageServerState::Running").finish()
.field("language", &language) }
.finish(),
} }
} }
} }
@ -8654,27 +8636,21 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate {
async fn populate_labels_for_symbols( async fn populate_labels_for_symbols(
symbols: Vec<CoreSymbol>, symbols: Vec<CoreSymbol>,
language_registry: &Arc<LanguageRegistry>, language_registry: &Arc<LanguageRegistry>,
default_language: Option<LanguageName>,
lsp_adapter: Option<Arc<CachedLspAdapter>>, lsp_adapter: Option<Arc<CachedLspAdapter>>,
output: &mut Vec<Symbol>, output: &mut Vec<Symbol>,
) { ) {
#[allow(clippy::mutable_key_type)] #[allow(clippy::mutable_key_type)]
let mut symbols_by_language = HashMap::<Option<Arc<Language>>, Vec<CoreSymbol>>::default(); let mut symbols_by_language = HashMap::<Option<Arc<Language>>, Vec<CoreSymbol>>::default();
let mut unknown_path = None; let mut unknown_paths = BTreeSet::new();
for symbol in symbols { for symbol in symbols {
let language = language_registry let language = language_registry
.language_for_file_path(&symbol.path.path) .language_for_file_path(&symbol.path.path)
.await .await
.ok() .ok()
.or_else(|| { .or_else(|| {
unknown_path.get_or_insert(symbol.path.path.clone()); unknown_paths.insert(symbol.path.path.clone());
default_language.as_ref().and_then(|name| { None
language_registry
.language_for_name(&name.0)
.now_or_never()?
.ok()
})
}); });
symbols_by_language symbols_by_language
.entry(language) .entry(language)
@ -8682,7 +8658,7 @@ async fn populate_labels_for_symbols(
.push(symbol); .push(symbol);
} }
if let Some(unknown_path) = unknown_path { for unknown_path in unknown_paths {
log::info!( log::info!(
"no language found for symbol path {}", "no language found for symbol path {}",
unknown_path.display() unknown_path.display()