diff --git a/crates/settings_content/src/language.rs b/crates/settings_content/src/language.rs index 71beec78f7..9c1c8f34f8 100644 --- a/crates/settings_content/src/language.rs +++ b/crates/settings_content/src/language.rs @@ -67,6 +67,12 @@ impl merge_from::MergeFrom for AllLanguageSettingsContent { language_settings.merge_from(&other.defaults); if let Some(mut language_server_overrides) = language_server_overrides { if let Some(disabled) = &globally_disabled_servers { + for disabled_server in disabled { + if let Some(enabled_server) = disabled_server.strip_prefix('!') { + language_server_overrides.retain(|entry| entry != enabled_server); + } + } + let insert_before = language_server_overrides .iter() .position(|entry| entry == REST_OF_LANGUAGE_SERVERS) @@ -1327,6 +1333,55 @@ mod test { ); } + #[test] + fn test_global_language_server_disable_overrides_per_language_enable() { + let mut base = AllLanguageSettingsContent { + defaults: LanguageSettingsContent { + language_servers: Some(vec![REST_OF_LANGUAGE_SERVERS.into()]), + ..LanguageSettingsContent::default() + }, + languages: LanguageToSettingsMap( + [( + "TypeScript".into(), + LanguageSettingsContent { + language_servers: Some(vec![ + "!typescript-language-server".into(), + "vtsls".into(), + REST_OF_LANGUAGE_SERVERS.into(), + ]), + ..LanguageSettingsContent::default() + }, + )] + .into_iter() + .collect(), + ), + ..AllLanguageSettingsContent::default() + }; + + let user = AllLanguageSettingsContent { + defaults: LanguageSettingsContent { + language_servers: Some(vec!["!vtsls".into(), REST_OF_LANGUAGE_SERVERS.into()]), + ..LanguageSettingsContent::default() + }, + ..AllLanguageSettingsContent::default() + }; + + base.merge_from(&user); + + let expected = vec![ + "!typescript-language-server".to_string(), + "!vtsls".to_string(), + REST_OF_LANGUAGE_SERVERS.to_string(), + ]; + assert_eq!( + base.languages + .0 + .get("TypeScript") + .and_then(|settings| settings.language_servers.as_deref()), + Some(expected.as_slice()), + ); + } + #[test] fn test_language_servers_merge_no_per_language_config_uses_global() { let mut base = AllLanguageSettingsContent {