mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
do not warn about side effects on simple getter/setter (IDEA-65545)
This commit is contained in:
+6
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user