mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IG: Make unboxing explicit fix now adds type arguments on method calls when needed (IDEA-204071)
This commit is contained in:
+33
-13
@@ -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;
|
||||
|
||||
+9
@@ -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;
|
||||
}
|
||||
}
|
||||
+9
@@ -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;})) {}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -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(); }
|
||||
}
|
||||
Reference in New Issue
Block a user