smart introduce: respect priority (IDEADEV-33019)

This commit is contained in:
Anna Kozlova
2009-01-14 14:00:50 +03:00
parent aa95458625
commit 6dbc7fa333
2 changed files with 22 additions and 16 deletions
@@ -28,6 +28,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.impl.source.tree.java.ReplaceExpressionUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.IntroduceHandlerBase;
@@ -273,16 +274,19 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase impleme
tempExpr.putUserData(ElementToWorkOn.PARENT, parent);
final PsiExpression toBeExpression = createReplacement("intellijidearulezzz", file, prefix, suffix, parent, rangeMarker);
final String fakeInitializer = "intellijidearulezzz";
final PsiExpression toBeExpression = createReplacement(fakeInitializer, file, prefix, suffix, parent, rangeMarker);
toBeExpression.accept(errorsVisitor);
if (hasErrors[0]) return null;
/*
if (tempExpr != null && !ReplaceExpressionUtil.canExtract(toBeExpression.getNode(), tempExpr.getNode())) { //or show warning?
tempExpr = null;
}*/
final PsiReferenceExpression refExpr = PsiTreeUtil.getParentOfType(toBeExpression.findElementAt(toBeExpression.getText().indexOf(fakeInitializer)), PsiReferenceExpression.class);
assert refExpr != null;
if (ReplaceExpressionUtil.isNeedParenthesis(refExpr.getNode(), tempExpr.getNode())) {
return null;
}
}
catch (IncorrectOperationException e) {
tempExpr = null;
return null;
}
return tempExpr;
@@ -1,37 +1,39 @@
package com.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiBinaryExpression;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.lang.ASTNode;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.tree.IElementType;
public class ReplaceExpressionUtil implements Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.ReplaceExpressionUtil");
public static boolean isNeedParenthesis(ASTNode oldExpr, ASTNode newExpr) {
if (!ElementType.EXPRESSION_BIT_SET.contains(oldExpr.getTreeParent().getElementType())) return false;
final ASTNode oldParent = oldExpr.getTreeParent();
if (!ElementType.EXPRESSION_BIT_SET.contains(oldParent.getElementType())) return false;
int priority = getExpressionPriority(newExpr);
int parentPriority = getExpressionPriority(oldExpr.getTreeParent());
int parentPriority = getExpressionPriority(oldParent);
if (priority > parentPriority) return false;
IElementType i = oldExpr.getTreeParent().getElementType();
IElementType i = oldParent.getElementType();
if (i == ASSIGNMENT_EXPRESSION) {
if (priority < parentPriority) return true;
return ((CompositeElement)oldExpr.getTreeParent()).getChildRole(oldExpr) == ChildRole.LOPERAND ? true : false;
return ((CompositeElement)oldParent).getChildRole(oldExpr) == ChildRole.LOPERAND ? true : false;
}
else if (i == CONDITIONAL_EXPRESSION) {
int role = ((CompositeElement)oldExpr.getTreeParent()).getChildRole(oldExpr);
int role = ((CompositeElement)oldParent).getChildRole(oldExpr);
if (role == ChildRole.THEN_EXPRESSION) return false;
if (priority < parentPriority) return true;
return role == ChildRole.ELSE_EXPRESSION ? false : true;
}
else if (i == BINARY_EXPRESSION) {
if (priority < parentPriority) return true;
return ((CompositeElement)oldExpr.getTreeParent()).getChildRole(oldExpr) == ChildRole.LOPERAND ? false : true;
final IElementType opType = ((PsiBinaryExpression)SourceTreeToPsiMap.treeElementToPsi(oldParent)).getOperationSign().getTokenType();
return ((CompositeElement)oldParent).getChildRole(oldExpr) == ChildRole.LOPERAND ? false : opType != PLUS && opType != ASTERISK;
}
else if (i == INSTANCE_OF_EXPRESSION) {
return priority < parentPriority;
@@ -52,7 +54,7 @@ public class ReplaceExpressionUtil implements Constants {
return false;
}
else if (i == ARRAY_ACCESS_EXPRESSION) {
int role = ((CompositeElement)oldExpr.getTreeParent()).getChildRole(oldExpr);
int role = ((CompositeElement)oldParent).getChildRole(oldExpr);
if (role == ChildRole.ARRAY_DIMENSION) return false;
return priority < parentPriority;
}