mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 06:39:38 +07:00
IDEA-173050 Incorrect null analysis of <T extends @NonNull Object>
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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<>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user