IG: Make unboxing explicit fix now adds type arguments on method calls when needed (IDEA-204071)

This commit is contained in:
Bas Leijdekkers
2018-12-20 16:09:09 +01:00
parent 6970a4b3a2
commit f710ad3bda
5 changed files with 53 additions and 13 deletions
@@ -27,7 +27,6 @@ import com.intellij.psi.util.PsiPrecedenceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.Query;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
@@ -138,8 +137,7 @@ public class AutoUnboxingInspection extends BaseInspection {
return;
}
final CommentTracker commentTracker = new CommentTracker();
final PsiExpression enhancedExpression = ObjectUtils.notNull(AddTypeArgumentsFix.addTypeArguments(expression, null), expression);
final String newExpressionText = buildNewExpressionText(enhancedExpression, unboxedType, commentTracker);
final String newExpressionText = buildNewExpressionText(expression, unboxedType, commentTracker);
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
final PsiElementFactory factory = psiFacade.getElementFactory();
final PsiElement parent = expression.getParent();
@@ -224,7 +222,7 @@ public class AutoUnboxingInspection extends BaseInspection {
if (constantText != null) {
return constantText;
}
final String expressionText = expression.getText();
final String expressionText = getExpressionText(expression, new StringBuilder()).toString();
final String boxMethodName = s_unboxingMethods.get(unboxedType.getCanonicalText());
if (expression instanceof PsiMethodCallExpression) {
final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression;
@@ -245,6 +243,37 @@ public class AutoUnboxingInspection extends BaseInspection {
: expressionText + '.' + boxMethodName + "()";
}
private static StringBuilder getExpressionText(PsiExpression expression, StringBuilder out) {
if (expression instanceof PsiMethodCallExpression) {
final PsiExpression explicitExpression = AddTypeArgumentsFix.addTypeArguments(expression, null);
if (explicitExpression != null) {
out.append(explicitExpression.getText());
}
else {
out.append(expression.getText());
}
}
else if (expression instanceof PsiParenthesizedExpression) {
out.append('(');
final PsiExpression expression1 = ((PsiParenthesizedExpression)expression).getExpression();
if (expression1 != null) {
getExpressionText(expression1, out);
}
out.append(')');
}
else if (expression instanceof PsiConditionalExpression) {
final PsiConditionalExpression conditional = (PsiConditionalExpression)expression;
out.append(conditional.getCondition().getText()).append('?');
getExpressionText(conditional.getThenExpression(), out);
out.append(':');
getExpressionText(conditional.getElseExpression(), out);
}
else {
out.append(expression.getText());
}
return out;
}
private static boolean isValueOfCall(PsiMethodCallExpression methodCallExpression) {
final PsiExpressionList argumentList = methodCallExpression.getArgumentList();
final PsiExpression[] arguments = argumentList.getExpressions();
@@ -395,16 +424,7 @@ public class AutoUnboxingInspection extends BaseInspection {
checkExpression(expression);
}
@Override
public void visitParenthesizedExpression(PsiParenthesizedExpression expression) {
super.visitParenthesizedExpression(expression);
checkExpression(expression);
}
private void checkExpression(PsiExpression expression) {
if (expression.getParent() instanceof PsiParenthesizedExpression) {
return;
}
final PsiType expressionType = expression.getType();
if (!TypeConversionUtil.isAssignableFromPrimitiveWrapper(expressionType)) {
return;
@@ -0,0 +1,9 @@
class ExplititTypeArguments2 {
void x(boolean x) {
if ((x ? ExplititTypeArguments2.<Boolean>a() : (x ? (Boolean) a() : ExplititTypeArguments2.<Boolean>a())).booleanValue()) ;
}
private static <T> T a() {
return null;
}
}
@@ -0,0 +1,9 @@
class ExplititTypeArguments2 {
void x(boolean x) {
if (x <caret>? a() : (x ? (Boolean)a() : a())) ;
}
private static <T> T a() {
return null;
}
}
@@ -115,5 +115,6 @@ public class AutoUnboxing {
case A,B: break <warning descr="Auto-unboxing 'integer'">integer</warning>;
case C: break <warning descr="Auto-unboxing 'integer'">integer</warning>;
};
if ((switch(0) {default -> false;})) {}
}
}
@@ -19,4 +19,5 @@ public class AutoUnboxingExplicitFixTest extends IGQuickFixesTestCase {
public void testSwitchExpressionPrecedence() { doTest(); }
public void testMethodCallPrecedence() { doTest(); }
public void testExplicitTypeArguments() { doTest(); }
public void testExplicitTypeArguments2() { doTest(); }
}