static boolean containsDeepIn(@NotNull PsiType rootType,
                                @NotNull PsiTypeParameter parameter,
                                @NotNull PsiSubstitutor superClassSubstitutor, boolean ignoreWildcardT) {
    return rootType.accept(new PsiTypeVisitor<>() {
      @Override
      public @NotNull Boolean visitClassType(@NotNull PsiClassType classType) {
        for (PsiType param : classType.getParameters()) {
          if (param.accept(this)) return true;
        }
        return visitType(classType);
      }

      @Override
      public @NotNull Boolean visitArrayType(@NotNull PsiArrayType arrayType) {
        return arrayType.getComponentType().accept(this);
      }

      @Override
      public @NotNull Boolean visitWildcardType(@NotNull PsiWildcardType wildcardType) {
        PsiType bound = wildcardType.getBound();
        if (bound == null) {
          return false;
        }
        if (ignoreWildcardT && typeResolvesTo(bound, parameter, superClassSubstitutor)) return false;
        return bound.accept(this);
      }

      @Override
      public @NotNull Boolean visitType(@NotNull PsiType type) {
        return typeResolvesTo(type, parameter, superClassSubstitutor);
      }
    });
  }
static boolean containsDeepIn(@NotNull PsiType rootType,
                                @NotNull PsiTypeParameter parameter,
                                @NotNull PsiSubstitutor superClassSubstitutor, boolean ignoreWildcardT)