From 35a3eaabdf82d828e339fa3578e60a486ed0ec39 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sun, 27 Feb 2022 14:49:47 -0500 Subject: [PATCH 1/2] fix: actually remove nodes in keyed_diff_middle --- packages/core/src/diff.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 4e9a11c34..5682772be 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -813,6 +813,15 @@ impl<'b> DiffState<'b> { return; } + // remove any old children that are not shared + // todo: make this an iterator + for child in old { + let key = child.key().unwrap(); + if !shared_keys.contains(&key) { + self.remove_nodes([child], true); + } + } + // 4. Compute the LIS of this list let mut lis_sequence = Vec::default(); lis_sequence.reserve(new_index_to_old_index.len()); From c2c6d73916a8ab0e972179ac7917feefef8c8ca9 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sun, 27 Feb 2022 14:59:36 -0500 Subject: [PATCH 2/2] fix: tests should reflect removes --- packages/core/tests/diffing.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/tests/diffing.rs b/packages/core/tests/diffing.rs index 6bc9b5596..9184d4e4a 100644 --- a/packages/core/tests/diffing.rs +++ b/packages/core/tests/diffing.rs @@ -623,16 +623,17 @@ fn controlled_keyed_diffing_out_of_order() { assert_eq!( changes.edits, [ + Remove { root: 4 }, // move 4 to after 6 PushRoot { root: 1 }, InsertAfter { n: 1, root: 3 }, // remove 7 // create 9 and insert before 6 - CreateElement { root: 5, tag: "div" }, + CreateElement { root: 4, tag: "div" }, InsertBefore { n: 1, root: 3 }, // create 0 and insert before 5 - CreateElement { root: 6, tag: "div" }, + CreateElement { root: 5, tag: "div" }, InsertBefore { n: 1, root: 2 }, ] ); @@ -659,7 +660,8 @@ fn controlled_keyed_diffing_out_of_order_max_test() { assert_eq!( changes.edits, [ - CreateElement { root: 6, tag: "div" }, + Remove { root: 5 }, + CreateElement { root: 5, tag: "div" }, InsertBefore { n: 1, root: 3 }, PushRoot { root: 4 }, InsertBefore { n: 1, root: 1 },