diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java index efa3e5cf28e6..d9cd1fd2b2a7 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java @@ -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; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.after.java new file mode 100644 index 000000000000..0f4fc8a31901 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.after.java @@ -0,0 +1,9 @@ +class ExplititTypeArguments2 { + void x(boolean x) { + if ((x ? ExplititTypeArguments2.a() : (x ? (Boolean) a() : ExplititTypeArguments2.a())).booleanValue()) ; + } + + private static T a() { + return null; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.java new file mode 100644 index 000000000000..13c70f292b1d --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/jdk/auto_unboxing/ExplicitTypeArguments2.java @@ -0,0 +1,9 @@ +class ExplititTypeArguments2 { + void x(boolean x) { + if (x ? a() : (x ? (Boolean)a() : a())) ; + } + + private static T a() { + return null; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java index e3efc23d27f9..c53142d4f746 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java @@ -115,5 +115,6 @@ public class AutoUnboxing { case A,B: break integer; case C: break integer; }; + if ((switch(0) {default -> false;})) {} } } diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/jdk/AutoUnboxingExplicitFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/jdk/AutoUnboxingExplicitFixTest.java index 4db1bcd21b03..4daa45eb6614 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/jdk/AutoUnboxingExplicitFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/jdk/AutoUnboxingExplicitFixTest.java @@ -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(); } } \ No newline at end of file