Skip to content

Commit c1907c9

Browse files
json_schema_store: Include available LSP adapters in settings schema (zed-industries#46766)
Closes zed-industries#46556 ## Summary - Fix "Property `ty` is not allowed" warning in `settings.json` for LSP adapters registered via `register_available_lsp_adapter()` - Add `available_lsp_adapter_names()` method to include these adapters in schema generation - Support `initialization_options` schema lookup for available adapters ## Problem LSP adapters registered via `register_available_lsp_adapter()` were not included in the settings JSON schema. This caused validation warnings like: Property ty is not allowed Even though `ty` is a built-in Python language server that works correctly. **Affected adapters:** - `ty`, `py`, `python-lsp-server` - `eslint`, `vtsls`, `typescript-language-server` - `tailwindcss-language-server`, `tailwindcss-intellisense-css` ## Solution Schema generation now queries both: 1. `all_lsp_adapters()` - adapters bound to specific languages 2. `available_lsp_adapter_names()` - adapters enabled via settings (new) Related: zed-industries#43104, zed-industries#45928 Release Notes: - Fixed an issue where not all LSP adapters would be suggested for completion, or recognized as valid in `settings.json` --------- Co-authored-by: Ben Kunkle <ben@zed.dev>
1 parent 839dac1 commit c1907c9

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

‎crates/json_schema_store/src/json_schema_store.rs‎

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use std::sync::{Arc, LazyLock};
33
use anyhow::{Context as _, Result};
44
use collections::HashMap;
55
use gpui::{App, AsyncApp, BorrowAppContext as _, Entity, Task, WeakEntity};
6-
use language::{LanguageRegistry, LspAdapterDelegate, language_settings::AllLanguageSettings};
6+
use language::{
7+
LanguageRegistry, LanguageServerName, LspAdapterDelegate,
8+
language_settings::AllLanguageSettings,
9+
};
710
use parking_lot::RwLock;
811
use project::{LspStore, lsp_store::LocalLspAdapterDelegate};
912
use settings::{LSP_SETTINGS_SCHEMA_URL_PREFIX, Settings as _, SettingsLocation};
@@ -244,6 +247,9 @@ async fn resolve_dynamic_schema(
244247
.all_lsp_adapters()
245248
.into_iter()
246249
.find(|adapter| adapter.name().as_ref() as &str == lsp_name)
250+
.or_else(|| {
251+
languages.load_available_lsp_adapter(&LanguageServerName::from(lsp_name))
252+
})
247253
.with_context(|| format!("LSP adapter not found: {}", lsp_name))?;
248254

249255
let delegate: Arc<dyn LspAdapterDelegate> = cx
@@ -281,11 +287,26 @@ async fn resolve_dynamic_schema(
281287
})
282288
}
283289
"settings" => {
284-
let lsp_adapter_names = languages
290+
let mut lsp_adapter_names: Vec<String> = languages
285291
.all_lsp_adapters()
286292
.into_iter()
287-
.map(|adapter| adapter.name().to_string())
288-
.collect::<Vec<_>>();
293+
.map(|adapter| adapter.name())
294+
.chain(languages.available_lsp_adapter_names().into_iter())
295+
.map(|name| name.to_string())
296+
.collect();
297+
298+
let mut i = 0;
299+
while i < lsp_adapter_names.len() {
300+
let mut j = i + 1;
301+
while j < lsp_adapter_names.len() {
302+
if lsp_adapter_names[i] == lsp_adapter_names[j] {
303+
lsp_adapter_names.swap_remove(j);
304+
} else {
305+
j += 1;
306+
}
307+
}
308+
i += 1;
309+
}
289310

290311
cx.update(|cx| {
291312
let font_names = &cx.text_system().all_font_names();

‎crates/language/src/language_registry.rs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,17 @@ impl LanguageRegistry {
414414
state.available_lsp_adapters.contains_key(name)
415415
}
416416

417+
/// Returns the names of all available LSP adapters (registered via `register_available_lsp_adapter`).
418+
/// These are adapters that are not bound to a specific language but can be enabled via settings.
419+
pub fn available_lsp_adapter_names(&self) -> Vec<LanguageServerName> {
420+
self.state
421+
.read()
422+
.available_lsp_adapters
423+
.keys()
424+
.cloned()
425+
.collect()
426+
}
427+
417428
pub fn register_lsp_adapter(&self, language_name: LanguageName, adapter: Arc<dyn LspAdapter>) {
418429
let mut state = self.state.write();
419430

0 commit comments

Comments
 (0)