@Override
  public boolean processRemovedClass(DifferentiateContext context, JvmClass removedClass, Utils future, Utils present) {
    for (JvmClass superClass : filter(future.allDirectSupertypes(removedClass), KJvmUtils::isSealed)) {
      affectSealedClass(context, superClass.getReferenceID(), "Subclass of a sealed class was removed, affecting ", future, true /*affectUsages*/);
    }

    if (!removedClass.isInnerClass()) {
      // this will affect all imports of this class in kotlin sources
      KmDeclarationContainer container = KJvmUtils.getDeclarationContainer(removedClass);
      if ((container == null /*is non-kotlin node*/ && !removedClass.isPrivate()) || (container instanceof KmClass && !KJvmUtils.isPrivate(((KmClass)container)))) {
        debug("Affecting lookup usages for removed class ", removedClass.getName());
        affectClassLookupUsages(context, removedClass);
      }
    }

    if (!removedClass.isPrivate()) {
      for (KmFunction kmFunction : filter(KJvmUtils.allKmFunctions(removedClass), f -> !KJvmUtils.isPrivate(f))) {
        if (Attributes.isInline(kmFunction)) {
          debug("Function in a removed class was inlineable, affecting method usages ", kmFunction.getName());
          affectMemberLookupUsages(context, removedClass, kmFunction.getName(), present);
        }
      }

      for (KmProperty prop : filter(KJvmUtils.allKmProperties(removedClass), p -> !KJvmUtils.isPrivate(p))) {
        if (Attributes.isConst(prop) || Attributes.isInline(prop.getGetter()) || (prop.getSetter() != null && Attributes.isInline(prop.getSetter()))) {
          debug("Property in a removed class was a constant or had inlineable accessors, affecting property usages ", prop.getName());
          affectMemberLookupUsages(context, removedClass, prop.getName(), present);
        }
      }
    }
    return true;
  }
@Override
  public boolean processRemovedClass(DifferentiateContext context, JvmClass removedClass, Utils future, Utils present)