From ec42e3be577c5c7929298529831a82cec433fac6 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 30 Apr 2024 14:36:32 +0200 Subject: [PATCH] [java-inspections] Do not report redundant cast if any of labels is incompatible with the selector expression Fixes IDEA-352510 False positive 'redundant cast' warning in switch GitOrigin-RevId: b31e6f906bebb9de15c82439006502cc8e01f76f --- .../com/intellij/psi/util/RedundantCastUtil.java | 16 +++++++++++++++- .../inspection/redundantCast/SwitchUnboxing.java | 10 ++++++++++ .../RedundantCastInspectionTest.java | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/redundantCast/SwitchUnboxing.java diff --git a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java index 57ccbdbc73d0..31f82fd4418d 100644 --- a/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-analysis-impl/src/com/intellij/psi/util/RedundantCastUtil.java @@ -22,6 +22,7 @@ import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.bugs.NullArgumentToVariableArgMethodInspection; import com.siyeh.ig.psiutils.ExpectedTypeUtils; import com.siyeh.ig.psiutils.SwitchUtils; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -837,7 +838,20 @@ public final class RedundantCastUtil { } } if (opType != null) { - addIfNarrowing(cast, opType, null); + PsiCodeBlock body = switchBlock.getBody(); + boolean hasInconvertibleLabel = false; + if (body != null) { + hasInconvertibleLabel = StreamEx.of(body.getStatements()).select(PsiSwitchLabelStatementBase.class) + .map(PsiSwitchLabelStatementBase::getCaseLabelElementList) + .nonNull().flatArray(PsiCaseLabelElementList::getElements) + .select(PsiExpression.class) + .map(PsiExpression::getType) + .nonNull() + .anyMatch(t -> !t.isConvertibleFrom(opType)); + } + if (!hasInconvertibleLabel) { + addIfNarrowing(cast, opType, null); + } } } } diff --git a/java/java-tests/testData/inspection/redundantCast/SwitchUnboxing.java b/java/java-tests/testData/inspection/redundantCast/SwitchUnboxing.java new file mode 100644 index 000000000000..eeead314cfa9 --- /dev/null +++ b/java/java-tests/testData/inspection/redundantCast/SwitchUnboxing.java @@ -0,0 +1,10 @@ +class X { + void test() { + Integer integer = (int) 'a'; + + switch ((int) integer) { + case 'a': + default: + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCastInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCastInspectionTest.java index 959bc024b2a4..4036396f4e99 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCastInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCastInspectionTest.java @@ -110,6 +110,8 @@ public class RedundantCastInspectionTest extends LightJavaCodeInsightFixtureTest public void testInConditionalPreserveResolve() { doTest(); } public void testArrayAccess() { doTest(); } + + public void testSwitchUnboxing() { doTest(); } public void testPackagePrivate() { myFixture.addClass("package a; public class A {void foo() {}}");