Allow overrides for json-language-server settings (#20748)
Closes #20739 The JSON LSP adapter now merges user settings with cached settings, and util::merge_json_value_into pushes array contents from source to target.
This commit is contained in:
parent
96854c68ea
commit
c28f5b11f8
2 changed files with 22 additions and 5 deletions
|
@ -9,7 +9,7 @@ use http_client::github::{latest_github_release, GitHubLspBinaryVersion};
|
||||||
use language::{LanguageRegistry, LanguageToolchainStore, LspAdapter, LspAdapterDelegate};
|
use language::{LanguageRegistry, LanguageToolchainStore, LspAdapter, LspAdapterDelegate};
|
||||||
use lsp::{LanguageServerBinary, LanguageServerName};
|
use lsp::{LanguageServerBinary, LanguageServerName};
|
||||||
use node_runtime::NodeRuntime;
|
use node_runtime::NodeRuntime;
|
||||||
use project::ContextProviderWithTasks;
|
use project::{lsp_store::language_server_settings, ContextProviderWithTasks};
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
use settings::{KeymapFile, SettingsJsonSchemaParams, SettingsStore};
|
use settings::{KeymapFile, SettingsJsonSchemaParams, SettingsStore};
|
||||||
use smol::{
|
use smol::{
|
||||||
|
@ -25,7 +25,7 @@ use std::{
|
||||||
sync::{Arc, OnceLock},
|
sync::{Arc, OnceLock},
|
||||||
};
|
};
|
||||||
use task::{TaskTemplate, TaskTemplates, VariableName};
|
use task::{TaskTemplate, TaskTemplates, VariableName};
|
||||||
use util::{fs::remove_matching, maybe, ResultExt};
|
use util::{fs::remove_matching, maybe, merge_json_value_into, ResultExt};
|
||||||
|
|
||||||
const SERVER_PATH: &str =
|
const SERVER_PATH: &str =
|
||||||
"node_modules/vscode-langservers-extracted/bin/vscode-json-language-server";
|
"node_modules/vscode-langservers-extracted/bin/vscode-json-language-server";
|
||||||
|
@ -194,15 +194,26 @@ impl LspAdapter for JsonLspAdapter {
|
||||||
|
|
||||||
async fn workspace_configuration(
|
async fn workspace_configuration(
|
||||||
self: Arc<Self>,
|
self: Arc<Self>,
|
||||||
_: &Arc<dyn LspAdapterDelegate>,
|
delegate: &Arc<dyn LspAdapterDelegate>,
|
||||||
_: Arc<dyn LanguageToolchainStore>,
|
_: Arc<dyn LanguageToolchainStore>,
|
||||||
cx: &mut AsyncAppContext,
|
cx: &mut AsyncAppContext,
|
||||||
) -> Result<Value> {
|
) -> Result<Value> {
|
||||||
cx.update(|cx| {
|
let mut config = cx.update(|cx| {
|
||||||
self.workspace_config
|
self.workspace_config
|
||||||
.get_or_init(|| Self::get_workspace_config(self.languages.language_names(), cx))
|
.get_or_init(|| Self::get_workspace_config(self.languages.language_names(), cx))
|
||||||
.clone()
|
.clone()
|
||||||
})
|
})?;
|
||||||
|
|
||||||
|
let project_options = cx.update(|cx| {
|
||||||
|
language_server_settings(delegate.as_ref(), &self.name(), cx)
|
||||||
|
.and_then(|s| s.settings.clone())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if let Some(override_options) = project_options {
|
||||||
|
merge_json_value_into(override_options, &mut config);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn language_ids(&self) -> HashMap<String, String> {
|
fn language_ids(&self) -> HashMap<String, String> {
|
||||||
|
|
|
@ -149,6 +149,12 @@ pub fn merge_json_value_into(source: serde_json::Value, target: &mut serde_json:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(Value::Array(source), Value::Array(target)) => {
|
||||||
|
for value in source {
|
||||||
|
target.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
(source, target) => *target = source,
|
(source, target) => *target = source,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue