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() {}}");