foldsComputeAll function
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;
}