From d016c911ec714a64ecfdae641e268e5ad7ba9fe7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 18 Aug 2015 12:13:42 +0200 Subject: [PATCH] extract enum: more accurate already migrated condition (IDEA-143251) --- .../ReplaceStaticVariableAccess.java | 29 +++++++++--- .../extractEnum/condition/after/EEnum.java | 12 +++++ .../extractEnum/condition/after/Test.java | 41 +++++++++++++++++ .../extractEnum/condition/before/Test.java | 44 +++++++++++++++++++ .../constructorCall/after/EEnum.java | 12 +++++ .../constructorCall/after/Test.java | 24 ++++++++++ .../constructorCall/before/Test.java | 27 ++++++++++++ .../intellij/refactoring/ExtractEnumTest.java | 10 +++++ 8 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractEnum/condition/after/EEnum.java create mode 100644 java/java-tests/testData/refactoring/extractEnum/condition/after/Test.java create mode 100644 java/java-tests/testData/refactoring/extractEnum/condition/before/Test.java create mode 100644 java/java-tests/testData/refactoring/extractEnum/constructorCall/after/EEnum.java create mode 100644 java/java-tests/testData/refactoring/extractEnum/constructorCall/after/Test.java create mode 100644 java/java-tests/testData/refactoring/extractEnum/constructorCall/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java index 21dd70c9d0d0..613454f6e092 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java @@ -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); + } + } + } } } } diff --git a/java/java-tests/testData/refactoring/extractEnum/condition/after/EEnum.java b/java/java-tests/testData/refactoring/extractEnum/condition/after/EEnum.java new file mode 100644 index 000000000000..aca27f8dc797 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/condition/after/EEnum.java @@ -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; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractEnum/condition/after/Test.java b/java/java-tests/testData/refactoring/extractEnum/condition/after/Test.java new file mode 100644 index 000000000000..4dfc2b03177e --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/condition/after/Test.java @@ -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; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractEnum/condition/before/Test.java b/java/java-tests/testData/refactoring/extractEnum/condition/before/Test.java new file mode 100644 index 000000000000..0f91f5deb3ce --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/condition/before/Test.java @@ -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; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/EEnum.java b/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/EEnum.java new file mode 100644 index 000000000000..aca27f8dc797 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/EEnum.java @@ -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; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/Test.java b/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/Test.java new file mode 100644 index 000000000000..4af0db40be02 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/constructorCall/after/Test.java @@ -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; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractEnum/constructorCall/before/Test.java b/java/java-tests/testData/refactoring/extractEnum/constructorCall/before/Test.java new file mode 100644 index 000000000000..886d54107d55 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractEnum/constructorCall/before/Test.java @@ -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; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractEnumTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractEnumTest.java index 174e6c554053..818d1656f3ec 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractEnumTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractEnumTest.java @@ -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),