diff --git a/zed/src/theme/resolution.rs b/zed/src/theme/resolution.rs index fd3864e274af20f75fbfe4da54f43fcdcdecc6c3..acebf72b86120065cb8587d05c2a8db92a00cced 100644 --- a/zed/src/theme/resolution.rs +++ b/zed/src/theme/resolution.rs @@ -237,9 +237,12 @@ impl Tree { fn update_resolved(&self) { match &mut *self.0.borrow_mut() { Node::Object { - resolved, children, .. + resolved, + base, + children, + .. } => { - *resolved = children.values().all(|c| c.is_resolved()); + *resolved = base.is_none() && children.values().all(|c| c.is_resolved()); } Node::Array { resolved, children, .. @@ -261,6 +264,9 @@ impl Tree { if tree.is_resolved() { while let Some(parent) = tree.parent() { parent.update_resolved(); + if !parent.is_resolved() { + break; + } tree = parent; } } @@ -330,9 +336,10 @@ impl Tree { made_progress = true; } - if let Node::Object { resolved, .. } = &mut *self.0.borrow_mut() { + if let Node::Object { resolved, base, .. } = &mut *self.0.borrow_mut() { if has_base { if resolved_base.is_some() { + base.take(); *resolved = true; } else { unresolved.push(self.clone()); @@ -341,6 +348,8 @@ impl Tree { *resolved = true; } } + } else if base.is_some() { + unresolved.push(self.clone()); } Ok(made_progress) @@ -427,6 +436,7 @@ mod test { fn test_references() { let json = serde_json::json!({ "a": { + "extends": "$g", "x": "$b.d" }, "b": { @@ -436,6 +446,9 @@ mod test { "e": { "extends": "$a", "f": "1" + }, + "g": { + "h": 2 } }); @@ -443,19 +456,27 @@ mod test { resolve_references(json).unwrap(), serde_json::json!({ "a": { - "x": "1" + "extends": "$g", + "x": "1", + "h": 2 }, "b": { "c": { - "x": "1" + "extends": "$g", + "x": "1", + "h": 2 }, "d": "1" }, "e": { "extends": "$a", "f": "1", - "x": "1" + "x": "1", + "h": 2 }, + "g": { + "h": 2 + } }) ) }