diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index fce4add34e0f..018e61ae48c6 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -713,7 +713,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase } final SmartTypePointer type = SmartTypePointerManager.getInstance(myProject).createSmartTypePointer(myType); - initializer = IntroduceVariableBase.replaceExplicitWithDiamondWhenApplicable(initializer, myType); + initializer = IntroduceVariableBase.simplifyVariableInitializer(initializer, myType); final PsiMethod enclosingConstructor = getEnclosingConstructor(myParentClass, myAnchorElement); PsiClass destClass = mySettings.getDestinationClass() == null ? myParentClass : mySettings.getDestinationClass(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index 2fb56af33023..f1b352733fe4 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -881,13 +881,7 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { PsiExpression initializer = RefactoringUtil.unparenthesizeExpression(expr1); final SmartTypePointer selectedType = SmartTypePointerManager.getInstance(project).createSmartTypePointer( settings.getSelectedType()); - if (expr1 instanceof PsiNewExpression) { - final PsiNewExpression newExpression = (PsiNewExpression)expr1; - if (newExpression.getArrayInitializer() != null) { - initializer = newExpression.getArrayInitializer(); - } - initializer = replaceExplicitWithDiamondWhenApplicable(initializer, selectedType.getType()); - } + initializer = simplifyVariableInitializer(initializer, selectedType.getType()); PsiDeclarationStatement declaration = JavaPsiFacade.getInstance(project).getElementFactory() .createVariableDeclarationStatement(settings.getEnteredName(), selectedType.getType(), initializer, container); @@ -991,20 +985,32 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { return false; } - public static PsiExpression replaceExplicitWithDiamondWhenApplicable(final PsiExpression initializer, - final PsiType expectedType) { - if (initializer instanceof PsiNewExpression) { + public static PsiExpression simplifyVariableInitializer(final PsiExpression initializer, + final PsiType expectedType) { + + if (initializer instanceof PsiTypeCastExpression) { + PsiTypeElement castType = ((PsiTypeCastExpression)initializer).getCastType(); + if (castType != null && TypeConversionUtil.isAssignable(expectedType, castType.getType())) { + return ((PsiTypeCastExpression)initializer).getOperand(); + } + } + else if (initializer instanceof PsiNewExpression) { final PsiNewExpression newExpression = (PsiNewExpression)initializer; - final PsiExpression tryToDetectDiamondNewExpr = ((PsiVariable)JavaPsiFacade.getElementFactory(initializer.getProject()) - .createVariableDeclarationStatement("x", expectedType, initializer, initializer).getDeclaredElements()[0]) - .getInitializer(); - if (tryToDetectDiamondNewExpr instanceof PsiNewExpression && - PsiDiamondTypeUtil.canCollapseToDiamond((PsiNewExpression)tryToDetectDiamondNewExpr, - (PsiNewExpression)tryToDetectDiamondNewExpr, - expectedType)) { - final PsiElement paramList = PsiDiamondTypeUtil - .replaceExplicitWithDiamond(newExpression.getClassOrAnonymousClassReference().getParameterList()); - return PsiTreeUtil.getParentOfType(paramList, PsiNewExpression.class); + if (newExpression.getArrayInitializer() != null) { + return newExpression.getArrayInitializer(); + } + else { + final PsiExpression tryToDetectDiamondNewExpr = ((PsiVariable)JavaPsiFacade.getElementFactory(initializer.getProject()) + .createVariableDeclarationStatement("x", expectedType, initializer, initializer).getDeclaredElements()[0]) + .getInitializer(); + if (tryToDetectDiamondNewExpr instanceof PsiNewExpression && + PsiDiamondTypeUtil.canCollapseToDiamond((PsiNewExpression)tryToDetectDiamondNewExpr, + (PsiNewExpression)tryToDetectDiamondNewExpr, + expectedType)) { + final PsiElement paramList = PsiDiamondTypeUtil + .replaceExplicitWithDiamond(newExpression.getClassOrAnonymousClassReference().getParameterList()); + return PsiTreeUtil.getParentOfType(paramList, PsiNewExpression.class); + } } } return initializer; diff --git a/java/java-tests/testData/refactoring/introduceVariable/ParenthizedOccurence1.after.java b/java/java-tests/testData/refactoring/introduceVariable/ParenthizedOccurence1.after.java index b58aaf72e530..7adb962b4cdb 100644 --- a/java/java-tests/testData/refactoring/introduceVariable/ParenthizedOccurence1.after.java +++ b/java/java-tests/testData/refactoring/introduceVariable/ParenthizedOccurence1.after.java @@ -1,5 +1,5 @@ public class Introduce { void foo(String str) { - final String s = (String) str; + final String s = str; } } \ No newline at end of file