generic array creation: check if component type is reifiable (IDEA-91743)

This commit is contained in:
anna
2012-09-18 16:09:45 +02:00
parent 66502219aa
commit 51afcf78dc
2 changed files with 22 additions and 18 deletions
@@ -874,23 +874,10 @@ public class GenericsHighlightUtil {
@Nullable
public static HighlightInfo checkGenericArrayCreation(PsiElement element, PsiType type) {
if (type instanceof PsiArrayType) {
PsiType componentType = type.getDeepComponentType();
if (componentType instanceof PsiClassType) {
final PsiClassType classType = (PsiClassType)componentType;
PsiType[] parameters = classType.getParameters();
for (PsiType parameter : parameters) {
if (!(parameter instanceof PsiWildcardType) || ((PsiWildcardType)parameter).getBound() != null) {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR,
element,
JavaErrorMessages.message("generic.array.creation"));
}
}
final PsiClass resolved = ((PsiClassType)PsiUtil.convertAnonymousToBaseType(classType)).resolve();
if (resolved instanceof PsiTypeParameter) {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR,
element,
JavaErrorMessages.message("generic.array.creation"));
}
if (!isReifiableType(((PsiArrayType)type).getComponentType())) {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR,
element,
JavaErrorMessages.message("generic.array.creation"));
}
}
@@ -1179,7 +1166,18 @@ public class GenericsHighlightUtil {
if (resolved instanceof PsiTypeParameter) {
return false;
}
return parameters.length == 0;
if (parameters.length == 0) {
if (resolved != null) {
final PsiClass containingClass = resolved.getContainingClass();
if (containingClass != null) {
final PsiTypeParameter[] containingClassTypeParameters = containingClass.getTypeParameters();
if (containingClassTypeParameters.length > 0) {
return false;
}
}
}
return true;
}
}
return false;
@@ -138,4 +138,10 @@ class ClassLiteral<T> {
Object c5 = List[].class;
Object c6 = List.class;
}
}
class Outer<E> {
final Inner[] i = <error descr="Generic array creation">new Inner[10]</error>;
class Inner {
}
}