@Override
  public boolean processAddedClasses(DifferentiateContext context, Iterable<JvmClass> addedClasses, Utils future, Utils present) {
    if (isEmpty(addedClasses)) {
      return true;
    }

    debug("Processing added classes:");

    for (JvmClass addedClass : addedClasses) {
      debug("Class name: ", addedClass.getName());

      // class duplication checks
      if (!addedClass.isAnonymous() && !addedClass.isLocal() && !addedClass.isInnerClass()) {
        Set<NodeSource> deletedSources = context.getDelta().getDeletedSources();
        Predicate<? super NodeSource> belongsToChunk = context.getParams().belongsToCurrentCompilationChunk();
        Set<NodeSource> candidates = collect(
          filter(present.getNodeSources(addedClass.getReferenceID()), s -> !deletedSources.contains(s) && belongsToChunk.test(s)), new HashSet<>()
        );

        if (!isEmpty(filter(candidates, src -> !context.isCompiled(src)))) {
          collect(context.getDelta().getSources(addedClass.getReferenceID()), candidates);
          final StringBuilder msg = new StringBuilder();
          msg.append("Possibly duplicated classes in the same compilation chunk; Scheduling for recompilation sources: ");
          for (NodeSource candidate : candidates) {
            context.affectNodeSource(candidate);
            msg.append(candidate).append("; ");
          }
          debug(msg.toString());
          continue; // if duplicates are found, do not perform further checks for classes with the same short name
        }
      }

      String shortName = addedClass.getShortName();
      String scope = addedClass.isInnerClass()? addedClass.getOuterFqName().replace('$', '/') : addedClass.getPackageName();
      debug("Affecting dependencies importing package/class '", scope, "' on-demand and having class-usages with the same short name: '", shortName, "' ");
      context.affectUsage(
        new ImportPackageOnDemandUsage(scope),
        n -> find(n.getUsages(), u -> {
          if (u instanceof ClassUsage || u instanceof MemberUsage) {
            String ownerName = ((JvmElementUsage)u).getElementOwner().getNodeName();
            if (ownerName.endsWith(shortName) && (ownerName.length() == shortName.length() || ownerName.charAt(ownerName.length() - shortName.length() - 1) == '/')) {
              return true;
            }
          }
          return false;
        }) != null
      );
    }

    debug("End of added classes processing.");
    return true;
  }
@Override
  public boolean processAddedClasses(DifferentiateContext context, Iterable<JvmClass> addedClasses, Utils future, Utils present)