From 7b77a3c1ad275f6d488d56bf1b040dcb176d7f17 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 26 Jan 2024 14:17:41 +0100 Subject: [PATCH] [java-dfa] Correctly unbox variables for contract check Fixes IDEA-343951 Warning about boolean value is always true is wrong GitOrigin-RevId: 365f32fc0ff0fc293bf2608e3b0ad1bb3b58f040 --- .../dataFlow/ContractValue.java | 9 +++++---- .../fixture/BoxedBooleanMethodWithCast.java | 19 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/BoxedBooleanMethodWithCast.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java index 3690eb0af679..79939959c20e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java @@ -1,6 +1,7 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection.dataFlow; +import com.intellij.codeInsight.Nullability; import com.intellij.codeInspection.dataFlow.jvm.SpecialField; import com.intellij.codeInspection.dataFlow.memory.DfaMemoryState; import com.intellij.codeInspection.dataFlow.types.*; @@ -381,11 +382,11 @@ public abstract class ContractValue { public DfaCondition makeCondition(DfaValueFactory factory, DfaCallArguments arguments) { DfaValue left = myLeft.makeDfaValue(factory, arguments); DfaValue right = myRight.makeDfaValue(factory, arguments); - if (left.getDfType() instanceof DfPrimitiveType) { - right = DfaUtil.boxUnbox(right, left.getDfType()); + if (left.getDfType() instanceof DfPrimitiveType primitiveType) { + right = DfaUtil.boxUnbox(right, DfTypes.typedObject(primitiveType.getPsiType(), Nullability.UNKNOWN)); } - if (right.getDfType() instanceof DfPrimitiveType) { - left = DfaUtil.boxUnbox(left, right.getDfType()); + if (right.getDfType() instanceof DfPrimitiveType primitiveType) { + left = DfaUtil.boxUnbox(left, DfTypes.typedObject(primitiveType.getPsiType(), Nullability.UNKNOWN)); } return left.cond(myRelationType, right); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/BoxedBooleanMethodWithCast.java b/java/java-tests/testData/inspection/dataFlow/fixture/BoxedBooleanMethodWithCast.java new file mode 100644 index 000000000000..2836b7bb1a49 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/BoxedBooleanMethodWithCast.java @@ -0,0 +1,19 @@ +public class BoxedBooleanMethodWithCast { + // IDEA-343951 + public static boolean checkObjectType(Object object) { + if (object instanceof Boolean) { + final boolean booleanValue = meansTrue((Boolean) object); + return booleanValue; + } + return false; + } + + public static void main(String[] args) { + System.out.println("True = " + checkObjectType(Boolean.TRUE)); + System.out.println("False = " + checkObjectType(Boolean.FALSE)); + } + + public static boolean meansTrue(Boolean bool) { + return Boolean.TRUE.equals(bool); + } +} \ 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 54c7a9edd52c..d432ce0ceb4a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -743,4 +743,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testNullWarningAfterInstanceofCheck() { doTest(); } public void testNullWarningAfterInstanceofAndNullCheck() { doTest(); } public void testInitializedViaSuperCall() { doTest(); } + public void testBoxedBooleanMethodWithCast() { doTest(); } }