From cc25e8d46452bde704bc76da76bd56c2e3801db6 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 27 Nov 2017 17:22:13 +0100 Subject: [PATCH] IG: clone method of singleton does not need to call super (IDEA-182697) --- .../ig/inheritance/RefusedBequestInspectionBase.java | 11 ++++++----- .../src/com/siyeh/ig/psiutils/SingletonUtil.java | 5 +++-- .../refused_bequest/CloneCallsSuperClone.java | 10 ++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/RefusedBequestInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/RefusedBequestInspectionBase.java index f00d5cba95ca..843c2f6ab3a3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/RefusedBequestInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/RefusedBequestInspectionBase.java @@ -24,10 +24,7 @@ import com.siyeh.HardcodedMethodConstants; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.CloneUtils; -import com.siyeh.ig.psiutils.ControlFlowUtils; -import com.siyeh.ig.psiutils.MethodCallUtils; -import com.siyeh.ig.psiutils.MethodUtils; +import com.siyeh.ig.psiutils.*; import com.siyeh.ig.ui.ExternalizableStringSet; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -130,11 +127,15 @@ public class RefusedBequestInspectionBase extends BaseInspection { return; } } - if (onlyReportWhenAnnotated && !CloneUtils.isClone(method) && !isJUnitSetUpOrTearDown(method) && !MethodUtils.isFinalize(method)) { + final boolean isClone = CloneUtils.isClone(method); + if (onlyReportWhenAnnotated && !isClone && !isJUnitSetUpOrTearDown(method) && !MethodUtils.isFinalize(method)) { if (!AnnotationUtil.isAnnotated(leastConcreteSuperMethod, annotations, 0)) { return; } } + if (isClone && SingletonUtil.isSingleton(method.getContainingClass())) { + return; + } if (MethodCallUtils.containsSuperMethodCall(method) || ControlFlowUtils.methodAlwaysThrowsException(method)) { return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SingletonUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SingletonUtil.java index ced68e250ad2..e67dae9d86fe 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SingletonUtil.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SingletonUtil.java @@ -21,6 +21,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.Processor; import com.intellij.util.Query; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; @@ -31,8 +32,8 @@ public class SingletonUtil { private SingletonUtil() {} - public static boolean isSingleton(@NotNull PsiClass aClass) { - if (aClass.isInterface() || aClass.isEnum() || aClass.isAnnotationType()) { + public static boolean isSingleton(@Nullable PsiClass aClass) { + if (aClass == null || aClass.isInterface() || aClass.isEnum() || aClass.isAnnotationType()) { return false; } if (aClass instanceof PsiTypeParameter || aClass instanceof PsiAnonymousClass) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/refused_bequest/CloneCallsSuperClone.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/refused_bequest/CloneCallsSuperClone.java index 3a6370d7c700..bcb94124fe1f 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/refused_bequest/CloneCallsSuperClone.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/refused_bequest/CloneCallsSuperClone.java @@ -49,3 +49,13 @@ class Four { throw new UnsupportedOperationException(); } } +class CloneableSingleton implements Cloneable { + + private static final CloneableSingleton INSTANCE = new CloneableSingleton(); + + private CloneableSingleton() {} + + public CloneableSingleton clone() { + return INSTANCE; + } +} \ No newline at end of file