From 032a2a603abb0ee881423336ae9f4bd8c502ed2e Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 13 Dec 2012 14:50:35 +0100 Subject: [PATCH] introduce field: choose anchor corresponding to used fields without initializer (IDEA-97420) --- .../BaseExpressionToFieldHandler.java | 1 - .../IntroduceFieldCentralPanel.java | 30 +++++++++++++++---- .../IntroduceFieldDialogPanel.java | 28 +++++------------ .../IntroduceFieldPopupPanel.java | 26 ++++------------ .../inplaceIntroduceField/anchor1.java | 8 +++++ .../inplaceIntroduceField/anchor1_after.java | 9 ++++++ .../InplaceIntroduceFieldTest.java | 9 ++++++ 7 files changed, 64 insertions(+), 47 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1.java create mode 100644 java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1_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 5027e01a40ed..3a1347715e06 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -906,7 +906,6 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase super.visitReferenceExpression(expression); final PsiElement resolve = expression.resolve(); if (resolve instanceof PsiField && - ((PsiField)resolve).hasModifierProperty(PsiModifier.FINAL) && PsiTreeUtil.isAncestor(parentClass, resolve, false) && ((PsiField)resolve).hasInitializer() && !PsiTreeUtil.isAncestor(initializer, resolve, false)) { if (refConstantFields[0] == null || refConstantFields[0].getTextOffset() < resolve.getTextOffset()) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java index 5a5b3f133a72..cc07e950aa43 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldCentralPanel.java @@ -16,10 +16,8 @@ package com.intellij.refactoring.introduceField; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiLocalVariable; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.TypeSelectorManager; @@ -83,7 +81,27 @@ public abstract class IntroduceFieldCentralPanel { myTypeSelectorManager = typeSelectorManager; } - protected abstract boolean setEnabledInitializationPlaces(PsiElement initializerPart, PsiElement initializer); + protected boolean setEnabledInitializationPlaces(PsiElement initializerPart, PsiElement initializer) { + if (initializerPart instanceof PsiReferenceExpression) { + PsiReferenceExpression refExpr = (PsiReferenceExpression)initializerPart; + if (refExpr.getQualifierExpression() == null) { + PsiElement refElement = refExpr.resolve(); + if (refElement == null || + (refElement instanceof PsiLocalVariable || + refElement instanceof PsiParameter || + (refElement instanceof PsiField && !((PsiField)refElement).hasInitializer())) && + !PsiTreeUtil.isAncestor(initializer, refElement, true)) { + return updateInitializationPlaceModel(); + } + } + } + PsiElement[] children = initializerPart.getChildren(); + for (PsiElement child : children) { + if (!setEnabledInitializationPlaces(child, initializer)) return false; + } + return true; + } + public abstract BaseExpressionToFieldHandler.InitializationPlace getInitializerPlace(); protected abstract void initializeInitializerPlace(PsiExpression initializerExpression, BaseExpressionToFieldHandler.InitializationPlace ourLastInitializerPlace); @@ -257,4 +275,6 @@ public abstract class IntroduceFieldCentralPanel { ourLastCbFinalState = myCbFinal.isSelected(); } } + + protected abstract boolean updateInitializationPlaceModel(); } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldDialogPanel.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldDialogPanel.java index 43e2482e75be..a184983897ba 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldDialogPanel.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldDialogPanel.java @@ -194,27 +194,13 @@ public class IntroduceFieldDialogPanel extends IntroduceFieldCentralPanel { return mainPanel; } - protected boolean setEnabledInitializationPlaces(PsiElement initializerPart, PsiElement initializer) { - if (initializerPart instanceof PsiReferenceExpression) { - PsiReferenceExpression refExpr = (PsiReferenceExpression) initializerPart; - if (refExpr.getQualifierExpression() == null) { - PsiElement refElement = refExpr.resolve(); - if (refElement == null || - (refElement instanceof PsiLocalVariable || refElement instanceof PsiParameter) && - !PsiTreeUtil.isAncestor(initializer, refElement, true)) { - myRbInFieldDeclaration.setEnabled(false); - myRbInConstructor.setEnabled(false); - if (myRbInSetUp != null) myRbInSetUp.setEnabled(false); - enableFinal(false); - return false; - } - } - } - PsiElement[] children = initializerPart.getChildren(); - for (PsiElement child : children) { - if (!setEnabledInitializationPlaces(child, initializer)) return false; - } - return true; + @Override + protected boolean updateInitializationPlaceModel() { + myRbInFieldDeclaration.setEnabled(false); + myRbInConstructor.setEnabled(false); + if (myRbInSetUp != null) myRbInSetUp.setEnabled(false); + enableFinal(false); + return false; } public void setInitializeInFieldDeclaration() { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java index 5f3cfe92e81a..41a16ece2667 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldPopupPanel.java @@ -186,26 +186,12 @@ public class IntroduceFieldPopupPanel extends IntroduceFieldCentralPanel { return null; } - protected boolean setEnabledInitializationPlaces(PsiElement initializerPart, PsiElement initializer) { - if (initializerPart instanceof PsiReferenceExpression) { - PsiReferenceExpression refExpr = (PsiReferenceExpression) initializerPart; - if (refExpr.getQualifierExpression() == null) { - PsiElement refElement = refExpr.resolve(); - if (refElement == null || - (refElement instanceof PsiLocalVariable || refElement instanceof PsiParameter) && - !PsiTreeUtil.isAncestor(initializer, refElement, true)) { - myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION); - myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_CONSTRUCTOR); - myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_SETUP_METHOD); - return false; - } - } - } - PsiElement[] children = initializerPart.getChildren(); - for (PsiElement child : children) { - if (!setEnabledInitializationPlaces(child, initializer)) return false; - } - return true; + @Override + protected boolean updateInitializationPlaceModel() { + myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION); + myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_CONSTRUCTOR); + myInitialisersPlaceModel.removeElement(BaseExpressionToFieldHandler.InitializationPlace.IN_SETUP_METHOD); + return false; } public void setInitializeInFieldDeclaration() { diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1.java new file mode 100644 index 000000000000..a02dfa318bc8 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1.java @@ -0,0 +1,8 @@ +import java.util.*; +class ExtractFieldCompilationFailureTest { + private ArrayList aelements = new ArrayList(); + + public void test() { + aelements.iterator(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1_after.java new file mode 100644 index 000000000000..6a4ad8d27290 --- /dev/null +++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/anchor1_after.java @@ -0,0 +1,9 @@ +import java.util.*; +class ExtractFieldCompilationFailureTest { + private ArrayList aelements = new ArrayList(); + private Iterator iterator; + + public void test() { + iterator = aelements.iterator(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java index 93cb9d0aec94..8463eaa09a56 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceFieldTest.java @@ -41,6 +41,15 @@ public class InplaceIntroduceFieldTest extends AbstractJavaInplaceIntroduceTest }); } + public void testAnchor1() throws Exception { + + doTest(new Pass() { + @Override + public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) { + } + }); + } + public void testBeforeAssignment() throws Exception { doTest(new Pass() {