foldsFindMatchingBracket function

int foldsFindMatchingBracket({
  1. required Rope rope,
  2. required int targetOffset,
})

Implementation

int foldsFindMatchingBracket({required Rope rope, required int targetOffset}) {
  final value = rope.charAt(targetOffset);
  const pairs = {'(': ')', '[': ']', '{': '}'};
  const reversePairs = {')': '(', ']': '[', '}': '{'};
  final forward = pairs[value];
  final backward = reversePairs[value];
  if (forward == null && backward == null) return -1;
  final step = forward != null ? 1 : -1;
  final expected = forward ?? backward!;
  var depth = 0;
  for (
    var offset = targetOffset;
    offset >= 0 && offset < rope.length;
    offset += step
  ) {
    final char = rope.charAt(offset);
    if (char == value) {
      depth++;
    } else if (char == expected) {
      depth--;
      if (depth == 0) return offset;
    }
  }
  return -1;
}