From 7ea7be6a8b2663d0ab09a7987f29ac80b709e805 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 8 Nov 2022 12:19:49 +0100 Subject: [PATCH] [kotlin-dfa] Fix boxing around constant expression (KTIJ-23542) GitOrigin-RevId: d2ee3c8b29c3a0865ba85c55f2d730c07691d2f0 --- .../idea/inspections/dfa/KtControlFlowBuilder.kt | 11 +++++++---- .../idea/inspections/KtDataFlowInspectionTest.kt | 1 + .../idea/tests/testData/inspections/dfa/AnyType.kt | 11 +++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt index d1ef63ebf388..8b25ad2fffc4 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt @@ -61,6 +61,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor +import org.jetbrains.kotlin.resolve.constants.TypedCompileTimeConstant import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType @@ -141,12 +142,14 @@ class KtControlFlowBuilder(val factory: DfaValueFactory, val context: KtExpressi private fun processConstant(expr: KtExpression?): Boolean { expr ?: return false val context = expr.analyze(BodyResolveMode.PARTIAL) - val constant = ConstantExpressionEvaluator.getConstant(expr, context) ?: return false - val kotlinType = expr.getKotlinType() ?: return false - val value = constant.getValue(kotlinType) ?: return false + val constant = ConstantExpressionEvaluator.getConstant(expr, context) as? TypedCompileTimeConstant<*> ?: return false + val declaredType = expr.getKotlinType() ?: return false + val value = constant.getValue(declaredType) ?: return false if (value !is Int && value !is Long && value !is Float && value !is Double && value !is String) return false - val dfConstantType = DfTypes.constant(value, kotlinType.toDfType()) + val actualType = constant.type + val dfConstantType = DfTypes.constant(value, actualType.toDfType()) addInstruction(PushValueInstruction(dfConstantType, KotlinExpressionAnchor(expr))) + addImplicitConversion(expr, actualType, declaredType) return true } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt index 839c643e04a8..83cfa1b90efc 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.test.TestMetadata @TestMetadata("testData/inspections/dfa") class KtDataFlowInspectionTest : KotlinLightCodeInsightFixtureTestCase() { fun testAlwaysZero() = doTest() + fun testAnyType() = doTest() fun testArrays() = doTest() fun testBoolean() = doTest() fun testBooleanConst() = doTest() diff --git a/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt b/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt new file mode 100644 index 000000000000..c37b16146869 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt @@ -0,0 +1,11 @@ +// WITH_STDLIB +fun main() { + val a: Any = 0 + println(a is Int) +} + +fun main2(b: Boolean) { + var a: Any = 0 + if (b) a = 1 + println(a is Int) +} \ No newline at end of file