foldsComputeAll function

Future<List<RustFoldRange>> foldsComputeAll({
  1. required Rope rope,
})

Implementation

Future<List<RustFoldRange>> foldsComputeAll({required Rope rope}) async {
  final result = <RustFoldRange>[];
  final stack = <(String, int)>[];
  final openToClose = {'{': '}', '[': ']', '(': ')'};
  final closeToOpen = {
    for (final entry in openToClose.entries) entry.value: entry.key,
  };
  for (var line = 0; line < rope.lineCount; line++) {
    final text = rope.getLineText(line);
    for (final char in text.split('')) {
      if (openToClose.containsKey(char)) {
        stack.add((char, line));
      } else if (closeToOpen.containsKey(char) && stack.isNotEmpty) {
        final index = stack.last.$1 == closeToOpen[char]
            ? stack.length - 1
            : -1;
        if (index >= 0) {
          final start = stack.removeLast().$2;
          if (line > start) {
            result.add(RustFoldRange(startLine: start, endLine: line));
          }
        }
      }
    }
  }
  result.sort((a, b) => a.startLine.compareTo(b.startLine));
  return result;
}