mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
introduce variable: normalize declaration when necessary (IDEA-94494)
This commit is contained in:
+32
-2
@@ -45,7 +45,10 @@ import com.intellij.openapi.util.registry.Registry;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.wm.WindowManager;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.impl.PsiDiamondTypeUtil;
|
||||
import com.intellij.psi.impl.source.jsp.jspJava.JspCodeBlock;
|
||||
import com.intellij.psi.impl.source.jsp.jspJava.JspHolderMethod;
|
||||
@@ -66,6 +69,7 @@ import com.intellij.refactoring.util.RefactoringUIUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUtil;
|
||||
import com.intellij.refactoring.util.occurrences.ExpressionOccurrenceManager;
|
||||
import com.intellij.refactoring.util.occurrences.NotInSuperCallOccurrenceFilter;
|
||||
import com.intellij.util.ArrayUtilRt;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
@@ -784,7 +788,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
|
||||
PsiDeclarationStatement declaration = JavaPsiFacade.getInstance(project).getElementFactory()
|
||||
.createVariableDeclarationStatement(settings.getEnteredName(), selectedType.getType(), initializer);
|
||||
if (!isInsideLoop) {
|
||||
declaration = (PsiDeclarationStatement) container.addBefore(declaration, anchor);
|
||||
declaration = addDeclaration(declaration, initializer);
|
||||
LOG.assertTrue(expr1.isValid());
|
||||
if (deleteSelf) { // never true
|
||||
final PsiElement lastChild = statement.getLastChild();
|
||||
@@ -842,6 +846,32 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase {
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
private PsiDeclarationStatement addDeclaration(PsiDeclarationStatement declaration, PsiExpression initializer) {
|
||||
if (anchor instanceof PsiDeclarationStatement) {
|
||||
final PsiElement[] declaredElements = ((PsiDeclarationStatement)anchor).getDeclaredElements();
|
||||
if (declaredElements.length > 1) {
|
||||
final int [] usedFirstVar = new int[] {-1};
|
||||
initializer.accept(new JavaRecursiveElementWalkingVisitor() {
|
||||
@Override
|
||||
public void visitReferenceExpression(PsiReferenceExpression expression) {
|
||||
final int i = ArrayUtilRt.find(declaredElements, expression.resolve());
|
||||
if (i > -1) {
|
||||
usedFirstVar[0] = Math.max(i, usedFirstVar[0]);
|
||||
}
|
||||
super.visitReferenceExpression(expression);
|
||||
}
|
||||
});
|
||||
if (usedFirstVar[0] > -1) {
|
||||
final PsiVariable psiVariable = (PsiVariable)declaredElements[usedFirstVar[0]];
|
||||
psiVariable.normalizeDeclaration();
|
||||
final PsiDeclarationStatement parDeclarationStatement = PsiTreeUtil.getParentOfType(psiVariable, PsiDeclarationStatement.class);
|
||||
return (PsiDeclarationStatement)container.addAfter(declaration, parDeclarationStatement);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (PsiDeclarationStatement) container.addBefore(declaration, anchor);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
class X {
|
||||
{
|
||||
int i = 0;
|
||||
int i3 = i;
|
||||
int i1 = 0;
|
||||
int i2 = i3;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class X {
|
||||
{
|
||||
int i = 0, i1 = 0, i2 = <selection>i</selection>;
|
||||
}
|
||||
}
|
||||
@@ -388,6 +388,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase {
|
||||
doTest(new MockIntroduceVariableHandler("c", false, false, false, "int"));
|
||||
}
|
||||
|
||||
public void testNormalizeDeclarations() throws Exception {
|
||||
doTest(new MockIntroduceVariableHandler("i3", false, false, false, "int"));
|
||||
}
|
||||
|
||||
private void doTest(IntroduceVariableBase testMe) throws Exception {
|
||||
@NonNls String baseName = "/refactoring/introduceVariable/" + getTestName(false);
|
||||
configureByFile(baseName + ".java");
|
||||
|
||||
Reference in New Issue
Block a user