void (@NotNull PsiTypeElement typeElement) { super.visitTypeElement(typeElement); final PsiType type = typeElement.getType(); if (!(type instanceof PsiWildcardType wildcardType)) { return; } final PsiType extendsBound = wildcardType.getExtendsBound(); if (!(extendsBound instanceof PsiClassType classType)) { return; } for (PsiType typeParameter : classType.getParameters()) { if (typeParameter instanceof PsiWildcardType) { // if nested type has wildcard type parameter too, leave it return; } } final PsiClass aClass = classType.resolve(); if (aClass == null) { return; } if (!aClass.hasModifierProperty(PsiModifier.FINAL) && !aClass.isEnum()) { return; } if (aClass.hasTypeParameters() && !PsiUtil.isLanguageLevel8OrHigher(typeElement)) { final PsiType[] parameters = classType.getParameters(); if (parameters.length == 0) { return; } for (PsiType parameter : parameters) { if (parameter instanceof PsiWildcardType) { return; } } } if (isWildcardRequired(typeElement)) { return; } registerError(typeElement.getFirstChild(), aClass, Integer.valueOf(2)); }