private static boolean checkFieldEquivalence(Object o1, Object o2, String key, int depth, @NotNull Class<?> pluginClass) {
    if (depth > 100) {
      complain("Too deep function delegation inside CachedValueProvider. If you have cyclic dependencies, please remove them.", key, pluginClass);
      return false;
    }

    for (Field field : ourFieldCache.get(o1.getClass())) {
      Object v1;
      Object v2;
      try {
        field.setAccessible(true);
        v1 = field.get(o1);
        v2 = field.get(o2);
      }
      catch (Exception e) {
        throw new UnsupportedOperationException("Please allow full reflective access");
      }

      if (areEqual(v1, v2)) continue;

      if (v1 != null && v2 != null && seemConcurrentlyCreatedLambdas(v1.getClass(), v2.getClass())) {
        continue;
      }

      if (v1 != null && v2 != null && v1.getClass() == v2.getClass() && shouldGoDeeper(v1)) {
        if (!checkFieldEquivalence(v1, v2, key, depth + 1, v1.getClass())) {
          return false;
        }
      } else {
        complain(nonEquivalence(o1.getClass(), field, v1, v2), key, pluginClass);
        return false;
      }
    }
    return true;
  }
private static boolean checkFieldEquivalence(Object o1, Object o2, String key, int depth, @NotNull Class<?> pluginClass)