do not warn about side effects on simple getter/setter (IDEA-65545)

This commit is contained in:
anna
2011-03-14 17:02:10 +01:00
parent cb21030fa8
commit f95be40d78
7 changed files with 182 additions and 183 deletions
@@ -30,6 +30,7 @@ import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.refactoring.psi.PropertyUtils;
import com.intellij.util.IncorrectOperationException;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
@@ -290,8 +291,11 @@ public class RemoveUnusedVariableFix implements IntentionAction {
public static boolean checkSideEffects(PsiElement element, PsiVariable variable, List<PsiElement> sideEffects) {
if (sideEffects == null || element == null) return false;
if (element instanceof PsiMethodCallExpression) {
sideEffects.add(element);
return true;
final PsiMethod psiMethod = ((PsiMethodCallExpression)element).resolveMethod();
if (psiMethod == null || !PropertyUtils.isSimpleGetter(psiMethod) && !PropertyUtils.isSimpleSetter(psiMethod)) {
sideEffects.add(element);
return true;
}
}
if (element instanceof PsiNewExpression) {
PsiNewExpression newExpression = (PsiNewExpression)element;
@@ -16,11 +16,11 @@
package com.intellij.refactoring.psi;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PropertyUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
public class PropertyUtils {
private PropertyUtils() {
@@ -41,4 +41,166 @@ public class PropertyUtils {
final boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC);
return PropertyUtil.findPropertyGetter(containingClass, propertyName, isStatic, true);
}
@Nullable
public static PsiField getFieldOfGetter(PsiMethod method) {
if (method == null) {
return null;
}
final PsiParameterList parameterList = method.getParameterList();
if (parameterList.getParametersCount() != 0) {
return null;
}
@NonNls final String name = method.getName();
if (!name.startsWith("get") && !name.startsWith("is")) {
return null;
}
if (method.hasModifierProperty(PsiModifier.SYNCHRONIZED)) {
return null;
}
final PsiCodeBlock body = method.getBody();
if (body == null) {
return null;
}
final PsiStatement[] statements = body.getStatements();
if (statements.length != 1) {
return null;
}
final PsiStatement statement = statements[0];
if (!(statement instanceof PsiReturnStatement)) {
return null;
}
final PsiReturnStatement returnStatement =
(PsiReturnStatement)statement;
final PsiExpression value = returnStatement.getReturnValue();
if (value == null) {
return null;
}
if (!(value instanceof PsiReferenceExpression)) {
return null;
}
final PsiReferenceExpression reference = (PsiReferenceExpression)value;
final PsiExpression qualifier = reference.getQualifierExpression();
if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
return null;
}
final PsiElement referent = reference.resolve();
if (referent == null) {
return null;
}
if (!(referent instanceof PsiField)) {
return null;
}
final PsiField field = (PsiField)referent;
final PsiType fieldType = field.getType();
final PsiType returnType = method.getReturnType();
if (returnType == null) {
return null;
}
if (!fieldType.equalsToText(returnType.getCanonicalText())) {
return null;
}
final PsiClass fieldContainingClass = field.getContainingClass();
final PsiClass methodContainingClass = method.getContainingClass();
if (InheritanceUtil.isInheritorOrSelf(methodContainingClass, fieldContainingClass, true)) {
return field;
}
else {
return null;
}
}
public static boolean isSimpleGetter(PsiMethod method) {
return getFieldOfGetter(method) != null;
}
@Nullable
public static PsiField getFieldOfSetter(PsiMethod method) {
if (method == null) {
return null;
}
final PsiParameterList parameterList = method.getParameterList();
if (parameterList.getParametersCount() != 1) {
return null;
}
@NonNls final String name = method.getName();
if (!name.startsWith("set")) {
return null;
}
if (method.hasModifierProperty(PsiModifier.SYNCHRONIZED)) {
return null;
}
final PsiCodeBlock body = method.getBody();
if (body == null) {
return null;
}
final PsiStatement[] statements = body.getStatements();
if (statements.length != 1) {
return null;
}
final PsiStatement statement = statements[0];
if (!(statement instanceof PsiExpressionStatement)) {
return null;
}
final PsiExpressionStatement possibleAssignmentStatement = (PsiExpressionStatement)statement;
final PsiExpression possibleAssignment = possibleAssignmentStatement.getExpression();
if (!(possibleAssignment instanceof PsiAssignmentExpression)) {
return null;
}
final PsiAssignmentExpression assignment = (PsiAssignmentExpression)possibleAssignment;
final PsiJavaToken sign = assignment.getOperationSign();
if (!JavaTokenType.EQ.equals(sign.getTokenType())) {
return null;
}
final PsiExpression lhs = assignment.getLExpression();
if (!(lhs instanceof PsiReferenceExpression)) {
return null;
}
final PsiReferenceExpression reference = (PsiReferenceExpression)lhs;
final PsiExpression qualifier = reference.getQualifierExpression();
if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
return null;
}
final PsiElement referent = reference.resolve();
if (referent == null) {
return null;
}
if (!(referent instanceof PsiField)) {
return null;
}
final PsiField field = (PsiField)referent;
final PsiClass fieldContainingClass = field.getContainingClass();
final PsiClass methodContainingClass = method.getContainingClass();
if (!InheritanceUtil.isInheritorOrSelf(methodContainingClass, fieldContainingClass, true)) {
return null;
}
final PsiExpression rhs = assignment.getRExpression();
if (!(rhs instanceof PsiReferenceExpression)) {
return null;
}
final PsiReferenceExpression rReference = (PsiReferenceExpression)rhs;
final PsiExpression rQualifier = rReference.getQualifierExpression();
if (rQualifier != null) {
return null;
}
final PsiElement rReferent = rReference.resolve();
if (rReferent == null) {
return null;
}
if (!(rReferent instanceof PsiParameter)) {
return null;
}
final PsiType fieldType = field.getType();
final PsiType parameterType = ((PsiVariable)rReferent).getType();
if (fieldType.equalsToText(parameterType.getCanonicalText())) {
return field;
}
else {
return null;
}
}
public static boolean isSimpleSetter(PsiMethod method) {
return getFieldOfSetter(method) != null;
}
}