From eb50c82b985a090b7c57add19e3a1002f9091782 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 26 Aug 2015 22:14:18 +0300 Subject: [PATCH] extract class: don't expand postfix expressions when no getter/setters were generated (IDEA-144369) --- .../ReplaceInstanceVariableIncrementDecrement.java | 14 ++++++-------- .../extractClass/increment/after/Extracted.java | 6 ++++++ .../extractClass/increment/after/Test.java | 7 +++++++ .../extractClass/increment/before/Test.java | 6 ++++++ .../com/intellij/refactoring/ExtractClassTest.java | 10 ++++++++++ .../refactoring/BaseRefactoringProcessor.java | 3 ++- 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractClass/increment/after/Extracted.java create mode 100644 java/java-tests/testData/refactoring/extractClass/increment/after/Test.java create mode 100644 java/java-tests/testData/refactoring/extractClass/increment/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceInstanceVariableIncrementDecrement.java b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceInstanceVariableIncrementDecrement.java index c6417d6f9faf..4bbada415f8c 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceInstanceVariableIncrementDecrement.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceInstanceVariableIncrementDecrement.java @@ -63,14 +63,12 @@ public class ReplaceInstanceVariableIncrementDecrement extends FixableUsageInfo final PsiElement qualifier = lhs.getQualifier(); final String operator = sign.getText(); final String newExpression; - final String strippedOperator = getStrippedOperator(operator); - if (qualifier != null) { - final String qualifierText = qualifier.getText(); - newExpression = qualifierText + '.' + delegateName + '.' + - callSetter(qualifierText + '.' + delegateName + '.' + callGetter() + strippedOperator + "1"); - } - else { - newExpression = delegateName + '.' + callSetter(delegateName + '.' + callGetter() + strippedOperator + "1"); + if (getterName == null && setterName == null) { + newExpression = (qualifier != null ? qualifier.getText() + "." : "") + delegateName + "." + fieldName + operator; + } else { + final String strippedOperator = getStrippedOperator(operator); + newExpression = (qualifier != null ? qualifier.getText() + "." : "") + delegateName + + '.' + callSetter(delegateName + '.' + callGetter() + strippedOperator + "1"); } MutationUtils.replaceExpression(newExpression, reference); } diff --git a/java/java-tests/testData/refactoring/extractClass/increment/after/Extracted.java b/java/java-tests/testData/refactoring/extractClass/increment/after/Extracted.java new file mode 100644 index 000000000000..2ab16df49102 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractClass/increment/after/Extracted.java @@ -0,0 +1,6 @@ +public class Extracted { + public int myT = 7; + + public Extracted() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractClass/increment/after/Test.java b/java/java-tests/testData/refactoring/extractClass/increment/after/Test.java new file mode 100644 index 000000000000..a44bb968378d --- /dev/null +++ b/java/java-tests/testData/refactoring/extractClass/increment/after/Test.java @@ -0,0 +1,7 @@ +class Test { + public final Extracted extracted = new Extracted(); + + void foo() { + if (extracted.myT++ == 7){} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractClass/increment/before/Test.java b/java/java-tests/testData/refactoring/extractClass/increment/before/Test.java new file mode 100644 index 000000000000..3a759dbb2e6a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractClass/increment/before/Test.java @@ -0,0 +1,6 @@ +class Test { + public int myT = 7; + void foo() { + if (myT++ == 7){} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java index e476963b1c3c..a3a87316f1cc 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java @@ -90,6 +90,16 @@ public class ExtractClassTest extends MultiFileTestCase{ public void testFieldReference() throws Exception { doTestMethod("foo", "Field 'myField' needs getter"); } + + public void testIncrement() throws Exception { + try { + BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(true); + doTestField(null, false); + } + finally { + BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(false); + } + } public void testVarargs() throws Exception { doTestMethod(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java index 2fc4eafc85f2..bce7d70f4087 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java @@ -599,7 +599,8 @@ public abstract class BaseRefactoringProcessor implements Runnable { protected boolean showConflicts(@NotNull MultiMap conflicts, @Nullable final UsageInfo[] usages) { if (!conflicts.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { - throw new ConflictsInTestsException(conflicts.values()); + if (!ConflictsInTestsException.isTestIgnore()) throw new ConflictsInTestsException(conflicts.values()); + return true; } if (myPrepareSuccessfulSwingThreadCallback != null && !conflicts.isEmpty()) {