Correctly merge settings for vtsls (#17657)

Conrad Irwin created

Release Notes:

- Fixed vtsls initialization_options in project settings files

Change summary

crates/languages/src/vtsls.rs | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)

Detailed changes

crates/languages/src/vtsls.rs 🔗

@@ -7,14 +7,14 @@ use lsp::{CodeActionKind, LanguageServerBinary};
 use node_runtime::NodeRuntime;
 use project::project_settings::{BinarySettings, ProjectSettings};
 use serde_json::{json, Value};
-use settings::Settings;
+use settings::{Settings, SettingsLocation};
 use std::{
     any::Any,
     ffi::OsString,
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::{maybe, ResultExt};
+use util::{maybe, merge_json_value_into, ResultExt};
 
 fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
     vec![server_path.into(), "--stdio".into()]
@@ -274,17 +274,29 @@ impl LspAdapter for VtslsLspAdapter {
         cx: &mut AsyncAppContext,
     ) -> Result<Value> {
         let override_options = cx.update(|cx| {
-            ProjectSettings::get_global(cx)
-                .lsp
-                .get(SERVER_NAME)
-                .and_then(|s| s.initialization_options.clone())
+            ProjectSettings::get(
+                Some(SettingsLocation {
+                    worktree_id: adapter.worktree_id(),
+                    path: adapter.worktree_root_path(),
+                }),
+                cx,
+            )
+            .lsp
+            .get(SERVER_NAME)
+            .and_then(|s| s.initialization_options.clone())
         })?;
         if let Some(options) = override_options {
             return Ok(options);
         }
-        self.initialization_options(adapter)
+        let mut initialization_options = self
+            .initialization_options(adapter)
             .await
-            .map(|o| o.unwrap())
+            .map(|o| o.unwrap())?;
+
+        if let Some(override_options) = override_options {
+            merge_json_value_into(override_options, &mut initialization_options)
+        }
+        Ok(initialization_options)
     }
 
     fn language_ids(&self) -> HashMap<String, String> {