From fccce018961a9e1477c02f902e6d8fbeb0656329 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 10 Feb 2026 16:40:24 +0100 Subject: [PATCH] [java-inspections] IDEA-383492 Wrong warning when casting to (Integer & Serializable) GitOrigin-RevId: 94b399d73658082878f8102e24fc2659173bae08 --- .../src/com/intellij/psi/util/TypeConversionUtil.java | 4 +++- .../fixture/CastIntersectionWithSerializable.java | 8 ++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/CastIntersectionWithSerializable.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index b961f0377540..679a6afb4994 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -1430,10 +1430,11 @@ public final class TypeConversionUtil { public static boolean isPrimitiveWrapper(@NotNull String fullyQualifiedName) { return PRIMITIVE_WRAPPER_FQNS.contains(fullyQualifiedName); } + @Contract("null -> false") public static boolean isAssignableFromPrimitiveWrapper(@Nullable PsiType type) { if (type == null) return false; - if (isPrimitiveWrapper(type)) return true; + if (isPrimitiveWrapper(type)) return true; //leave it as short path; for intersection, there is a double check for (PsiType component : type instanceof PsiIntersectionType ? ((PsiIntersectionType)type).getConjuncts() : new PsiType[]{type}) { if (!(component instanceof PsiClassType)) return false; if (component.equalsToText(JAVA_LANG_OBJECT)) continue; @@ -1442,6 +1443,7 @@ public final class TypeConversionUtil { if (component.equalsToText("java.lang.constant.Constable")) continue; if (component.equalsToText("java.lang.constant.ConstantDesc")) continue; if (PsiTypesUtil.classNameEquals(component, JAVA_LANG_COMPARABLE)) continue; + if (isPrimitiveWrapper(component)) continue; return false; } return true; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/CastIntersectionWithSerializable.java b/java/java-tests/testData/inspection/dataFlow/fixture/CastIntersectionWithSerializable.java new file mode 100644 index 000000000000..c5ca15dab2f2 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/CastIntersectionWithSerializable.java @@ -0,0 +1,8 @@ +import java.io.Serializable; + +class Main { + public static void main(String[] args) { + var x = (Integer & Serializable) 10; + System.out.println(x + 1); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index 7c2c21359fb7..05241ad5bc1e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -762,7 +762,10 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testIoContracts() { doTest(); } public void testGetTernary() { doTest(); } public void testClosureInConstructor() { doTest(); } - + public void testCastIntersectionWithSerializable() { + IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_11, () -> doTest()); + } + public void testHugeMethodFlow() { doTest(); } public void testPrivateFieldPureMethod() { doTest(); } }