@Contract("null, _ -> null")
  private @Nullable NullabilityAnnotationInfo findAnnotationInTypeHierarchy(@Nullable PsiType type,
                                                                            @NotNull NullabilityAnnotationDataHolder qualifiedNames) {
    if (type == null) return null;
    Ref<NullabilityAnnotationInfo> result = Ref.create(null);
    InheritanceUtil.processSuperTypes(type, true, eachType -> {
      for (PsiAnnotation annotation : eachType.getAnnotations()) {
        String qualifiedName = annotation.getQualifiedName();
        if (qualifiedNames.qualifiedNames().contains(qualifiedName)) {
          Nullability nullability = qualifiedNames.getNullability(qualifiedName);
          if (nullability != null) {
            nullability = correctNullability(nullability, annotation);
            result.set(new NullabilityAnnotationInfo(annotation, nullability, false));
          }
          return false;
        }
      }
      if (!(eachType instanceof PsiClassType)) return true;
      PsiClass targetClass = PsiUtil.resolveClassInClassTypeOnly(eachType);
      if (!(targetClass instanceof PsiTypeParameter)) return false;
      if (targetClass.getExtendsListTypes().length == 0) {
        NullabilityAnnotationInfo info = findNullabilityDefault(targetClass, PsiAnnotation.TargetType.TYPE_PARAMETER);
        if (info != null) {
          result.set(info);
          return false;
        }
      }
      return true;
    });
    return result.get();
  }
@Contract("null, _ -> null")
  private @Nullable NullabilityAnnotationInfo findAnnotationInTypeHierarchy(@Nullable PsiType type,
                                                                            @NotNull NullabilityAnnotationDataHolder qualifiedNames)