int (int offset) { for (Map.Entry<TextRange, CharSequence> entry : myAffectedFragments.entrySet()) { int lengthAfter = entry.getValue().length(); TextRange range = entry.getKey(); if (range.getStartOffset() + lengthAfter < offset) { offset += range.getLength() - lengthAfter; continue; } // for offsets inside replaced ranges, return the starts of the original affected fragments in document return Math.min(range.getStartOffset(), offset); } return offset; }