From 6dbc7fa33325e7b80a4afde671200fa1c7b69233 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Jan 2009 14:00:50 +0300 Subject: [PATCH] smart introduce: respect priority (IDEADEV-33019) --- .../IntroduceVariableBase.java | 16 +++++++++----- .../tree/java/ReplaceExpressionUtil.java | 22 ++++++++++--------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/refactoring/impl/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/refactoring/impl/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index 435271b4f767..cb4e6094f6b2 100644 --- a/refactoring/impl/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/refactoring/impl/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -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; diff --git a/source/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java b/source/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java index 7553f826e206..a2c813dabb13 100644 --- a/source/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java +++ b/source/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java @@ -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; }