IG: clone method of singleton does not need to call super (IDEA-182697)

This commit is contained in:
Bas Leijdekkers
2017-11-28 19:26:50 +01:00
parent f63e53482b
commit cc25e8d464
3 changed files with 19 additions and 7 deletions
@@ -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;
}
@@ -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) {
@@ -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;
}
}