generatedIncludedRangeDifferences function

List<GeneratedTreeSitterChangedRange> generatedIncludedRangeDifferences(
  1. List<TreeSitterTableRange> oldRanges,
  2. List<TreeSitterTableRange> newRanges, {
  3. 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;
}