diff --git a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java index c8ee30e64cc1..fab71b6f530f 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java @@ -112,9 +112,11 @@ public abstract class NullableNotNullManager { @Nullable public PsiAnnotation copyNullableOrNotNullAnnotation(@NotNull PsiModifierListOwner original, @NotNull PsiModifierListOwner generated) { - NullabilityAnnotationInfo info = findOwnNullabilityInfo(original); - if (info == null) return null; - return copyAnnotation(info.getAnnotation(), generated); + NullabilityAnnotationInfo src = findOwnNullabilityInfo(original); + if (src == null) return null; + NullabilityAnnotationInfo effective = findEffectiveNullabilityInfo(generated); + if (effective != null && effective.getNullability() == src.getNullability()) return null; + return copyAnnotation(src.getAnnotation(), generated); } @Nullable diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java b/java/java-tests/testData/codeInsight/generateConstructor/afterParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java new file mode 100644 index 000000000000..50e3954c3a77 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java @@ -0,0 +1,10 @@ +@foo.NonnullByDefault +class C { + Object o; + @javax.annotation.Nonnull String s; + + public C(Object o, String s) { + this.o = o; + this.s = s; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateConstructor/beforeParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java b/java/java-tests/testData/codeInsight/generateConstructor/beforeParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java new file mode 100644 index 000000000000..43fde758cd90 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/beforeParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation.java @@ -0,0 +1,6 @@ +@foo.NonnullByDefault +class C { + Object o; + @javax.annotation.Nonnull String s; + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateConstructorTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateConstructorTest.java index 998f72d83122..96db965cacc2 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateConstructorTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/GenerateConstructorTest.java @@ -19,6 +19,7 @@ import com.intellij.JavaTestUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.generation.ClassMember; import com.intellij.codeInsight.generation.GenerateConstructorHandler; +import com.intellij.java.codeInspection.DataFlowInspectionTest; import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -92,6 +93,16 @@ public class GenerateConstructorTest extends LightCodeInsightFixtureTestCase { doTest(); } + public void testParametersForFieldsNotNullByDefaultShouldNotGetExplicitAnnotation() { + DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); + myFixture.addClass("package foo;" + + "import static java.lang.annotation.ElementType.*;" + + "@javax.annotation.meta.TypeQualifierDefault({PARAMETER, FIELD, METHOD, LOCAL_VARIABLE}) " + + "@javax.annotation.Nonnull " + + "public @interface NonnullByDefault {}"); + doTest(); + } + public void testNullableField() { doTest(); } private void doTest() {