WordChanges.of constructor

WordChanges.of(
  1. FileDiff diff, {
  2. InlineDiffMode mode = InlineDiffMode.mergedWords,
  3. int maxLineLength = 10000,
})

Computes word changes for every hunk in diff.

Implementation

factory WordChanges.of(
  FileDiff diff, {
  InlineDiffMode mode = InlineDiffMode.mergedWords,
  int maxLineLength = 10000,
}) {
  final ranges = Map<DiffLine, List<CharRange>>.identity();
  for (final hunk in diff.hunks) {
    final lines = hunk.lines;
    var i = 0;
    while (i < lines.length) {
      final removedStart = i;
      while (i < lines.length && lines[i].kind == DiffLineKind.removed) {
        i++;
      }
      final addedStart = i;
      while (i < lines.length && lines[i].kind == DiffLineKind.added) {
        i++;
      }
      final pairs = (addedStart - removedStart) < (i - addedStart)
          ? addedStart - removedStart
          : i - addedStart;
      for (var p = 0; p < pairs; p++) {
        final removed = lines[removedStart + p];
        final added = lines[addedStart + p];
        if (mode == InlineDiffMode.none ||
            (maxLineLength > 0 &&
                (removed.text.length > maxLineLength ||
                    added.text.length > maxLineLength))) {
          continue;
        }
        final (oldRanges, newRanges) = _compare(
          removed.text,
          added.text,
          mode,
        );
        if (oldRanges.isNotEmpty) ranges[removed] = oldRanges;
        if (newRanges.isNotEmpty) ranges[added] = newRanges;
      }
      if (i == removedStart) i++; // a context line
    }
  }
  return WordChanges._(ranges);
}