PsiType (final PsiType type, final GrExpression expression, final GrExpression topLevel) { if (type instanceof PsiCapturedWildcardType) { return doNormalizeWildcardByPosition(((PsiCapturedWildcardType)type).getUpperBound(), expression, topLevel); } if (type instanceof PsiWildcardType wildcardType) { if (PsiUtil.isAccessedForWriting(topLevel)) { return wildcardType.getBound(); } else { if (wildcardType.isExtends()) { return wildcardType.getBound(); } else { return TypesUtil.getJavaLangObject(expression); } } } else if (type instanceof PsiArrayType) { final PsiType componentType = ((PsiArrayType)type).getComponentType(); final PsiType normalizedComponentType = doNormalizeWildcardByPosition(componentType, expression, topLevel); if (normalizedComponentType != componentType) { assert normalizedComponentType != null; return normalizedComponentType.createArrayType(); } } return type; }