mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
introduce constant: add after dependant code (IDEA-66414)
This commit is contained in:
+26
-1
@@ -70,6 +70,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase implements RefactoringActionHandler {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.introduceField.BaseExpressionToFieldHandler");
|
||||
@@ -223,7 +224,12 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
|
||||
destClass.addBefore(CodeEditUtil.createLineFeed(field.getManager()), anchorMember);
|
||||
}
|
||||
else {
|
||||
field = (PsiField)destClass.add(field);
|
||||
final PsiField forwardReference = checkForwardRefs(initializer);
|
||||
if (forwardReference != null) {
|
||||
field = (PsiField)destClass.addAfter(field, forwardReference);
|
||||
} else {
|
||||
field = (PsiField)destClass.add(field);
|
||||
}
|
||||
}
|
||||
if (!settings.isIntroduceEnumConstant()) {
|
||||
VisibilityUtil.fixVisibility(occurrences, field, settings.getFieldVisibility());
|
||||
@@ -320,6 +326,25 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
private PsiField checkForwardRefs(PsiExpression initializer) {
|
||||
final PsiField[] refConstantFields = new PsiField[1];
|
||||
initializer.accept(new JavaRecursiveElementWalkingVisitor() {
|
||||
@Override
|
||||
public void visitReferenceExpression(PsiReferenceExpression expression) {
|
||||
super.visitReferenceExpression(expression);
|
||||
final PsiElement resolve = expression.resolve();
|
||||
if (resolve instanceof PsiField &&
|
||||
((PsiField)resolve).hasModifierProperty(PsiModifier.FINAL) &&
|
||||
PsiTreeUtil.isAncestor(myParentClass, resolve, false) && ((PsiField)resolve).hasInitializer()) {
|
||||
if (refConstantFields[0] == null || refConstantFields[0].getTextOffset() < resolve.getTextOffset()) {
|
||||
refConstantFields[0] = (PsiField)resolve;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return refConstantFields[0];
|
||||
}
|
||||
};
|
||||
|
||||
CommandProcessor.getInstance().executeCommand(
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
class Test {
|
||||
|
||||
public void foo(){
|
||||
System.out.println(<selection>const1.charAt(0)</selection>);
|
||||
}
|
||||
|
||||
public static final String const1 = "";
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
class Test {
|
||||
|
||||
public void foo(){
|
||||
System.out.println(xxx);
|
||||
}
|
||||
|
||||
public static final String const1 = "";
|
||||
public static final char xxx = const1.charAt(0);
|
||||
}
|
||||
@@ -79,6 +79,13 @@ public class IntroduceConstantTest extends LightCodeInsightTestCase {
|
||||
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
|
||||
}
|
||||
|
||||
public void testForwardReferences() throws Exception {
|
||||
configureByFile(BASE_PATH + getTestName(false) + ".java");
|
||||
new MockIntroduceConstantHandler(null).invoke(getProject(), getEditor(), getFile(), null);
|
||||
checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
|
||||
}
|
||||
|
||||
|
||||
public void testEscalateVisibility() throws Exception {
|
||||
configureByFile(BASE_PATH + getTestName(false) + ".java");
|
||||
final PsiClass[] classes = ((PsiJavaFile)getFile()).getClasses();
|
||||
|
||||
Reference in New Issue
Block a user