in lib/src/debug.dart [64:190]
void dumpChunks(int start, List<Chunk> chunks) {
if (chunks.skip(start).isEmpty) return;
// Show the spans as vertical bands over their range (unless there are too
// many).
var spanSet = <Span>{};
void addSpans(List<Chunk> chunks) {
for (var chunk in chunks) {
spanSet.addAll(chunk.spans);
if (chunk.isBlock) addSpans(chunk.block.chunks);
}
}
addSpans(chunks);
var spans = spanSet.toList();
var rules =
chunks.map((chunk) => chunk.rule).where((rule) => rule != null).toSet();
var rows = <List<String>>[];
void addChunk(List<Chunk> chunks, String prefix, int index) {
var row = <String>[];
row.add('$prefix$index:');
var chunk = chunks[index];
if (chunk.text.length > 70) {
row.add(chunk.text.substring(0, 70));
} else {
row.add(chunk.text);
}
if (spans.length <= 20) {
var spanBars = '';
for (var span in spans) {
if (chunk.spans.contains(span)) {
if (index == 0 || !chunks[index - 1].spans.contains(span)) {
if (span.cost == 1) {
spanBars += '╖';
} else {
spanBars += span.cost.toString();
}
} else {
spanBars += '║';
}
} else {
if (index > 0 && chunks[index - 1].spans.contains(span)) {
spanBars += '╜';
} else {
spanBars += ' ';
}
}
}
row.add(spanBars);
}
void writeIf(predicate, String Function() callback) {
if (predicate) {
row.add(callback());
} else {
row.add('');
}
}
var rule = chunk.rule;
if (rule == null) {
row.add('');
row.add('(no rule)');
row.add('');
} else {
writeIf(rule.cost != 0, () => '\$${rule.cost}');
var ruleString = rule.toString();
if (rule.isHardened) ruleString += '!';
row.add(ruleString);
var constrainedRules = rule.constrainedRules.toSet().intersection(rules);
writeIf(constrainedRules.isNotEmpty,
() => "-> ${constrainedRules.join(" ")}");
}
writeIf(chunk.indent != null && chunk.indent != 0,
() => 'indent ${chunk.indent}');
writeIf(chunk.nesting?.indent != 0, () => 'nest ${chunk.nesting}');
writeIf(chunk.flushLeft, () => 'flush');
writeIf(chunk.canDivide, () => 'divide');
rows.add(row);
if (chunk.isBlock) {
for (var j = 0; j < chunk.block.chunks.length; j++) {
addChunk(chunk.block.chunks, '$prefix$index.', j);
}
}
}
for (var i = start; i < chunks.length; i++) {
addChunk(chunks, '', i);
}
var rowWidths = List.filled(rows.first.length, 0);
for (var row in rows) {
for (var i = 0; i < row.length; i++) {
rowWidths[i] = math.max(rowWidths[i], row[i].length);
}
}
var buffer = StringBuffer();
for (var row in rows) {
for (var i = 0; i < row.length; i++) {
var cell = row[i].padRight(rowWidths[i]);
if (i != 1) cell = gray(cell);
buffer.write(cell);
buffer.write(' ');
}
buffer.writeln();
}
print(buffer.toString());
}