ensure that builtin basedpyright will override the extension
This commit is contained in:
parent
573eb8e25d
commit
182e16d3b3
5 changed files with 51 additions and 140 deletions
|
@ -615,6 +615,11 @@ pub trait LspAdapter: 'static + Send + Sync {
|
|||
"Not implemented for this adapter. This method should only be called on the default JSON language server adapter"
|
||||
);
|
||||
}
|
||||
|
||||
/// True for the extension adapter and false otherwise.
|
||||
fn is_extension(&self) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
async fn try_fetch_server_binary<L: LspAdapter + 'static + Send + Sync + ?Sized>(
|
||||
|
@ -2273,6 +2278,10 @@ impl LspAdapter for FakeLspAdapter {
|
|||
let label_for_completion = self.label_for_completion.as_ref()?;
|
||||
label_for_completion(item, language)
|
||||
}
|
||||
|
||||
fn is_extension(&self) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn get_capture_indices(query: &Query, captures: &mut [(&str, &mut Option<u32>)]) {
|
||||
|
|
|
@ -370,14 +370,23 @@ impl LanguageRegistry {
|
|||
pub fn register_available_lsp_adapter(
|
||||
&self,
|
||||
name: LanguageServerName,
|
||||
load: impl Fn() -> Arc<dyn LspAdapter> + 'static + Send + Sync,
|
||||
adapter: Arc<dyn LspAdapter>,
|
||||
) {
|
||||
self.state.write().available_lsp_adapters.insert(
|
||||
let mut state = self.state.write();
|
||||
|
||||
if adapter.is_extension()
|
||||
&& let Some(existing_adapter) = state.all_lsp_adapters.get(&name)
|
||||
&& !existing_adapter.adapter.is_extension()
|
||||
{
|
||||
log::warn!(
|
||||
"not registering extension-provided language server {name:?}, since a builtin language server exists with that name",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
state.available_lsp_adapters.insert(
|
||||
name,
|
||||
Arc::new(move || {
|
||||
let lsp_adapter = load();
|
||||
CachedLspAdapter::new(lsp_adapter)
|
||||
}),
|
||||
Arc::new(move || CachedLspAdapter::new(adapter.clone())),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -392,47 +401,29 @@ impl LanguageRegistry {
|
|||
Some(load_lsp_adapter())
|
||||
}
|
||||
|
||||
pub fn register_lsp_adapter(
|
||||
&self,
|
||||
language_name: LanguageName,
|
||||
adapter: Arc<dyn LspAdapter>,
|
||||
) -> Arc<CachedLspAdapter> {
|
||||
let cached = CachedLspAdapter::new(adapter);
|
||||
pub fn register_lsp_adapter(&self, language_name: LanguageName, adapter: Arc<dyn LspAdapter>) {
|
||||
let mut state = self.state.write();
|
||||
|
||||
if adapter.is_extension()
|
||||
&& let Some(existing_adapter) = state.all_lsp_adapters.get(&adapter.name())
|
||||
&& !existing_adapter.adapter.is_extension()
|
||||
{
|
||||
log::warn!(
|
||||
"not registering extension-provided language server {:?} for language {language_name:?}, since a builtin language server exists with that name",
|
||||
adapter.name(),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
let cached = CachedLspAdapter::new(adapter);
|
||||
state
|
||||
.lsp_adapters
|
||||
.entry(language_name)
|
||||
.entry(language_name.clone())
|
||||
.or_default()
|
||||
.push(cached.clone());
|
||||
state
|
||||
.all_lsp_adapters
|
||||
.insert(cached.name.clone(), cached.clone());
|
||||
|
||||
cached
|
||||
}
|
||||
|
||||
pub fn get_or_register_lsp_adapter(
|
||||
&self,
|
||||
language_name: LanguageName,
|
||||
server_name: LanguageServerName,
|
||||
build_adapter: impl FnOnce() -> Arc<dyn LspAdapter> + 'static,
|
||||
) -> Arc<CachedLspAdapter> {
|
||||
let registered = self
|
||||
.state
|
||||
.write()
|
||||
.lsp_adapters
|
||||
.entry(language_name.clone())
|
||||
.or_default()
|
||||
.iter()
|
||||
.find(|cached_adapter| cached_adapter.name == server_name)
|
||||
.cloned();
|
||||
|
||||
if let Some(found) = registered {
|
||||
found
|
||||
} else {
|
||||
let adapter = build_adapter();
|
||||
self.register_lsp_adapter(language_name, adapter)
|
||||
}
|
||||
}
|
||||
|
||||
/// Register a fake language server and adapter
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue