void dumpChunks()

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());
}