mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
type migration: use side effect checker in type migration to void
This commit is contained in:
+14
-40
@@ -15,15 +15,13 @@
|
||||
*/
|
||||
package com.intellij.refactoring.typeMigration.rules;
|
||||
|
||||
import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.PsiElementProcessor;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase;
|
||||
import com.intellij.refactoring.typeMigration.TypeEvaluator;
|
||||
import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.siyeh.ig.controlflow.UnnecessaryReturnInspection;
|
||||
import com.siyeh.ig.psiutils.SideEffectChecker;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -38,46 +36,22 @@ public class VoidConversionRule extends TypeConversionRule {
|
||||
PsiMember member,
|
||||
PsiExpression context,
|
||||
TypeMigrationLabeler labeler) {
|
||||
if (PsiType.VOID.equals(to) && context.getParent() instanceof PsiReturnStatement) {
|
||||
final boolean isPure = PsiTreeUtil.processElements(context, new PsiElementProcessor() {
|
||||
if (PsiType.VOID.equals(to) &&
|
||||
context.getParent() instanceof PsiReturnStatement &&
|
||||
!SideEffectChecker.mayHaveSideEffects(context)) {
|
||||
return new TypeConversionDescriptorBase() {
|
||||
@Override
|
||||
public boolean execute(@NotNull PsiElement element) {
|
||||
if (element instanceof PsiPrefixExpression) {
|
||||
return analyzeUnaryExpressionOperand(((PsiPrefixExpression)element).getOperand());
|
||||
}
|
||||
if (element instanceof PsiPostfixExpression) {
|
||||
return analyzeUnaryExpressionOperand(((PsiPostfixExpression)element).getOperand());
|
||||
}
|
||||
if (element instanceof PsiMethodCallExpression) {
|
||||
final PsiMethod method = ((PsiMethodCallExpression)element).resolveMethod();
|
||||
return method != null && ControlFlowAnalyzer.isPure(method);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean analyzeUnaryExpressionOperand(PsiExpression operand) {
|
||||
if (!(operand instanceof PsiReferenceExpression)) return false;
|
||||
final PsiElement resolved = ((PsiReferenceExpression)operand).resolve();
|
||||
return !(resolved instanceof PsiField);
|
||||
}
|
||||
});
|
||||
if (isPure) {
|
||||
return new TypeConversionDescriptorBase() {
|
||||
@Override
|
||||
public PsiExpression replace(PsiExpression expression, @NotNull TypeEvaluator evaluator) throws IncorrectOperationException {
|
||||
final PsiElement parent = expression.getParent();
|
||||
if (parent instanceof PsiReturnStatement) {
|
||||
expression.delete();
|
||||
if (UnnecessaryReturnInspection.isReturnRedundant((PsiReturnStatement)parent, false, null)) {
|
||||
parent.delete();
|
||||
}
|
||||
public PsiExpression replace(PsiExpression expression, @NotNull TypeEvaluator evaluator) throws IncorrectOperationException {
|
||||
final PsiElement parent = expression.getParent();
|
||||
if (parent instanceof PsiReturnStatement) {
|
||||
expression.delete();
|
||||
if (UnnecessaryReturnInspection.isReturnRedundant((PsiReturnStatement)parent, false, null)) {
|
||||
parent.delete();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user