WordChanges.of constructor
WordChanges.of(
- FileDiff diff, {
- InlineDiffMode mode = InlineDiffMode.mergedWords,
- 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);
}