Skip to content

Commit fd6ed34

Browse files
authored
Better debug output for piece trees. (#1324)
* Better debug output for piece trees. The old formatter has pretty nice debug output, but the new one is still pretty rudimentary. This improves that situation somewhat from: ``` Sequence(Type(`class Foo` Block(`{` Sequence(Var(`static late final int` `i;`) Var(`static late int` `i;`) Var(`static late var` `i;`) Var(`covariant late var` `i;`) Var(`covariant late int` `i;`) Var(`late final int` `i;`) Var(`late int` `i;`) Var(`late var` `i;`)) `}`))) ``` To: ``` Seq( Type( `class Foo` Block( `{` Seq( Var(`static late final int` `i;`) Var(`static late int` `i;`) Var(`static late var` `i;`) Var(`covariant late var` `i;`) Var(`covariant late int` `i;`) Var(`late final int` `i;`) Var(`late int` `i;`) Var(`late var` `i;`) ) `}` ) ) ) ``` It also eliminates a bunch of pointless `toString()` implementations that are only used for debugging and can be inferred from runtimeType. * Update doc comment.
1 parent acf0c8e commit fd6ed34

17 files changed

+72
-55
lines changed

lib/src/debug.dart

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -268,25 +268,73 @@ void dumpLines(List<Chunk> chunks, SplitSet splits) {
268268
/// Build a string representation of the [piece] tree.
269269
String pieceTree(Piece piece) {
270270
var buffer = StringBuffer();
271+
_PieceDebugTree(piece).write(buffer, 0);
272+
return buffer.toString();
273+
}
271274

272-
void traverse(Piece piece) {
273-
buffer.write(piece);
275+
/// A stringified representation of a tree of pieces for debug output.
276+
class _PieceDebugTree {
277+
final String label;
278+
final List<_PieceDebugTree> children = [];
274279

275-
if (piece is! TextPiece) {
276-
var children = <Piece>[];
277-
piece.forEachChild(children.add);
280+
_PieceDebugTree(Piece piece) : label = piece.toString() {
281+
piece.forEachChild((child) {
282+
children.add(_PieceDebugTree(child));
283+
});
284+
}
278285

279-
buffer.write('(');
280-
for (var child in children) {
281-
if (child != children.first) buffer.write(' ');
282-
traverse(child);
283-
}
284-
buffer.write(')');
286+
/// The approximate number of characters of output needed to print this tree
287+
/// on a single line.
288+
///
289+
/// Used to determine when to show a tree's children inline or split. Note
290+
/// that this is O(n^2), but we don't really care since it's only used for
291+
/// debug output.
292+
int get width {
293+
var result = label.length;
294+
for (var child in children) {
295+
result += child.width;
285296
}
297+
return result;
286298
}
287299

288-
traverse(piece);
289-
return buffer.toString();
300+
void write(StringBuffer buffer, int indent) {
301+
buffer.write(label);
302+
if (children.isEmpty) return;
303+
304+
buffer.write('(');
305+
306+
// Split the tree if it is too long.
307+
var isSplit = indent * 2 + width > 80;
308+
if (isSplit) {
309+
indent++;
310+
buffer.writeln();
311+
buffer.write(' ' * indent);
312+
}
313+
314+
var first = true;
315+
for (var child in children) {
316+
if (!first) {
317+
if (isSplit) {
318+
buffer.writeln();
319+
buffer.write(' ' * indent);
320+
} else {
321+
buffer.write(' ');
322+
}
323+
}
324+
325+
child.write(buffer, indent);
326+
327+
first = false;
328+
}
329+
330+
if (isSplit) {
331+
indent--;
332+
buffer.writeln();
333+
buffer.write(' ' * indent);
334+
}
335+
336+
buffer.write(')');
337+
}
290338
}
291339

292340
String _color(String ansiEscape) => useAnsiColors ? ansiEscape : '';

lib/src/piece/adjacent.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,4 @@ class AdjacentPiece extends Piece {
2121
void forEachChild(void Function(Piece piece) callback) {
2222
_pieces.forEach(callback);
2323
}
24-
25-
@override
26-
String toString() => 'Adjacent';
2724
}

lib/src/piece/assign.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,4 @@ class AssignPiece extends Piece {
129129
callback(target);
130130
callback(value);
131131
}
132-
133-
@override
134-
String toString() => 'Assign';
135132
}

lib/src/piece/block.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,4 @@ class BlockPiece extends Piece {
5555
callback(contents);
5656
callback(rightBracket);
5757
}
58-
59-
@override
60-
String toString() => 'Block';
6158
}

lib/src/piece/chain.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,4 @@ class ChainPiece extends Piece {
4646
void forEachChild(void Function(Piece piece) callback) {
4747
_operations.forEach(callback);
4848
}
49-
50-
@override
51-
String toString() => 'Chain';
5249
}

lib/src/piece/clause.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,6 @@ class ClausesPiece extends Piece {
121121
void forEachChild(void Function(Piece piece) callback) {
122122
_clauses.forEach(callback);
123123
}
124-
125-
@override
126-
String toString() => 'Clauses';
127124
}
128125

129126
/// A keyword followed by a comma-separated list of items described by that
@@ -156,7 +153,4 @@ class ClausePiece extends Piece {
156153
callback(_keyword);
157154
_parts.forEach(callback);
158155
}
159-
160-
@override
161-
String toString() => 'Clause';
162156
}

lib/src/piece/do_while.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,4 @@ class DoWhilePiece extends Piece {
2525
callback(_body);
2626
callback(_condition);
2727
}
28-
29-
@override
30-
String toString() => 'DoWhile';
3128
}

lib/src/piece/for.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,4 @@ class ForPiece extends Piece {
5959
callback(_forParts);
6060
callback(_body);
6161
}
62-
63-
@override
64-
String toString() => 'For';
6562
}

lib/src/piece/function.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,5 @@ class FunctionPiece extends Piece {
5656
}
5757

5858
@override
59-
String toString() => 'Fn';
59+
String get debugName => 'Fn';
6060
}

lib/src/piece/if.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@ class IfPiece extends Piece {
7575
callback(section.statement);
7676
}
7777
}
78-
79-
@override
80-
String toString() => 'If';
8178
}
8279

8380
/// A single section in a chain of if-elses.

0 commit comments

Comments
 (0)