From dae504e27f623f9960da881218771c99facec57a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 16 Nov 2015 19:06:34 +0100 Subject: [PATCH] IG: ignore casts to concrete class inside equals() and clone() methods (IDEA-148010) --- .../CastToConcreteClassInspection.java | 21 ++++++++----------- .../CastToConcreteClass.html | 6 ++---- .../CastToConcreteClass.java | 5 +++++ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/CastToConcreteClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/CastToConcreteClassInspection.java index 7aed6e23badd..05beec35ecf7 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/CastToConcreteClassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/CastToConcreteClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.psi.util.PsiTreeUtil; 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.MethodUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -33,7 +34,7 @@ public class CastToConcreteClassInspection extends BaseInspection { public boolean ignoreAbstractClasses = false; @SuppressWarnings("PublicField") - public boolean ignoreInEquals = true; + public boolean ignoreInEquals = true; // keep for compatibility @Override @NotNull @@ -73,11 +74,9 @@ public class CastToConcreteClassInspection extends BaseInspection { if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, ignoreAbstractClasses)) { return; } - if (ignoreInEquals) { - final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class, PsiLambdaExpression.class); - if (MethodUtils.isEquals(method)) { - return; - } + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class, PsiLambdaExpression.class); + if (MethodUtils.isEquals(method) || CloneUtils.isClone(method)) { + return; } registerError(typeElement, typeElement.getType()); } @@ -116,11 +115,9 @@ public class CastToConcreteClassInspection extends BaseInspection { if (!ConcreteClassUtil.typeIsConcreteClass(parameter, ignoreAbstractClasses)) { return; } - if (ignoreInEquals) { - final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class, PsiLambdaExpression.class); - if (MethodUtils.isEquals(method)) { - return; - } + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class, PsiLambdaExpression.class); + if (MethodUtils.isEquals(method) || CloneUtils.isClone(method)) { + return; } registerMethodCallError(expression, parameter); } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/CastToConcreteClass.html b/plugins/InspectionGadgets/src/inspectionDescriptions/CastToConcreteClass.html index 1ae40923ea45..503c2af6c0d2 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/CastToConcreteClass.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/CastToConcreteClass.html @@ -2,12 +2,10 @@ Reports casting a value to a concrete class, rather than an interface. Such declarations may represent a failure of abstraction, and may make testing more difficult. -Declarations whose classes come from system or third-party libraries will not be reported by this inspection. +Casts to system or library classes and casts inside equals() and clone() methods will not be reported by this inspection.

-Use the first checkbox below to have this inspection ignore casts to abstract classes. -

-Use the second checkbox below to have this inspection ignore casts inside equals() methods. +Use the checkbox below to have this inspection ignore casts to abstract classes.

diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/cast_to_concrete_class/CastToConcreteClass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/cast_to_concrete_class/CastToConcreteClass.java index 7e9f8ef1e54a..aa6ce961a68e 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/cast_to_concrete_class/CastToConcreteClass.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/cast_to_concrete_class/CastToConcreteClass.java @@ -14,6 +14,11 @@ class CastToConcreteClass { } } + @Override + public CastToConcreteClass clone() throws CloneNotSupportedException { + return (CastToConcreteClass) super.clone(); + } + void foo(Object o) { CastToConcreteClass c = (CastToConcreteClass)o; CastToConcreteClass c2 = CastToConcreteClass.class.cast(o);