@@ -113,11 +113,7 @@ pub fn find_root_impl(root: Option<&str>, root_markers: &[String]) -> Vec<std::p
113113/// documents that use a top-level array of values like the `languages.toml`,
114114/// where one usually wants to override or add to the array instead of
115115/// replacing it altogether.
116−pub fn merge_toml_values(
117− left: toml::Value,
118− right: toml::Value,
119− merge_toplevel_arrays: bool,
120−) -> toml::Value {
116+pub fn merge_toml_values(left: toml::Value, right: toml::Value, merge_depth: usize) -> toml::Value {
121117 use toml::Value;
122118
123119 fn get_name(v: &Value) -> Option<&str> {
@@ -131,7 +127,7 @@ pub fn merge_toml_values(
131127 // that you can specify a sub-set of languages in an overriding
132128 // `languages.toml` but that nested arrays like Language Server
133129 // arguments are replaced instead of merged.
134− if merge_toplevel_arrays {
130+ if merge_depth > 0 {
135131 left_items.reserve(right_items.len());
136132 for rvalue in right_items {
137133 let lvalue = get_name(&rvalue)
@@ -140,7 +136,7 @@ pub fn merge_toml_values(
140136 })
141137 .map(|lpos| left_items.remove(lpos));
142138 let mvalue = match lvalue {
143− Some(lvalue) => merge_toml_values(lvalue, rvalue, false),
139+ Some(lvalue) => merge_toml_values(lvalue, rvalue, merge_depth - 1),
144140 None => rvalue,
145141 };
146142 left_items.push(mvalue);
@@ -151,18 +147,22 @@ pub fn merge_toml_values(
151147 }
152148 }
153149 (Value::Table(mut left_map), Value::Table(right_map)) => {
154− for (rname, rvalue) in right_map {
155− match left_map.remove(&rname) {
156− Some(lvalue) => {
157− let merged_value = merge_toml_values(lvalue, rvalue, merge_toplevel_arrays);
158− left_map.insert(rname, merged_value);
159− }
160− None => {
161− left_map.insert(rname, rvalue);
150+ if merge_depth > 0 {
151+ for (rname, rvalue) in right_map {
152+ match left_map.remove(&rname) {
153+ Some(lvalue) => {
154+ let merged_value = merge_toml_values(lvalue, rvalue, merge_depth - 1);
155+ left_map.insert(rname, merged_value);
156+ }
157+ None => {
158+ left_map.insert(rname, rvalue);
159+ }
162160 }
163161 }
162+ Value::Table(left_map)
163+ } else {
164+ Value::Table(right_map)
164165 }
165− Value::Table(left_map)
166166 }
167167 // Catch everything else we didn't handle, and use the right value
168168 (_, value) => value,
@@ -187,7 +187,7 @@ mod merge_toml_tests {
187187 .expect("Couldn't parse built-in languages config");
188188 let user: Value = toml::from_str(USER).unwrap();
189189
190− let merged = merge_toml_values(base, user, true);
190+ let merged = merge_toml_values(base, user, 3);
191191 let languages = merged.get("language").unwrap().as_array().unwrap();
192192 let nix = languages
193193 .iter()
@@ -220,7 +220,7 @@ mod merge_toml_tests {
220220 .expect("Couldn't parse built-in languages config");
221221 let user: Value = toml::from_str(USER).unwrap();
222222
223− let merged = merge_toml_values(base, user, true);
223+ let merged = merge_toml_values(base, user, 3);
224224 let languages = merged.get("language").unwrap().as_array().unwrap();
225225 let ts = languages
226226 .iter()