diff --git a/java/java-impl/src/com/intellij/codeInsight/annoPackages/CheckerFrameworkSupport.java b/java/java-impl/src/com/intellij/codeInsight/annoPackages/CheckerFrameworkSupport.java index 45d3df47c6e8..7144422c307a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/annoPackages/CheckerFrameworkSupport.java +++ b/java/java-impl/src/com/intellij/codeInsight/annoPackages/CheckerFrameworkSupport.java @@ -29,10 +29,21 @@ class CheckerFrameworkSupport implements AnnotationPackageSupport { @NotNull PsiElement context, PsiAnnotation.TargetType @NotNull [] types, boolean superPackage) { + if (context instanceof PsiTypeParameter) { + // DefaultQualifier is not applicable to type parameter declarations + return null; + } if (anno.hasQualifiedName(DEFAULT_QUALIFIER)) { PsiAnnotationMemberValue value = anno.findAttributeValue(PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME); if (value instanceof PsiClassObjectAccessExpression && hasAppropriateTarget(types, anno.findAttributeValue("locations"))) { + PsiType type = context instanceof PsiMethod ? ((PsiMethod)context).getReturnType() : + context instanceof PsiVariable ? ((PsiVariable)context).getType() : + null; + if (type instanceof PsiClassType && ((PsiClassType)type).resolve() instanceof PsiTypeParameter) { + // DefaultQualifier is not applicable to type parameter uses + return null; + } PsiClass valueClass = PsiUtil.resolveClassInClassTypeOnly(((PsiClassObjectAccessExpression)value).getOperand().getType()); if (valueClass != null) { NullableNotNullManager instance = NullableNotNullManager.getInstance(value.getProject()); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/CheckerNullityTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInspection/CheckerNullityTest.groovy index 3a226da792dc..4999a5ff229c 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/CheckerNullityTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/CheckerNullityTest.groovy @@ -134,4 +134,20 @@ class Test { assert NullableNotNullManager.isNullable(clazz.methods[1]) } + void "test type parameter use"() { + def clazz = myFixture.addClass """ +import org.checkerframework.checker.nullness.qual.*; +import org.checkerframework.framework.qual.*; + +@DefaultQualifier(NonNull.class) +interface Test { + String test(X x); + X test(String x); +}""" + assert NullableNotNullManager.isNotNull(clazz.methods[0]) + assert !NullableNotNullManager.isNotNull(clazz.methods[1]) + assert !NullableNotNullManager.isNotNull(clazz.methods[0].parameterList.parameters[0]) + assert NullableNotNullManager.isNotNull(clazz.methods[1].parameterList.parameters[0]) + } + }