From 938868c348f9eb6970a9387ba136206b9d1b8e88 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 18 Mar 2011 17:24:27 +0100 Subject: [PATCH] introduce field: fix introducing in anonymous class; fix enclosing constructor (IDEA-66774) --- .../BaseExpressionToFieldHandler.java | 5 ++++- .../introduceField/LocalToFieldHandler.java | 20 ++++++++++++++++--- .../afterEnclosingAnonymous.java | 13 ++++++++++++ .../beforeEnclosingAnonymous.java | 11 ++++++++++ .../IntroduceFieldInSameClassTest.java | 6 ++++++ 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceField/afterEnclosingAnonymous.java create mode 100644 java/java-tests/testData/refactoring/introduceField/beforeEnclosingAnonymous.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 895d766927df..22314744e177 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -298,7 +298,10 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase if (element == null) return null; final PsiMethod[] constructors = parentClass.getConstructors(); for (PsiMethod constructor : constructors) { - if (PsiTreeUtil.isAncestor(constructor, element, false)) return constructor; + if (PsiTreeUtil.isAncestor(constructor, element, false)) { + if (PsiTreeUtil.getParentOfType(element, PsiClass.class) != parentClass) return null; + return constructor; + } } return null; } 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 7e5c5b47d83d..c86697dbef47 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java @@ -82,7 +82,7 @@ public abstract class LocalToFieldHandler { if (classes.isEmpty()) return false; if (classes.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) { - if (convertLocalToField(local, classes.get(0), editor, tempIsStatic)) return false; + if (convertLocalToField(local, classes.get(classes.size() - 1), 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() { @@ -211,15 +211,29 @@ public abstract class LocalToFieldHandler { if ("this".equals(text)) { continue; } + if ("super".equals(text) && enclosingConstructor == null && PsiTreeUtil.isAncestor(constructor, local, false)) { + local.delete(); + return (PsiStatement)body.addAfter(assignment, first); + } } } + if (enclosingConstructor == null && PsiTreeUtil.isAncestor(constructor, local, false)) { + local.delete(); + return (PsiStatement)body.addBefore(assignment, first); + } } + assignment = (PsiStatement)body.add(assignment); added = true; } if (!added && enclosingConstructor == null) { - PsiMethod constructor = (PsiMethod)aClass.add(factory.createConstructor()); - assignment = (PsiStatement)constructor.getBody().add(assignment); + if (aClass instanceof PsiAnonymousClass) { + final PsiClassInitializer classInitializer = (PsiClassInitializer)aClass.addAfter(factory.createClassInitializer(), field); + assignment = (PsiStatement)classInitializer.getBody().add(assignment); + } else { + PsiMethod constructor = (PsiMethod)aClass.add(factory.createConstructor()); + assignment = (PsiStatement)constructor.getBody().add(assignment); + } } if (enclosingConstructor == null) local.delete(); diff --git a/java/java-tests/testData/refactoring/introduceField/afterEnclosingAnonymous.java b/java/java-tests/testData/refactoring/introduceField/afterEnclosingAnonymous.java new file mode 100644 index 000000000000..0d6d8e781e65 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/afterEnclosingAnonymous.java @@ -0,0 +1,13 @@ +class TestRefactoring { + public final Integer integer; + + public TestRefactoring() { + integer = new Integer("0"); + Runnable r = new Runnable() { + @Override + public void run() { + System.out.println(integer); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceField/beforeEnclosingAnonymous.java b/java/java-tests/testData/refactoring/introduceField/beforeEnclosingAnonymous.java new file mode 100644 index 000000000000..850da946345a --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceField/beforeEnclosingAnonymous.java @@ -0,0 +1,11 @@ +class TestRefactoring { + public TestRefactoring() { + Runnable r = new Runnable() { + @Override + public void run() { + Integer toField = new Integer("0"); + System.out.println(toField); + } + }; + } +} \ 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 2ad2588f7561..a31fd3d3e030 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFieldInSameClassTest.java @@ -99,4 +99,10 @@ public class IntroduceFieldInSameClassTest extends LightCodeInsightTestCase { "Invalid expression context.", e.getMessage()); } } + + public void testInConstructorEnclosingAnonymous() throws Exception { + configureByFile("/refactoring/introduceField/beforeEnclosingAnonymous.java"); + performRefactoring(BaseExpressionToFieldHandler.InitializationPlace.IN_CONSTRUCTOR, false); + checkResultByFile("/refactoring/introduceField/afterEnclosingAnonymous.java"); + } } \ No newline at end of file