generatedIncludedRangeDifferences function
List<GeneratedTreeSitterChangedRange>
generatedIncludedRangeDifferences(
- List<
TreeSitterTableRange> oldRanges, - List<
TreeSitterTableRange> newRanges, { - GeneratedChangedRangeTrace? trace,
Implementation
List<GeneratedTreeSitterChangedRange> generatedIncludedRangeDifferences(
List<TreeSitterTableRange> oldRanges,
List<TreeSitterTableRange> newRanges, {
GeneratedChangedRangeTrace? trace,
}) {
final differences = <GeneratedTreeSitterChangedRange>[];
var newIndex = 0;
var oldIndex = 0;
var current = const GeneratedChangedRangeLength(
0,
TreeSitterTablePoint(0, 0),
);
var inOldRange = false;
var inNewRange = false;
const maximum = GeneratedChangedRangeLength(
0xffffffff,
TreeSitterTablePoint(0xffffffff, 0xffffffff),
);
while (oldIndex < oldRanges.length || newIndex < newRanges.length) {
final nextOld = inOldRange
? GeneratedChangedRangeLength(
oldRanges[oldIndex].endByte,
oldRanges[oldIndex].endPoint,
)
: oldIndex < oldRanges.length
? GeneratedChangedRangeLength(
oldRanges[oldIndex].startByte,
oldRanges[oldIndex].startPoint,
)
: maximum;
final nextNew = inNewRange
? GeneratedChangedRangeLength(
newRanges[newIndex].endByte,
newRanges[newIndex].endPoint,
)
: newIndex < newRanges.length
? GeneratedChangedRangeLength(
newRanges[newIndex].startByte,
newRanges[newIndex].startPoint,
)
: maximum;
if (nextOld.byte < nextNew.byte) {
if (inOldRange != inNewRange) {
generatedRangeArrayAdd(differences, current, nextOld, trace: trace);
}
if (inOldRange) oldIndex++;
current = nextOld;
inOldRange = !inOldRange;
} else if (nextNew.byte < nextOld.byte) {
if (inOldRange != inNewRange) {
generatedRangeArrayAdd(differences, current, nextNew, trace: trace);
}
if (inNewRange) newIndex++;
current = nextNew;
inNewRange = !inNewRange;
} else {
if (inOldRange != inNewRange) {
generatedRangeArrayAdd(differences, current, nextNew, trace: trace);
}
if (inOldRange) oldIndex++;
if (inNewRange) newIndex++;
inOldRange = !inOldRange;
inNewRange = !inNewRange;
current = nextNew;
}
}
trace?.record('ts_range_array_get_changed_ranges', <Object?>[
for (final range in differences) (range.startByte, range.endByte),
]);
return differences;
}