lsp: Identify language servers by their configuration (#35270)
- **WIP: reorganize dispositions** - **Introduce a LocalToolchainStore trait and use it for LspAdapter methods** Closes #35782 Closes #27331 Release Notes: - Python: Improved propagation of a selected virtual environment into the LSP configuration. This should the make all language-related features such as Go to definition or Find all references more reliable. --------- Co-authored-by: Cole Miller <cole@zed.dev> Co-authored-by: Lukas Wirth <lukas@zed.dev>
This commit is contained in:
parent
42ffa8900a
commit
b8a106632f
32 changed files with 1037 additions and 1085 deletions
|
@ -1,6 +1,6 @@
|
|||
use crate::{
|
||||
CachedLspAdapter, File, Language, LanguageConfig, LanguageId, LanguageMatcher,
|
||||
LanguageServerName, LspAdapter, PLAIN_TEXT, ToolchainLister,
|
||||
LanguageServerName, LspAdapter, ManifestName, PLAIN_TEXT, ToolchainLister,
|
||||
language_settings::{
|
||||
AllLanguageSettingsContent, LanguageSettingsContent, all_language_settings,
|
||||
},
|
||||
|
@ -172,6 +172,7 @@ pub struct AvailableLanguage {
|
|||
hidden: bool,
|
||||
load: Arc<dyn Fn() -> Result<LoadedLanguage> + 'static + Send + Sync>,
|
||||
loaded: bool,
|
||||
manifest_name: Option<ManifestName>,
|
||||
}
|
||||
|
||||
impl AvailableLanguage {
|
||||
|
@ -259,6 +260,7 @@ pub struct LoadedLanguage {
|
|||
pub queries: LanguageQueries,
|
||||
pub context_provider: Option<Arc<dyn ContextProvider>>,
|
||||
pub toolchain_provider: Option<Arc<dyn ToolchainLister>>,
|
||||
pub manifest_name: Option<ManifestName>,
|
||||
}
|
||||
|
||||
impl LanguageRegistry {
|
||||
|
@ -349,12 +351,14 @@ impl LanguageRegistry {
|
|||
config.grammar.clone(),
|
||||
config.matcher.clone(),
|
||||
config.hidden,
|
||||
None,
|
||||
Arc::new(move || {
|
||||
Ok(LoadedLanguage {
|
||||
config: config.clone(),
|
||||
queries: Default::default(),
|
||||
toolchain_provider: None,
|
||||
context_provider: None,
|
||||
manifest_name: None,
|
||||
})
|
||||
}),
|
||||
)
|
||||
|
@ -487,6 +491,7 @@ impl LanguageRegistry {
|
|||
grammar_name: Option<Arc<str>>,
|
||||
matcher: LanguageMatcher,
|
||||
hidden: bool,
|
||||
manifest_name: Option<ManifestName>,
|
||||
load: Arc<dyn Fn() -> Result<LoadedLanguage> + 'static + Send + Sync>,
|
||||
) {
|
||||
let state = &mut *self.state.write();
|
||||
|
@ -496,6 +501,7 @@ impl LanguageRegistry {
|
|||
existing_language.grammar = grammar_name;
|
||||
existing_language.matcher = matcher;
|
||||
existing_language.load = load;
|
||||
existing_language.manifest_name = manifest_name;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -508,6 +514,7 @@ impl LanguageRegistry {
|
|||
load,
|
||||
hidden,
|
||||
loaded: false,
|
||||
manifest_name,
|
||||
});
|
||||
state.version += 1;
|
||||
state.reload_count += 1;
|
||||
|
@ -575,6 +582,7 @@ impl LanguageRegistry {
|
|||
grammar: language.config.grammar.clone(),
|
||||
matcher: language.config.matcher.clone(),
|
||||
hidden: language.config.hidden,
|
||||
manifest_name: None,
|
||||
load: Arc::new(|| Err(anyhow!("already loaded"))),
|
||||
loaded: true,
|
||||
});
|
||||
|
@ -914,10 +922,12 @@ impl LanguageRegistry {
|
|||
Language::new_with_id(id, loaded_language.config, grammar)
|
||||
.with_context_provider(loaded_language.context_provider)
|
||||
.with_toolchain_lister(loaded_language.toolchain_provider)
|
||||
.with_manifest(loaded_language.manifest_name)
|
||||
.with_queries(loaded_language.queries)
|
||||
} else {
|
||||
Ok(Language::new_with_id(id, loaded_language.config, None)
|
||||
.with_context_provider(loaded_language.context_provider)
|
||||
.with_manifest(loaded_language.manifest_name)
|
||||
.with_toolchain_lister(loaded_language.toolchain_provider))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue