introduce variable: remove redundant type cast (IDEA-153665)

This commit is contained in:
Anna.Kozlova
2016-04-29 14:41:28 +02:00
parent b936f89275
commit 44a7f43a10
3 changed files with 28 additions and 22 deletions
@@ -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();
@@ -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;
@@ -1,5 +1,5 @@
public class Introduce {
void foo(String str) {
final String s = (String) str;
final String s = str;
}
}