Range<Integer> (PsiElement @NotNull [] elements, int startOffset, int endOffset) { int startIndex = elements.length; int endIndex = -1; if (startOffset == endOffset) { for (int i = 0; i < elements.length; i++) { if (elements[i].getTextRange().containsOffset(startOffset)) { startIndex = endIndex = i; break; } } } else { for (int i = 0; i < elements.length; i++) { PsiElement psiElement = elements[i]; TextRange range = psiElement.getTextRange(); if (i < startIndex && startOffset < range.getEndOffset()) startIndex = i; if (endOffset > range.getStartOffset()) endIndex = i; else break; } } return startIndex > endIndex || (myIsLeft ? startIndex == 0 : endIndex == elements.length - 1) ? null : new Range<>(startIndex, endIndex); }