From e5483825a73d7bd433b3ffe479929078b7fd2a30 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 23 May 2018 17:51:25 +0300 Subject: [PATCH] introduce field/constant: fix array initializer (IDEA-135785) --- .../BaseExpressionToFieldHandler.java | 3 +-- .../introduceField/ElementToWorkOn.java | 20 +++++++++++++++++++ .../IntroduceConstantHandler.java | 13 +++--------- .../introduceField/IntroduceFieldHandler.java | 13 +++--------- .../IntroduceVariableBase.java | 12 +++++++++-- .../arrayInitializer.java | 5 +++++ .../arrayInitializer_after.java | 9 +++++++++ .../InplaceIntroduceFieldTest.java | 9 +++++++++ 8 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index c1bdf3a72714..2db9156c1acb 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -27,7 +27,6 @@ import com.intellij.ide.util.DirectoryChooserUtil; import com.intellij.ide.util.PackageUtil; import com.intellij.ide.util.PsiClassListCellRenderer; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -708,7 +707,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase } final SmartTypePointer type = SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(myType); - initializer = IntroduceVariableBase.simplifyVariableInitializer(initializer, myType); + initializer = IntroduceVariableBase.simplifyVariableInitializer(initializer, myType, initializerPlace == InitializationPlace.IN_FIELD_DECLARATION); final PsiMethod enclosingConstructor = getEnclosingConstructor(myParentClass, myAnchorElement); PsiClass destClass = mySettings.getDestinationClass() == null ? myParentClass : mySettings.getDestinationClass(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java b/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java index 64245a0b0917..1bf31e0f3a91 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java @@ -53,6 +53,23 @@ public class ElementToWorkOn { myLocalVariable = localVariable; myExpression = expr; } + + public static ElementToWorkOn adjustElements(PsiExpression expr, PsiElement anchorElement) { + PsiLocalVariable localVariable = null; + if (anchorElement instanceof PsiLocalVariable) { + localVariable = (PsiLocalVariable)anchorElement; + } + else if (expr instanceof PsiReferenceExpression) { + PsiElement ref = ((PsiReferenceExpression)expr).resolve(); + if (ref instanceof PsiLocalVariable) { + localVariable = (PsiLocalVariable)ref; + } + } + else if (expr instanceof PsiArrayInitializerExpression && expr.getParent() instanceof PsiNewExpression) { + expr = (PsiExpression)expr.getParent(); + } + return new ElementToWorkOn(localVariable, expr); + } public PsiExpression getExpression() { return myExpression; @@ -156,6 +173,9 @@ public class ElementToWorkOn { localVar = PsiTreeUtil.getParentOfType(ident, PsiLocalVariable.class); } } + else if (expr instanceof PsiArrayInitializerExpression && expr.getParent() instanceof PsiNewExpression) { + expr = (PsiExpression)expr.getParent(); + } } if (expr == null && localVar == null) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java index c08e0920e558..ef39474f0a59 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java @@ -101,16 +101,9 @@ public class IntroduceConstantHandler extends BaseExpressionToFieldHandler { PsiElement anchorElementIfAll) { final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(expr != null ? expr : anchorElement, PsiMethod.class); - PsiLocalVariable localVariable = null; - if (expr instanceof PsiReferenceExpression) { - PsiElement ref = ((PsiReferenceExpression)expr).resolve(); - if (ref instanceof PsiLocalVariable) { - localVariable = (PsiLocalVariable)ref; - } - } - else if (anchorElement instanceof PsiLocalVariable) { - localVariable = (PsiLocalVariable)anchorElement; - } + ElementToWorkOn elementToWorkOn = ElementToWorkOn.adjustElements(expr, anchorElement); + PsiLocalVariable localVariable = elementToWorkOn.getLocalVariable(); + expr = elementToWorkOn.getExpression(); String enteredName = null; boolean replaceAllOccurrences = true; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java index f8d6c976c460..c58a16fccb8b 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java @@ -74,16 +74,9 @@ public class IntroduceFieldHandler extends BaseExpressionToFieldHandler { PsiExpression[] occurrences, PsiElement anchorElement, PsiElement anchorElementIfAll) { final AbstractInplaceIntroducer activeIntroducer = AbstractInplaceIntroducer.getActiveIntroducer(editor); - PsiLocalVariable localVariable = null; - if (anchorElement instanceof PsiLocalVariable) { - localVariable = (PsiLocalVariable)anchorElement; - } - else if (expr instanceof PsiReferenceExpression) { - PsiElement ref = ((PsiReferenceExpression)expr).resolve(); - if (ref instanceof PsiLocalVariable) { - localVariable = (PsiLocalVariable)ref; - } - } + ElementToWorkOn elementToWorkOn = ElementToWorkOn.adjustElements(expr, anchorElement); + PsiLocalVariable localVariable = elementToWorkOn.getLocalVariable(); + expr = elementToWorkOn.getExpression(); String enteredName = null; boolean replaceAll = false; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index 8ca387ea0680..15507e9037c9 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -1040,7 +1040,13 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { } public static PsiExpression simplifyVariableInitializer(final PsiExpression initializer, - final PsiType expectedType) { + final PsiType expectedType) { + return simplifyVariableInitializer(initializer, expectedType, true); + } + + public static PsiExpression simplifyVariableInitializer(final PsiExpression initializer, + final PsiType expectedType, + final boolean inDeclaration) { if (initializer instanceof PsiTypeCastExpression) { PsiExpression operand = ((PsiTypeCastExpression)initializer).getOperand(); @@ -1054,7 +1060,9 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { else if (initializer instanceof PsiNewExpression) { final PsiNewExpression newExpression = (PsiNewExpression)initializer; if (newExpression.getArrayInitializer() != null) { - return newExpression.getArrayInitializer(); + if (inDeclaration) { + return newExpression.getArrayInitializer(); + } } else { final PsiExpression tryToDetectDiamondNewExpr = ((PsiVariable)JavaPsiFacade.getElementFactory(initializer.getProject()) diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer.java new file mode 100644 index 000000000000..c801d2e0e450 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer.java @@ -0,0 +1,5 @@ +class Test { + { + String[] str = new String[] {"a", "b", "c"}; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer_after.java new file mode 100644 index 000000000000..6f4a67856a63 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/arrayInitializer_after.java @@ -0,0 +1,9 @@ +class Test { + + private String[] str; + + { + this.str = new String[]{"a", "b", "c"}; + String[] str = this.str; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java index 54b8f27c0c90..57784a8126c3 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/InplaceIntroduceFieldTest.java @@ -37,6 +37,15 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest }); } + public void testArrayInitializer() { + + doTest(new Pass() { + @Override + public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) { + } + }); + } + public void testAnchor1() { doTest(new Pass() {