@Override
  public boolean areRangesEqual(@NotNull DocumentWindow other) {
    DocumentWindowImpl window = (DocumentWindowImpl)other;
    Place shreds = getShreds();
    Place otherShreds = window.getShreds();
    if (shreds.size() != otherShreds.size()) return false;
    for (int i = 0; i < shreds.size(); i++) {
      PsiLanguageInjectionHost.Shred shred = shreds.get(i);
      PsiLanguageInjectionHost.Shred otherShred = otherShreds.get(i);
      if (!shred.getPrefix().equals(otherShred.getPrefix())) return false;
      if (!shred.getSuffix().equals(otherShred.getSuffix())) return false;

      Segment hostRange = shred.getHostRangeMarker();
      Segment otherRange = otherShred.getHostRangeMarker();
      if (hostRange == null || otherRange == null || !TextRange.areSegmentsEqual(hostRange, otherRange)) return false;
    }
    return true;
  }
@Override
  public boolean areRangesEqual(@NotNull DocumentWindow other)