@Override
  public @Nullable FList<TextRange> matchingFragments(@NotNull String name) {
    FList<TextRange> match = delegate.matchingFragments(name);
    if (match != null && !match.isEmpty()) {
      List<FList<TextRange>> allMatchesReversed = new ArrayList<>();
      int lastOffset = 0;
      while (match != null && !match.isEmpty()) {
        FList<TextRange> reversedWithAbsoluteOffsets = FList.emptyList();
        for (TextRange r : match) {
          reversedWithAbsoluteOffsets = reversedWithAbsoluteOffsets.prepend(r.shiftRight(lastOffset));
        }
        allMatchesReversed.add(reversedWithAbsoluteOffsets);
        lastOffset = reversedWithAbsoluteOffsets.get(0).getEndOffset();
        match = delegate.matchingFragments(name.substring(lastOffset));
      }
      match = FList.emptyList();
      for (int i = allMatchesReversed.size() - 1; i >= 0; i--) {
        for (TextRange range : allMatchesReversed.get(i)) {
          match = match.prepend(range);
        }
      }
    }
    return match;
  }
@Override
  public @Nullable FList<TextRange> matchingFragments(@NotNull String name)