copyInto method

void copyInto(
  1. CodeBuffer other
)

Copies the contents of this CodeBuffer into another, preserving indentation and source mapping information.

Implementation

void copyInto(CodeBuffer other) {
  if (_lines.isEmpty) return;
  var i = 0;

  for (var line in _lines) {
    // To compute offset:
    //   1. Find current length of other
    //   2. Add length of its newline
    //   3. Add indentation
    var column = (other._indentationLevel + line.indentationLevel) *
        other.space.length;
    var offset = other._length + other.newline.length + column;

    // Re-compute start + end
    var start = SourceLocation(
      offset,
      sourceUrl: other.sourceUrl,
      line: other._lines.length + i,
      column: column,
    );

    var end = SourceLocation(
      offset + line.span.length,
      sourceUrl: other.sourceUrl,
      line: start.line,
      column: column + line._buf.length,
    );

    var clone = CodeBufferLine._(
        line.indentationLevel + other._indentationLevel, start)
      .._end = end
      .._buf.write(line._buf.toString());

    // Adjust lastSpan
    if (line._lastSpan != null) {
      var s = line._lastSpan!.start;
      var lastSpanColumn =
          ((line.indentationLevel + other._indentationLevel) *
                  other.space.length) +
              line.text.indexOf(line._lastSpan!.text);
      clone._lastSpan = SourceSpan(
        SourceLocation(
          offset + s.offset,
          sourceUrl: other.sourceUrl,
          line: clone.span.start.line,
          column: lastSpanColumn,
        ),
        SourceLocation(
          offset + s.offset + line._lastSpan!.length,
          sourceUrl: other.sourceUrl,
          line: clone.span.end.line,
          column: lastSpanColumn + line._lastSpan!.length,
        ),
        line._lastSpan!.text,
      );
    }

    other._lines.add(other._currentLine = other._lastLine = clone);

    // Adjust length accordingly...
    other._length = offset + clone.span.length;
    i++;
  }

  other.writeln();
}