diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index 1c796ad5c3..0988b2d6d9 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -848,6 +848,9 @@ pub fn parse_json_with_comments(content: &str) -> Result } fn write_settings_key(settings_content: &mut String, key_path: &[&str], new_value: &Value) { + const LANGUAGE_OVERRIDES: &'static str = "language_overrides"; + const LANGAUGES: &'static str = "languages"; + let mut parser = tree_sitter::Parser::new(); parser.set_language(tree_sitter_json::language()).unwrap(); let tree = parser.parse(&settings_content, None).unwrap(); @@ -864,6 +867,8 @@ fn write_settings_key(settings_content: &mut String, key_path: &[&str], new_valu ) .unwrap(); + let has_language_overrides = settings_content.contains(LANGUAGE_OVERRIDES); + let mut depth = 0; let mut last_value_range = 0..0; let mut first_key_start = None; @@ -893,7 +898,13 @@ fn write_settings_key(settings_content: &mut String, key_path: &[&str], new_valu let found_key = settings_content .get(key_range.clone()) - .map(|key_text| key_text == format!("\"{}\"", key_path[depth])) + .map(|key_text| { + if key_path[depth] == LANGAUGES && has_language_overrides { + return key_text == format!("\"{}\"", LANGUAGE_OVERRIDES); + } else { + return key_text == format!("\"{}\"", key_path[depth]); + } + }) .unwrap_or(false); if found_key { @@ -917,12 +928,20 @@ fn write_settings_key(settings_content: &mut String, key_path: &[&str], new_valu settings_content.replace_range(existing_value_range, &new_val); } else { // We have key paths, construct the sub objects - let new_key = key_path[depth]; + let new_key = if has_language_overrides && key_path[depth] == LANGAUGES { + LANGUAGE_OVERRIDES + } else { + key_path[depth] + }; // We don't have the key, construct the nested objects let mut new_value = serde_json::to_value(new_value).unwrap(); for key in key_path[(depth + 1)..].iter().rev() { - new_value = serde_json::json!({ key.to_string(): new_value }); + if has_language_overrides && key == &LANGAUGES { + new_value = serde_json::json!({ LANGUAGE_OVERRIDES.to_string(): new_value }); + } else { + new_value = serde_json::json!({ key.to_string(): new_value }); + } } if let Some(first_key_start) = first_key_start { @@ -1095,6 +1114,44 @@ mod tests { pretty_assertions::assert_eq!(new_json, expected_new_json.into()); } + #[test] + fn test_update_language_overrides_copilot() { + assert_new_settings( + r#" + { + "language_overrides": { + "JSON": { + "copilot": "off" + } + } + } + "# + .unindent(), + |settings| { + settings.languages.insert( + "Rust".into(), + EditorSettings { + copilot: Some(OnOff::On), + ..Default::default() + }, + ); + }, + r#" + { + "language_overrides": { + "Rust": { + "copilot": "on" + }, + "JSON": { + "copilot": "off" + } + } + } + "# + .unindent(), + ); + } + #[test] fn test_update_copilot() { assert_new_settings(