mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +07:00
introduce field: fix introducing in anonymous class; fix enclosing constructor (IDEA-66774)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user