Skip to content

Commit 6f84323

Browse files
CalixTangmeta-codesync[bot]
authored andcommitted
Hotfix VirtualViewContainerStateExperimental delete (facebook#54236)
Summary: Pull Request resolved: facebook#54236 Changelog[Internal] - Fix faulty changes made to Interval Tree in previous diff. The issue was in the right-right rotation case of the internal Interval Tree implementation: ``` // Right heavy if (bf < -1) { if (balanceFactor(node.right) > 0) { node.right = rotateRight(...) ``` This diff also includes a minor update to logic in IntervalTree's `delete` operation. There was previously a missing `balance` operation. Reviewed By: lunaleaps Differential Revision: D85263661 fbshipit-source-id: 8636984161a8668d74973b6aebad9842d4d7f34f
1 parent 9f7a3bb commit 6f84323

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ internal class IntervalTree(private val horizontal: Boolean) : MutableCollection
275275
if (bf < -1) {
276276
if (balanceFactor(node.right) > 0) {
277277
node.right =
278-
rotateLeft(
278+
rotateRight(
279279
requireNotNull(node.right) {
280280
"[IntervalTree] node.right must not be null when performing right rotation around it"
281281
}
@@ -324,6 +324,7 @@ internal class IntervalTree(private val horizontal: Boolean) : MutableCollection
324324
return null
325325
}
326326

327+
var nodeToReturn: IntervalNode? = node
327328
when {
328329
compareIntervals(target.interval, node.interval) < 0 -> {
329330
node.left = delete(node.left, target)
@@ -333,26 +334,31 @@ internal class IntervalTree(private val horizontal: Boolean) : MutableCollection
333334
}
334335
else -> {
335336
// Node to delete found
336-
return when {
337-
node.left == null -> node.right
338-
node.right == null -> node.left
339-
else -> {
340-
val successor =
341-
findMin(
342-
requireNotNull(node.right) {
343-
"[IntervalTree] node.right must not be null when finding node's successor"
344-
}
345-
)
346-
node.virtualView = successor.virtualView
347-
node.interval = successor.interval
348-
node.right = delete(node.right, successor)
349-
node
350-
}
351-
}
337+
nodeToReturn =
338+
when {
339+
node.left == null -> node.right
340+
node.right == null -> node.left
341+
else -> {
342+
val successor =
343+
findMin(
344+
requireNotNull(node.right) {
345+
"[IntervalTree] node.right must not be null when finding node's successor"
346+
}
347+
)
348+
node.virtualView = successor.virtualView
349+
node.interval = successor.interval
350+
node.right = delete(node.right, successor)
351+
node
352+
}
353+
}
352354
}
353355
}
354356

355-
return balance(node)
357+
if (nodeToReturn == null) {
358+
return null
359+
} else {
360+
return balance(nodeToReturn)
361+
}
356362
}
357363

358364
private fun queryHelper(

0 commit comments

Comments
 (0)