IDEA-173050 Incorrect null analysis of <T extends @NonNull Object>

This commit is contained in:
peter
2017-05-18 19:41:35 +02:00
parent 1c348b9283
commit adeb64da36
2 changed files with 27 additions and 12 deletions

View File

@@ -177,19 +177,27 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
private void checkNullableNotNullInstantiationConflict(PsiJavaCodeReferenceElement reference) {
PsiElement element = reference.resolve();
if (element instanceof PsiClass && ((PsiClass)element).getTypeParameters().length > 0) {
PsiElementFactory factory = JavaPsiFacade.getElementFactory(element.getProject());
if (isNullableNotNullCollectionConflict(reference,
factory.createType((PsiClass)element, PsiSubstitutor.EMPTY),
factory.createType(reference))) {
holder.registerProblem(reference,
"Nullable type arguments where non-null ones are expected",
ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
if (element instanceof PsiClass) {
PsiTypeParameter[] typeParameters = ((PsiClass)element).getTypeParameters();
PsiTypeElement[] typeArguments = getReferenceTypeArguments(reference);
if (typeParameters.length > 0 && typeParameters.length == typeArguments.length) {
for (int i = 0; i < typeParameters.length; i++) {
if (isNullityConflict(JavaPsiFacade.getElementFactory(element.getProject()).createType(typeParameters[i]), typeArguments[i].getType())) {
holder.registerProblem(typeArguments[i],
"Nullable type argument where non-null one is expected",
ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
}
}
}
}
}
private PsiTypeElement[] getReferenceTypeArguments(PsiJavaCodeReferenceElement reference) {
PsiReferenceParameterList typeArgList = reference.getParameterList();
return typeArgList == null ? PsiTypeElement.EMPTY_ARRAY : typeArgList.getTypeParameterElements();
}
@Override
public void visitAssignmentExpression(PsiAssignmentExpression expression) {
checkCollectionNullityOnAssignment(expression.getOperationSign(), expression.getLExpression().getType(), expression.getRExpression());

View File

@@ -3,6 +3,13 @@ import java.util.*;
class MyList<T extends @NotNull Number> extends ArrayList<T> {}
class SubList extends <warning descr="Nullable type arguments where non-null ones are expected">MyList</warning><@Nullable Integer> {
<warning descr="Nullable type arguments where non-null ones are expected">MyList</warning><@Nullable Integer> myList;
}
class SubList extends MyList<<warning descr="Nullable type argument where non-null one is expected">@Nullable Integer</warning>> {
MyList<<warning descr="Nullable type argument where non-null one is expected">@Nullable Integer</warning>> myList;
}
class MyNonNullGenericClass<T extends @NotNull Object> {
public static void test() {
MyNonNullGenericClass<<warning descr="Nullable type argument where non-null one is expected">@Nullable String</warning>> foo = new MyNonNullGenericClass<>();
}
}