diff --git a/java/java-impl/src/com/intellij/codeInspection/SuspiciousTernaryOperatorInVarargsCallInspection.java b/java/java-impl/src/com/intellij/codeInspection/SuspiciousTernaryOperatorInVarargsCallInspection.java index dc9283c8eb40..9ea1a049167e 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SuspiciousTernaryOperatorInVarargsCallInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/SuspiciousTernaryOperatorInVarargsCallInspection.java @@ -4,12 +4,13 @@ package com.intellij.codeInspection; import com.intellij.java.JavaBundle; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.CommentTracker; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.java.generate.psi.PsiAdapter; public class SuspiciousTernaryOperatorInVarargsCallInspection extends AbstractBaseJavaLocalInspectionTool { @NotNull @@ -25,7 +26,7 @@ public class SuspiciousTernaryOperatorInVarargsCallInspection extends AbstractBa if (argumentList.isEmpty()) return; final PsiExpression[] args = argumentList.getExpressions(); - PsiExpression varargsExpression = ArrayUtil.getLastElement(args); + PsiExpression varargsExpression = PsiUtil.skipParenthesizedExprDown(ArrayUtil.getLastElement(args)); final PsiConditionalExpression conditional = ObjectUtils.tryCast(varargsExpression, PsiConditionalExpression.class); if (conditional == null) return; @@ -45,14 +46,15 @@ public class SuspiciousTernaryOperatorInVarargsCallInspection extends AbstractBa if (isThenArray == elseType instanceof PsiArrayType) return; final PsiExpression nonArray = isThenArray ? elseExpression : thenExpression; - final PsiType nonArrayType = nonArray.getType(); + final PsiExpression array = isThenArray ? thenExpression : elseExpression; PsiClassType varargsType = ObjectUtils.tryCast(varargsExpression.getType(), PsiClassType.class); if (varargsType == null) return; String typeName = varargsType.getName(); final String replacementText = String.format("new %s[]{%s}", typeName, nonArray.getText()); - final LocalQuickFix fix = ClassUtils.isPrimitive(nonArrayType) ? null : new WrapInArrayInitializerFix(replacementText, typeName); + final LocalQuickFix fix = PsiAdapter.isPrimitiveArrayType(array.getType()) ? null : + new WrapInArrayInitializerFix(replacementText, typeName); holder.registerProblem(nonArray, JavaBundle.message("inspection.suspicious.ternary.in.varargs.description"), diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterMoreActualsThanFormals.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterMoreActualsThanFormals.java new file mode 100644 index 000000000000..c32e520cc603 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterMoreActualsThanFormals.java @@ -0,0 +1,12 @@ +// "Replace with 'new Object[]{a}'" "false" +// "Replace with 'new Object[]{b}'" "false" + +class Test { + static void bar(boolean flag) { + Object[] a = {1, 2}; + Object b = "hello"; + foo(0, 1, flag ? a : b); + } + static void foo(int x, Object... xs) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterObject.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterObject.java index 333ee51a937c..09b29a074e62 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterObject.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterObject.java @@ -1,15 +1,10 @@ // "Replace with 'new Object[]{b}'" "true" class Test { - public static void main(String[] args) { + static void bar(boolean flag) { Object[] a = {1, 2}; Object b = "hello"; - foo(0, a); - foo(0, b); - for (boolean flag : new boolean[]{true, false}) { - foo(0, flag ? a : new Object[]{b}); - foo(0, 1, flag ? a : b); - } + foo(0, flag ? a : new Object[]{b}); } static void foo(int x, Object... xs) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterPrimitiveArray.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterPrimitiveArray.java new file mode 100644 index 000000000000..3828923988ee --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterPrimitiveArray.java @@ -0,0 +1,11 @@ +// "Replace with 'new Object[]{b}'" "false" + +class Test { + static void bar(boolean flag) { + int[] a = {1, 2}; + Integer b = 42; + foo(0, flag ? a : b); + } + static void foo(int x, Object... xs) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterSerializable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterSerializable.java index d77db9921a56..6ce2222720c3 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterSerializable.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterSerializable.java @@ -3,15 +3,10 @@ import java.io.Serializable; class Test { - public static void main(String[] args) { + static void bar(boolean flag) { Serializable[] a = {1, 2}; Serializable b = "hello"; - foo(0, a); - foo(0, b); - for (boolean flag : new boolean[]{true, false}) { - foo(0, flag ? a : new Serializable[]{b}); - foo(0, 1, flag ? a : b); - } + foo(0, flag ? a : new Serializable[]{b}); } static void foo(int x, Serializable... xs) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithComment.java new file mode 100644 index 000000000000..330e01adfcdc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithComment.java @@ -0,0 +1,11 @@ +// "Replace with 'new Object[]{getObject(/*empty*/)}'" "true" + +class Test { + static void foo(Object... data) { } + + void test(boolean b, Object[] obj2) { + foo(b ? new Object[]{getObject(/*empty*/)} : obj2); + } + + native Object getObject(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithParentheses.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithParentheses.java new file mode 100644 index 000000000000..eb1c34a0fcd8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/afterWithParentheses.java @@ -0,0 +1,15 @@ +// "Replace with 'new Object[]{b}'" "true" + +class Test { + static void bar(boolean flag) { + Integer[] a = {1, 2}; + Integer b = 42; + foo(0, (((flag ? a : new Object[]{b})))); + } + static void foo(int x, Object... xs) { + } + + public static void main(String[] args) { + bar(true); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeMoreActualsThanFormals.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeMoreActualsThanFormals.java new file mode 100644 index 000000000000..fd10418ec5e6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeMoreActualsThanFormals.java @@ -0,0 +1,12 @@ +// "Replace with 'new Object[]{a}'" "false" +// "Replace with 'new Object[]{b}'" "false" + +class Test { + static void bar(boolean flag) { + Object[] a = {1, 2}; + Object b = "hello"; + foo(0, 1, flag ? a : b); + } + static void foo(int x, Object... xs) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeObject.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeObject.java index 9175f76a9bb8..51a108dc6ed0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeObject.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeObject.java @@ -1,15 +1,10 @@ // "Replace with 'new Object[]{b}'" "true" class Test { - public static void main(String[] args) { + static void bar(boolean flag) { Object[] a = {1, 2}; Object b = "hello"; - foo(0, a); - foo(0, b); - for (boolean flag : new boolean[]{true, false}) { - foo(0, flag ? a : b); - foo(0, 1, flag ? a : b); - } + foo(0, flag ? a : b); } static void foo(int x, Object... xs) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforePrimitiveArray.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforePrimitiveArray.java new file mode 100644 index 000000000000..062b4ee71adf --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforePrimitiveArray.java @@ -0,0 +1,11 @@ +// "Replace with 'new Object[]{b}'" "false" + +class Test { + static void bar(boolean flag) { + int[] a = {1, 2}; + Integer b = 42; + foo(0, flag ? a : b); + } + static void foo(int x, Object... xs) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeSerializable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeSerializable.java index 183de7d4ba3d..bd2493fb9541 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeSerializable.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeSerializable.java @@ -3,15 +3,10 @@ import java.io.Serializable; class Test { - public static void main(String[] args) { + static void bar(boolean flag) { Serializable[] a = {1, 2}; Serializable b = "hello"; - foo(0, a); - foo(0, b); - for (boolean flag : new boolean[]{true, false}) { - foo(0, flag ? a : b); - foo(0, 1, flag ? a : b); - } + foo(0, flag ? a : b); } static void foo(int x, Serializable... xs) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithComment.java new file mode 100644 index 000000000000..b932e6e16719 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithComment.java @@ -0,0 +1,11 @@ +// "Replace with 'new Object[]{getObject(/*empty*/)}'" "true" + +class Test { + static void foo(Object... data) { } + + void test(boolean b, Object[] obj2) { + foo(b ? getObject(/*empty*/) : obj2); + } + + native Object getObject(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithParentheses.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithParentheses.java new file mode 100644 index 000000000000..06d15b2d6bb9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/suspiciousTernaryOperatorInVarargsCall/beforeWithParentheses.java @@ -0,0 +1,15 @@ +// "Replace with 'new Object[]{b}'" "true" + +class Test { + static void bar(boolean flag) { + Integer[] a = {1, 2}; + Integer b = 42; + foo(0, (((flag ? a : b)))); + } + static void foo(int x, Object... xs) { + } + + public static void main(String[] args) { + bar(true); + } +} \ No newline at end of file