From 943ed6a0022c88f0f077e0ba7cd9af59dd85b791 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 31 Mar 2016 19:02:53 +0200 Subject: [PATCH] extract field: ensure type is valid after diamond conversion (IDEA-153602) --- .../introduceField/BaseExpressionToFieldHandler.java | 6 ++++-- .../introduceField/afterSimplifiedDiamond.java | 8 ++++++++ .../introduceField/beforeSimplifiedDiamond.java | 6 ++++++ .../refactoring/IntroduceFieldInSameClassTest.java | 6 ++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceField/afterSimplifiedDiamond.java create mode 100644 java/java-tests/testData/refactoring/introduceField/beforeSimplifiedDiamond.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 5f6396818e7e..fce4add34e0f 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -712,6 +712,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase initializer = mySelectedExpr; } + final SmartTypePointer type = SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(myType); initializer = IntroduceVariableBase.replaceExplicitWithDiamondWhenApplicable(initializer, myType); final PsiMethod enclosingConstructor = getEnclosingConstructor(myParentClass, myAnchorElement); @@ -722,8 +723,9 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase ChangeContextUtil.encodeContextInfo(destClass, true); myField = mySettings.isIntroduceEnumConstant() ? EnumConstantsUtil.createEnumConstant(destClass, myFieldName, initializer) : - createField(myFieldName, myType, initializer, initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null, - myParentClass); + createField(myFieldName, type.getType(), initializer, + initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null, + myParentClass); setModifiers(myField, mySettings); PsiElement finalAnchorElement = null; diff --git a/java/java-tests/testData/refactoring/introduceField/afterSimplifiedDiamond.java b/java/java-tests/testData/refactoring/introduceField/afterSimplifiedDiamond.java new file mode 100644 index 000000000000..437c1910fccb --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/afterSimplifiedDiamond.java @@ -0,0 +1,8 @@ +import java.util.*; +class Foo { + public final ArrayList strings = new ArrayList<>(); + + { + List l = strings; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceField/beforeSimplifiedDiamond.java b/java/java-tests/testData/refactoring/introduceField/beforeSimplifiedDiamond.java new file mode 100644 index 000000000000..980f2e15d43a --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/beforeSimplifiedDiamond.java @@ -0,0 +1,6 @@ +import java.util.*; +class Foo { + { + List l = new ArrayList(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java index 070ea5afb3cc..fbe7a528e049 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java @@ -166,6 +166,12 @@ public class IntroduceFieldInSameClassTest extends LightCodeInsightTestCase { checkResultByFile("/refactoring/introduceField/afterFromLambdaExpr.java"); } + public void testSimplifyDiamond() throws Exception { + configureByFile("/refactoring/introduceField/beforeSimplifiedDiamond.java"); + performRefactoring(BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION, false); + checkResultByFile("/refactoring/introduceField/afterSimplifiedDiamond.java"); + } + public void testStaticFieldInInnerClass() { configureByFile("/refactoring/introduceField/beforeStaticFieldInInnerClass.java"); new MockIntroduceFieldHandler(BaseExpressionToFieldHandler.InitializationPlace.IN_CURRENT_METHOD, false) {