From f344906e7bbfe645ffd1cdaa2c1c397aed1707fc Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 31 Mar 2020 17:45:07 +0700 Subject: [PATCH] IDEA-174043 Implement method with @NotNull/@Nullable array return type GitOrigin-RevId: a539db556458ab54411d9b87c40d20e58954382e --- .../generation/GenerateMembersUtil.java | 6 +++++ .../afterTypeNullabilityAnnotations.java | 27 +++++++++++++++++++ .../beforeTypeNullabilityAnnotations.java | 17 ++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterTypeNullabilityAnnotations.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeTypeNullabilityAnnotations.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 12dad50838ed..8ddf52f1c08e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -274,6 +274,12 @@ public class GenerateMembersUtil { PsiSubstitutor collisionResolvedSubstitutor = substituteTypeParameters(factory, target, sourceMethod.getTypeParameterList(), resultMethod.getTypeParameterList(), substitutor, sourceMethod); substituteReturnType(PsiManager.getInstance(project), resultMethod, sourceMethod.getReturnType(), collisionResolvedSubstitutor); + PsiTypeElement typeElement = resultMethod.getReturnTypeElement(); + if (typeElement != null && typeElement.getText().startsWith("@")) { + // If return type is annotated, substituteReturnType will add the annotation into type element, + // so the method should be reparsed to move it to the modifier list + resultMethod = factory.createMethodFromText(resultMethod.getText(), target); + } substituteParameters(factory, codeStyleManager, sourceMethod.getParameterList(), resultMethod.getParameterList(), collisionResolvedSubstitutor, target); copyDocComment(sourceMethod, resultMethod, factory); GlobalSearchScope scope = sourceMethod.getResolveScope(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterTypeNullabilityAnnotations.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterTypeNullabilityAnnotations.java new file mode 100644 index 000000000000..1ac7597dbc54 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterTypeNullabilityAnnotations.java @@ -0,0 +1,27 @@ +// "Implement methods" "true" +package org.jetbrains.annotations; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD, ElementType.TYPE_USE}) +@interface Nullable{} + +@Target({ElementType.METHOD, ElementType.TYPE_USE}) +@interface NotNull{} + +interface A { + @Nullable Object @NotNull [] getNotNullArrayOfNullableObjects(); + @NotNull Object @Nullable [] getNullableArrayOfNotNullObjects(); +} + +class B implements A { + @Override + public @Nullable Object @NotNull [] getNotNullArrayOfNullableObjects() { + return new Object[0]; + } + + @Override + public @NotNull Object @Nullable [] getNullableArrayOfNotNullObjects() { + return new Object[0]; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeTypeNullabilityAnnotations.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeTypeNullabilityAnnotations.java new file mode 100644 index 000000000000..061096d240f7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeTypeNullabilityAnnotations.java @@ -0,0 +1,17 @@ +// "Implement methods" "true" +package org.jetbrains.annotations; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD, ElementType.TYPE_USE}) +@interface Nullable{} + +@Target({ElementType.METHOD, ElementType.TYPE_USE}) +@interface NotNull{} + +interface A { + @Nullable Object @NotNull [] getNotNullArrayOfNullableObjects(); + @NotNull Object @Nullable [] getNullableArrayOfNotNullObjects(); +} + +class B implements A {} \ No newline at end of file