adjustLspFoldRangesForLineChange method

void adjustLspFoldRangesForLineChange(
  1. int editLine,
  2. int lineDelta
)

Adjusts LSP fold ranges after a line count change.

editLine is the line where the edit occurred. lineDelta is the number of lines added (positive) or removed (negative).

Implementation

void adjustLspFoldRangesForLineChange(int editLine, int lineDelta) {
  if (_lspFoldRanges == null || lineDelta == 0) return;

  final adjustedLspFoldRanges = <int, FoldRange>{};

  for (final entry in _lspFoldRanges!.entries) {
    final oldStartIndex = entry.key;
    final fold = entry.value;

    if (fold.endIndex < editLine) {
      adjustedLspFoldRanges[oldStartIndex] = fold;
    } else if (fold.startIndex <= editLine && fold.endIndex >= editLine) {
      final newEndIndex = fold.endIndex + lineDelta;
      if (newEndIndex >= oldStartIndex) {
        final newFold = FoldRange(oldStartIndex, newEndIndex);
        newFold.isFolded = fold.isFolded;
        newFold.originallyFoldedChildren = fold.originallyFoldedChildren;
        adjustedLspFoldRanges[oldStartIndex] = newFold;
      }
    } else if (fold.startIndex > editLine) {
      final newStartIndex = fold.startIndex + lineDelta;
      final newEndIndex = fold.endIndex + lineDelta;
      if (newStartIndex >= 0 && newEndIndex >= newStartIndex) {
        final newFold = FoldRange(newStartIndex, newEndIndex);
        newFold.isFolded = fold.isFolded;
        newFold.originallyFoldedChildren = fold.originallyFoldedChildren;
        adjustedLspFoldRanges[newStartIndex] = newFold;
      }
    }
  }

  _lspFoldRanges = adjustedLspFoldRanges.isEmpty
      ? null
      : adjustedLspFoldRanges;
  _lspFoldRangesAdjustedNotFetched = true;
}