void (int start, int end, @NotNull String replace) { int docStart = psiToDocumentOffset(start); int docEnd = psiToDocumentOffset(end); TextRange startRange = findFragment(docStart); TextRange endRange = findFragment(docEnd); myPsiText = myPsiText.replace(start, end, replace); TextRange newFragment = new TextRange(startRange != null ? startRange.getStartOffset() : docStart, endRange != null ? endRange.getEndOffset() : docEnd); CharSequence newReplacement = myPsiText.subSequence(documentToPsiOffset(newFragment.getStartOffset(), false), documentToPsiOffset(newFragment.getEndOffset(), true) + replace.length() - (end - start)); myAffectedFragments.keySet().removeIf(range -> range.intersects(newFragment)); myAffectedFragments.put(newFragment, newReplacement); }