CharSequence (int hashCode, @NotNull CharSequence sequence, int startOffset, int endOffset) { Object value = get(hashCode); String addedSequence; if (value == null) { addedSequence = substring(sequence, startOffset, endOffset); put(hashCode, addedSequence); } else if (value instanceof CharSequence) { CharSequence existingSequence = (CharSequence)value; if (charSequenceSubSequenceEquals(existingSequence, sequence, startOffset, endOffset)) { return existingSequence; } addedSequence = substring(sequence, startOffset, endOffset); put(hashCode, new CharSequence[]{existingSequence, addedSequence}); } else if (value instanceof CharSequence[]) { CharSequence[] existingSequenceArray = (CharSequence[])value; for (CharSequence cs : existingSequenceArray) { if (charSequenceSubSequenceEquals(cs, sequence, startOffset, endOffset)) { return cs; } } addedSequence = substring(sequence, startOffset, endOffset); CharSequence[] newSequenceArray = ArrayUtil.append(existingSequenceArray, addedSequence, CharSequence[]::new); put(hashCode, newSequenceArray); } else { assert false : value.getClass(); return null; } return addedSequence; }