extract enum: more accurate already migrated condition (IDEA-143251)

This commit is contained in:
Anna Kozlova
2015-08-18 12:34:37 +02:00
parent 67bfb2b357
commit d016c911ec
8 changed files with 194 additions and 5 deletions
@@ -19,8 +19,10 @@ import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.psi.MutationUtils;
import com.intellij.refactoring.util.FixableUsageInfo;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
@@ -51,13 +53,19 @@ public class ReplaceStaticVariableAccess extends FixableUsageInfo {
}
private boolean alreadyMigratedToEnum() {
final PsiMethodCallExpression callExpression = PsiTreeUtil.getParentOfType(expression, PsiMethodCallExpression.class);
final PsiCallExpression callExpression = PsiTreeUtil.getParentOfType(expression, PsiCallExpression.class);
if (callExpression != null) {
final PsiElement resolved = callExpression.getMethodExpression().resolve();
if (resolved instanceof PsiMethod) {
final PsiParameter[] parameters = ((PsiMethod)resolved).getParameterList().getParameters();
final PsiMethod resolvedMethod = callExpression.resolveMethod();
if (resolvedMethod != null) {
final PsiParameter[] parameters = resolvedMethod.getParameterList().getParameters();
final PsiExpression[] args = callExpression.getArgumentList().getExpressions();
final int idx = ArrayUtilRt.find(args, expression);
int idx = -1;
for (int i = 0; i < args.length; i++) {
if (PsiTreeUtil.isAncestor(args[i], expression, false)) {
idx = i;
break;
}
}
if (idx != -1 && parameters[idx].getType().equalsToText(delegateClass)) {
return true;
}
@@ -89,6 +97,17 @@ public class ReplaceStaticVariableAccess extends FixableUsageInfo {
}
}
}
else {
final PsiBinaryExpression binaryExpression = PsiTreeUtil.getParentOfType(expression, PsiBinaryExpression.class);
if (binaryExpression != null && binaryExpression.getOperationTokenType() == JavaTokenType.EQEQ) {
final PsiExpression[] operands = binaryExpression.getOperands();
final int index = ArrayUtil.find(operands, expression);
if (index >= 0) {
final PsiType type = operands[index].getType();
return type != null && type.equalsToText(delegateClass);
}
}
}
}
}
}
@@ -0,0 +1,12 @@
public enum EEnum {
STATE_STARTED(0), STATE_STOPPED(1);
private int value;
public int getValue() {
return value;
}
EEnum(int value) {
this.value = value;
}
}
@@ -0,0 +1,41 @@
class Test {
private final DebuggerSessionState myState;
public Test() {
myState = new DebuggerSessionState(EEnum.STATE_STOPPED);
}
EEnum getState() {
return myState.myState;
}
void setState(EEnum i) {
}
void b(Test session) {
setState(session != null ? session.getState() : EEnum.STATE_STARTED);
}
{
if (EEnum.STATE_STARTED == getState()) {
System.out.println();
}
}
void a() {
switch (myState.myState) {
case STATE_STARTED:
break;
case STATE_STOPPED:
break;
}
}
private static class DebuggerSessionState {
final EEnum myState;
public DebuggerSessionState(EEnum state) {
myState = state;
}
}
}
@@ -0,0 +1,44 @@
class Test {
private final DebuggerSessionState myState;
public static final int STATE_STARTED = 0;
public static final int STATE_STOPPED = 1;
public Test() {
myState = new DebuggerSessionState(STATE_STOPPED);
}
int getState() {
return myState.myState;
}
void setState(int i) {
}
void b(Test session) {
setState(session != null ? session.getState() : STATE_STARTED);
}
{
if (STATE_STARTED == getState()) {
System.out.println();
}
}
void a() {
switch (myState.myState) {
case STATE_STARTED:
break;
case STATE_STOPPED:
break;
}
}
private static class DebuggerSessionState {
final int myState;
public DebuggerSessionState(int state) {
myState = state;
}
}
}
@@ -0,0 +1,12 @@
public enum EEnum {
STATE_STARTED(0), STATE_STOPPED(1);
private int value;
public int getValue() {
return value;
}
EEnum(int value) {
this.value = value;
}
}
@@ -0,0 +1,24 @@
class Test {
private final DebuggerSessionState myState;
public Test() {
myState = new DebuggerSessionState(EEnum.STATE_STOPPED);
}
void a() {
switch (myState.myState) {
case STATE_STARTED:
break;
case STATE_STOPPED:
break;
}
}
private static class DebuggerSessionState {
final EEnum myState;
public DebuggerSessionState(EEnum state) {
myState = state;
}
}
}
@@ -0,0 +1,27 @@
class Test {
private final DebuggerSessionState myState;
public static final int STATE_STARTED = 0;
public static final int STATE_STOPPED = 1;
public Test() {
myState = new DebuggerSessionState(STATE_STOPPED);
}
void a() {
switch (myState.myState) {
case STATE_STARTED:
break;
case STATE_STOPPED:
break;
}
}
private static class DebuggerSessionState {
final int myState;
public DebuggerSessionState(int state) {
myState = state;
}
}
}
@@ -51,6 +51,16 @@ public class ExtractEnumTest extends MultiFileTestCase {
doTest(new RefactoringTestUtil.MemberDescriptor("FOO", PsiField.class, true),
new RefactoringTestUtil.MemberDescriptor("BAR", PsiField.class, true));
}
public void testConstructorCall() throws Exception {
doTest(new RefactoringTestUtil.MemberDescriptor("STATE_STARTED", PsiField.class, true),
new RefactoringTestUtil.MemberDescriptor("STATE_STOPPED", PsiField.class, true));
}
public void testCondition() throws Exception {
doTest(new RefactoringTestUtil.MemberDescriptor("STATE_STARTED", PsiField.class, true),
new RefactoringTestUtil.MemberDescriptor("STATE_STOPPED", PsiField.class, true));
}
public void testReferencesOnEnumConstantInEnum() throws Exception {
doTest(new RefactoringTestUtil.MemberDescriptor("FOO", PsiField.class, true),