Commit 87adaf3f authored by Hixie's avatar Hixie

RenderObjectWrapper cleanup and new asserts.

- Clarify comment about RenderObjectWrapper.
- Assert that we never sync a RenderObjectWrapper with an instance of a different type.
- Assert that MultiChildRenderObjectWrapper subclasses always have multi-child RenderObjects.
- Assert that renderObject doesn't change identity when syncing.
- Make searchForOldNode() return void since the return value is ignored.
- Remove code that handled renderObject changing during sync.
parent 2c44ed0f
......@@ -864,10 +864,10 @@ void _scheduleComponentForRender(Component component) {
}
}
// RenderObjectWrappers correspond to a desired state of a RenderObject.
// They are fully immutable, with one exception: A Widget which is a
// Component which lives within an MultiChildRenderObjectWrapper's
// children list, may be replaced with the "old" instance if it has
// RenderObjectWrappers correspond to a desired state of a
// RenderObject. They are fully immutable, except that a Widget which
// is a Component which lives within a RenderObjectWrapper's children
// list may be in-place replaced with the "old" instance if it has
// become stateful.
abstract class RenderObjectWrapper extends Widget {
......@@ -911,7 +911,7 @@ abstract class RenderObjectWrapper extends Widget {
if (_ancestor is RenderObjectWrapper)
_ancestor.insertChildRoot(this, slot);
} else {
assert(old is RenderObjectWrapper);
assert(old.runtimeType == runtimeType);
_renderObject = old.renderObject;
_ancestor = old._ancestor;
assert(_renderObject != null);
......@@ -1088,9 +1088,9 @@ abstract class MultiChildRenderObjectWrapper extends RenderObjectWrapper {
void syncRenderObject(MultiChildRenderObjectWrapper old) {
super.syncRenderObject(old);
final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer
if (renderObject is! ContainerRenderObjectMixin)
return;
final ContainerRenderObjectMixin renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer
assert(renderObject is ContainerRenderObjectMixin);
assert(old == null || old.renderObject == renderObject);
var startIndex = 0;
var endIndex = children.length;
......@@ -1155,28 +1155,21 @@ abstract class MultiChildRenderObjectWrapper extends RenderObjectWrapper {
}
}
bool searchForOldNode() {
void searchForOldNode() {
if (currentNode.key == null)
return false; // never re-order these nodes
return; // never re-order these nodes
ensureOldIdMap();
oldNode = oldNodeIdMap[currentNode.key];
if (oldNode == null)
return false;
return;
oldNodeIdMap[currentNode.key] = null; // mark it reordered
assert(renderObject is ContainerRenderObjectMixin);
assert(old.renderObject is ContainerRenderObjectMixin);
assert(oldNode.renderObject != null);
if (old.renderObject == renderObject) {
renderObject.move(oldNode.renderObject, before: nextSibling);
} else {
(old.renderObject as ContainerRenderObjectMixin).remove(oldNode.renderObject); // TODO(ianh): Remove cast once the analyzer is cleverer
renderObject.add(oldNode.renderObject, before: nextSibling);
}
return true;
renderObject.move(oldNode.renderObject, before: nextSibling);
}
// Scan forwards, this time we may re-order;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment