From 3ddf2a2a3a8b8fddb643d03004a8ac7786e6edf5 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 9 Apr 2021 17:55:03 +0200 Subject: [PATCH] IG: don't lose type annotations when replacing clone return type GitOrigin-RevId: 4ed18180ecbea99dfeff8a541c7a0b30c794054d --- .../cloneable/CloneReturnsClassTypeInspection.java | 5 +++-- .../TypeUseAnnotation.after.java | 14 ++++++++++++++ .../change_return_type/TypeUseAnnotation.java | 14 ++++++++++++++ .../cloneable/CloneReturnsClassTypeFixTest.java | 1 + 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/cloneable/CloneReturnsClassTypeInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/cloneable/CloneReturnsClassTypeInspection.java index a38b9e5ebb4f..aa2103406ded 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/cloneable/CloneReturnsClassTypeInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/cloneable/CloneReturnsClassTypeInspection.java @@ -65,7 +65,8 @@ public class CloneReturnsClassTypeInspection extends BaseInspection { if (!(element instanceof PsiTypeElement)) { return; } - final PsiElement parent = element.getParent(); + final PsiTypeElement typeElement = (PsiTypeElement)element; + final PsiElement parent = typeElement.getParent(); if (!(parent instanceof PsiMethod)) { return; } @@ -96,7 +97,7 @@ public class CloneReturnsClassTypeInspection extends BaseInspection { commentTracker); } }); - element.replace(newTypeElement); + typeElement.getFirstChild().replace(newTypeElement.getFirstChild()); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.after.java new file mode 100644 index 000000000000..0f91932a126c --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.after.java @@ -0,0 +1,14 @@ +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +class TypeUseAnnotation implements Cloneable { + + public @NonNull TypeUseAnnotation clone() throws CloneNotSupportedException { + return (TypeUseAnnotation) super.clone(); + } +} +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE_USE}) +@interface NonNull {} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.java new file mode 100644 index 000000000000..66e7d9363242 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/cloneable/change_return_type/TypeUseAnnotation.java @@ -0,0 +1,14 @@ +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +class TypeUseAnnotation implements Cloneable { + + public @NonNull Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE_USE}) +@interface NonNull {} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/cloneable/CloneReturnsClassTypeFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/cloneable/CloneReturnsClassTypeFixTest.java index 159c15bc8778..bad38b0d378a 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/cloneable/CloneReturnsClassTypeFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/cloneable/CloneReturnsClassTypeFixTest.java @@ -18,6 +18,7 @@ public class CloneReturnsClassTypeFixTest extends IGQuickFixesTestCase { public void testSimple() { doTest("Change return type to 'Simple'"); } public void testReturnNull() { doTest("Change return type to 'ReturnNull'"); } + public void testTypeUseAnnotation() { doTest("Change return type to 'TypeUseAnnotation'"); } public void testCast() { doTest("Change return type to 'Cast'"); } public void testAnonymousClass() { doTest("Change return type to 'B'"); } public void testNested() { doTest("Change return type to 'Nested'"); }