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 abb7d6f18ec8..ac4a41417362 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -218,9 +218,9 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase return false; } - public static void setModifiers(PsiField field, Settings settings, final boolean declareStatic) { + public static void setModifiers(PsiField field, Settings settings) { if (!settings.isIntroduceEnumConstant()) { - if (declareStatic) { + if (settings.isDeclareStatic()) { PsiUtil.setModifierProperty(field, PsiModifier.STATIC, true); } if (settings.isDeclareFinal()) { @@ -711,7 +711,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase createField(myFieldName, myType, initializer, initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null, myParentClass); - setModifiers(myField, mySettings, mySettings.isDeclareStatic()); + setModifiers(myField, mySettings); myField = appendField(initializer, initializerPlace, destClass, myParentClass, myAnchorElement, myField); if (!mySettings.isIntroduceEnumConstant()) { VisibilityUtil.fixVisibility(myOccurrences, myField, mySettings.getFieldVisibility()); 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 cfa320ba476c..2abad90e3ef0 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java @@ -31,6 +31,8 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.occurrences.*; import org.jetbrains.annotations.NotNull; +import java.util.List; + public class IntroduceFieldHandler extends BaseExpressionToFieldHandler { public static final String REFACTORING_NAME = RefactoringBundle.message("introduce.field.title"); @@ -199,10 +201,19 @@ public class IntroduceFieldHandler extends BaseExpressionToFieldHandler { final PsiStatement statement = PsiTreeUtil.getParentOfType(local, PsiStatement.class); return IntroduceFieldHandler.this.showRefactoringDialog(project, editor, aClass, local.getInitializer(), local.getType(), occurences, local, statement); } + + @Override + protected int getChosenClassIndex(List classes) { + return IntroduceFieldHandler.this.getChosenClassIndex(classes); + } }; return localToFieldHandler.convertLocalToField(localVariable, editor); } + protected int getChosenClassIndex(List classes) { + return classes.size() - 1; + } + private static class MyOccurrenceFilter implements OccurrenceFilter { public boolean isOK(PsiExpression occurrence) { return !isInSuperOrThis(occurrence); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java index 2836d5bb6d50..a991d6e519aa 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java @@ -81,7 +81,7 @@ public abstract class LocalToFieldHandler { if (classes.isEmpty()) return false; if (classes.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) { - if (convertLocalToField(local, classes.get(classes.size() - 1), editor, tempIsStatic)) return false; + if (convertLocalToField(local, classes.get(getChosenClassIndex(classes)), editor, tempIsStatic)) return false; } else { final boolean isStatic = tempIsStatic; NavigationUtil.getPsiElementPopup(classes.toArray(new PsiClass[classes.size()]), new PsiClassListCellRenderer(), "Choose class to introduce " + (myIsConstant ? "constant" : "field"), new PsiElementProcessor() { @@ -96,6 +96,10 @@ public abstract class LocalToFieldHandler { return true; } + protected int getChosenClassIndex(List classes) { + return classes.size() - 1; + } + private boolean convertLocalToField(PsiLocalVariable local, PsiClass aClass, Editor editor, boolean isStatic) { final PsiExpression[] occurences = CodeInsightUtil.findReferenceExpressions(RefactoringUtil.getVariableScope(local), local); if (editor != null) { @@ -250,7 +254,6 @@ public abstract class LocalToFieldHandler { private final PsiClass myDestinationClass; private final BaseExpressionToFieldHandler.Settings mySettings; private final BaseExpressionToFieldHandler.InitializationPlace myInitializerPlace; - private final boolean myStatic; private final PsiExpression[] myOccurences; private PsiField myField; private PsiStatement myAssignmentStatement; @@ -269,7 +272,6 @@ public abstract class LocalToFieldHandler { myDestinationClass = aClass; mySettings = settings; myInitializerPlace = settings.getInitializerPlace(); - myStatic = isStatic; myOccurences = occurrences; } @@ -288,7 +290,7 @@ public abstract class LocalToFieldHandler { myField = mySettings.isIntroduceEnumConstant() ? EnumConstantsUtil.createEnumConstant(myDestinationClass, myLocal, myFieldName) : createField(myLocal, mySettings.getForcedType(), myFieldName, myInitializerPlace == IN_FIELD_DECLARATION); myField = (PsiField)myDestinationClass.add(myField); - BaseExpressionToFieldHandler.setModifiers(myField, mySettings, myStatic); + BaseExpressionToFieldHandler.setModifiers(myField, mySettings); if (!mySettings.isIntroduceEnumConstant()) { VisibilityUtil.fixVisibility(myOccurences, myField, mySettings.getFieldVisibility()); } diff --git a/java/java-tests/testData/refactoring/introduceField/afterStaticFieldInInnerClass.java b/java/java-tests/testData/refactoring/introduceField/afterStaticFieldInInnerClass.java new file mode 100644 index 000000000000..1a3c2aa1d290 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/afterStaticFieldInInnerClass.java @@ -0,0 +1,9 @@ +public class A { + private static final class Inner { + public final String string; + + public Inner(Integer param) { + string = param.toString(); + } + } +} diff --git a/java/java-tests/testData/refactoring/introduceField/beforeStaticFieldInInnerClass.java b/java/java-tests/testData/refactoring/introduceField/beforeStaticFieldInInnerClass.java new file mode 100644 index 000000000000..3e1b9ef7b00b --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/beforeStaticFieldInInnerClass.java @@ -0,0 +1,7 @@ +public class A { + private static final class Inner { + public Inner(Integer param) { + String str = param.toString(); + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java index 28a6c6ce2c83..c394c2d353d0 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java @@ -1,12 +1,15 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPrimitiveType; import com.intellij.psi.PsiType; import com.intellij.refactoring.introduceField.BaseExpressionToFieldHandler; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.testFramework.LightCodeInsightTestCase; +import java.util.List; + /** * @author ven */ @@ -115,4 +118,16 @@ public class IntroduceFieldInSameClassTest extends LightCodeInsightTestCase { performRefactoring(BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION, false); checkResultByFile("/refactoring/introduceField/afterLocalVarAnnotations.java"); } + + public void testStaticFieldInInnerClass() throws Exception { + configureByFile("/refactoring/introduceField/beforeStaticFieldInInnerClass.java"); + new MockIntroduceFieldHandler(BaseExpressionToFieldHandler.InitializationPlace.IN_CURRENT_METHOD, false){ + @Override + protected int getChosenClassIndex(List classes) { + return 0; + } + }.invoke(getProject(), myEditor, myFile, null); + checkResultByFile("/refactoring/introduceField/afterStaticFieldInInnerClass.java"); + } + } \ No newline at end of file