introduce field: fix introducing in anonymous class; fix enclosing constructor (IDEA-66774)

This commit is contained in:
anna
2011-03-18 17:24:27 +01:00
parent e4c7048698
commit 938868c348
5 changed files with 51 additions and 4 deletions

View File

@@ -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;
}

View File

@@ -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<PsiClass>() {
@@ -211,16 +211,30 @@ 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) {
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();
return assignment;

View File

@@ -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);
}
};
}
}

View File

@@ -0,0 +1,11 @@
class TestRefactoring {
public TestRefactoring() {
Runnable r = new Runnable() {
@Override
public void run() {
Integer to<caret>Field = new Integer("0");
System.out.println(toField);
}
};
}
}

View File

@@ -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");
}
}