From 8ee5aa0bc63353d2eca0fa1dcd53bf23653a0102 Mon Sep 17 00:00:00 2001 From: Hixie Date: Thu, 4 Jun 2015 14:10:07 -0700 Subject: [PATCH] Give RenderObject a useful toString(). This makes debugging the render tree a lot easier. Just print the node you care about, and you get an indented tree view of its subtree, including settings. New subclasses should implement the new virtual method debugDescribeSettings() to expose new settings. R=eseidel@chromium.org Review URL: https://codereview.chromium.org/1157993005 --- sdk/lib/framework/components2/scaffold.dart | 3 +++ sdk/lib/framework/rendering/box.dart | 19 ++++++++++++++ sdk/lib/framework/rendering/flex.dart | 1 + sdk/lib/framework/rendering/object.dart | 28 +++++++++++++++++++++ sdk/lib/framework/rendering/paragraph.dart | 2 ++ 5 files changed, 53 insertions(+) diff --git a/sdk/lib/framework/components2/scaffold.dart b/sdk/lib/framework/components2/scaffold.dart index 4cac5d2a9d9..ea6c3797b35 100644 --- a/sdk/lib/framework/components2/scaffold.dart +++ b/sdk/lib/framework/components2/scaffold.dart @@ -130,6 +130,9 @@ class RenderScaffold extends RenderBox { } } + String debugDescribeChildren(String prefix) { + return _slots.keys.map((slot) => '${prefix}${slot}: ${_slots[slot].toString(prefix)}').join('\n'); + } } class Scaffold extends RenderObjectWrapper { diff --git a/sdk/lib/framework/rendering/box.dart b/sdk/lib/framework/rendering/box.dart index 9c97a6cde32..0be7bb90f24 100644 --- a/sdk/lib/framework/rendering/box.dart +++ b/sdk/lib/framework/rendering/box.dart @@ -109,6 +109,7 @@ class BoxConstraints { class BoxParentData extends ParentData { sky.Point position = new sky.Point(0.0, 0.0); + String toString() => 'position=$position'; } abstract class RenderBox extends RenderObject { @@ -213,6 +214,8 @@ class RenderSizedBox extends RenderProxyBox { if (child != null) child.layout(new BoxConstraints.tight(size)); } + + String debugDescribeSettings(String prefix) => '${prefix}desiredSize: ${desiredSize}'; } class RenderClip extends RenderProxyBox { @@ -285,6 +288,7 @@ class RenderPadding extends RenderBox with RenderObjectWithChildMixin } } + String debugDescribeSettings(String prefix) => '${prefix}padding: ${padding}'; } class RenderImage extends RenderBox { @@ -359,6 +363,8 @@ class RenderImage extends RenderBox { if (needsScale) canvas.restore(); } + + String debugDescribeSettings(String prefix) => '${prefix}url: ${src}\n${prefix}dimensions: ${requestedSize}'; } class BorderSide { @@ -417,6 +423,17 @@ class BoxDecoration { final sky.Color backgroundColor; final Border border; + + String toString([String prefix = '']) { + List result = []; + if (backgroundColor != null) + result.add('${prefix}backgroundColor: $backgroundColor'); + if (border != null) + result.add('${prefix}border: $border'); + if (result.isEmpty) + return '${prefix}'; + return result.join('\n'); + } } class RenderDecoratedBox extends RenderProxyBox { @@ -495,6 +512,8 @@ class RenderDecoratedBox extends RenderProxyBox { super.paint(canvas); } + + String debugDescribeSettings(String prefix) => '${prefix}decoration:\n${decoration.toString(prefix + " ")}'; } class RenderTransform extends RenderProxyBox { diff --git a/sdk/lib/framework/rendering/flex.dart b/sdk/lib/framework/rendering/flex.dart index f719dada7c7..189f5619d64 100644 --- a/sdk/lib/framework/rendering/flex.dart +++ b/sdk/lib/framework/rendering/flex.dart @@ -13,6 +13,7 @@ class FlexBoxParentData extends BoxParentData with ContainerParentDataMixin '${super.toString()}; flex=$flex'; } enum FlexDirection { horizontal, vertical } diff --git a/sdk/lib/framework/rendering/object.dart b/sdk/lib/framework/rendering/object.dart index 736d67771c2..46b414f3c14 100644 --- a/sdk/lib/framework/rendering/object.dart +++ b/sdk/lib/framework/rendering/object.dart @@ -16,6 +16,7 @@ class ParentData { // override this in subclasses to merge in data from other into this assert(other.runtimeType == this.runtimeType); } + String toString() => ''; } const kLayoutDirections = 4; @@ -219,6 +220,18 @@ abstract class RenderObject extends AbstractNode { // } // You must not add yourself to /result/ if you return false. + + String toString([String prefix = '']) { + String header = '${runtimeType}\n'; + prefix += ' '; + String settings = '${debugDescribeSettings(prefix)}'; + if (settings != '') + settings += '\n'; + return '${header}${settings}${debugDescribeChildren(prefix)}'; + } + String debugDescribeSettings(String prefix) => '${prefix}parentData: ${parentData}'; + String debugDescribeChildren(String prefix) => ''; + } class HitTestResult { @@ -252,6 +265,7 @@ abstract class RenderObjectWithChildMixin { if (_child != null) _child.detach(); } + String debugDescribeChildren(String prefix) => '${prefix}child: ${child.toString(prefix)}'; } @@ -401,4 +415,18 @@ abstract class ContainerRenderObjectMixin '${prefix}TEXT (${color}): ${text}'; }