IntList (@NotNull IntList directChanges) { IntList result = new IntArrayList(directChanges.size()); int directArrayIndex = 0; int otherIndex = 0; while (directArrayIndex < directChanges.size() && otherIndex < getChangesCount()) { int directIndex = directChanges.getInt(directArrayIndex); if (directIndex == otherIndex) { result.add(directIndex); otherIndex++; continue; } int directStart = getLineStart(directIndex); int directEnd = getLineEnd(directIndex); int otherStart = getLineStart(otherIndex); int otherEnd = getLineEnd(otherIndex); if (otherEnd < directStart) { otherIndex++; continue; } if (otherStart > directEnd) { directArrayIndex++; continue; } result.add(otherIndex); otherIndex++; } LOG.assertTrue(directChanges.size() <= result.size()); return result; }