From a07f99ad4a2036dc630ffeb63233c0696dc90331 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 24 Sep 2021 18:15:25 +0700 Subject: [PATCH] [kotlin-dfa] Fix float/double comparison GitOrigin-RevId: 68699ea37c4a033fbc047045ee58856657585ba0 --- .../dataFlow/jvm/descriptors/JvmVariableDescriptor.java | 2 +- .../testData/inspection/dataFlow/fixture/DoubleNaN.java | 9 +++++++++ .../kotlin/idea/inspections/dfa/KtVariableDescriptor.kt | 6 +++--- .../tests/testData/inspections/dfa/DoubleComparison.kt | 8 ++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/JvmVariableDescriptor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/JvmVariableDescriptor.java index 4e1ee6c2691f..de385cb80928 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/JvmVariableDescriptor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/jvm/descriptors/JvmVariableDescriptor.java @@ -6,7 +6,7 @@ import com.intellij.codeInspection.dataFlow.types.DfTypes; import com.intellij.codeInspection.dataFlow.value.VariableDescriptor; import org.jetbrains.annotations.NotNull; -abstract class JvmVariableDescriptor implements VariableDescriptor { +public abstract class JvmVariableDescriptor implements VariableDescriptor { @Override public boolean alwaysEqualsToItself(@NotNull DfType type) { return !type.isSuperType(DfTypes.FLOAT_NAN) && diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java b/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java index 1f572babe440..e190832b1c9c 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/DoubleNaN.java @@ -1,4 +1,13 @@ public class DoubleNaN { + void test(double x, double y) { + if (x > y) {} + else if (x == y) {} + else if (x < y) {} + else { + // x or y is NaN + } + } + native double getSomeDouble(); void testComparison() { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtVariableDescriptor.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtVariableDescriptor.kt index c084fb75be24..add558b4c57b 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtVariableDescriptor.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtVariableDescriptor.kt @@ -1,10 +1,10 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.kotlin.idea.inspections.dfa +import com.intellij.codeInspection.dataFlow.jvm.descriptors.JvmVariableDescriptor import com.intellij.codeInspection.dataFlow.types.DfType import com.intellij.codeInspection.dataFlow.value.DfaValueFactory import com.intellij.codeInspection.dataFlow.value.DfaVariableValue -import com.intellij.codeInspection.dataFlow.value.VariableDescriptor import com.intellij.psi.PsiElement import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiTreeUtil @@ -27,7 +27,7 @@ import org.jetbrains.kotlin.resolve.jvm.annotations.VOLATILE_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.types.KotlinType -class KtVariableDescriptor(val variable: KtCallableDeclaration) : VariableDescriptor { +class KtVariableDescriptor(val variable: KtCallableDeclaration) : JvmVariableDescriptor() { val stable: Boolean = calculateStable() private fun calculateStable(): Boolean { @@ -152,7 +152,7 @@ class KtVariableDescriptor(val variable: KtCallableDeclaration) : VariableDescri !target.isExtensionDeclaration() } } -class KtItVariableDescriptor(val lambda: KtElement, val type: KotlinType): VariableDescriptor { +class KtItVariableDescriptor(val lambda: KtElement, val type: KotlinType): JvmVariableDescriptor() { override fun getDfType(qualifier: DfaVariableValue?): DfType = type.toDfType(lambda) override fun isStable(): Boolean = true override fun equals(other: Any?): Boolean = other is KtItVariableDescriptor && other.lambda == lambda diff --git a/plugins/kotlin/idea/tests/testData/inspections/dfa/DoubleComparison.kt b/plugins/kotlin/idea/tests/testData/inspections/dfa/DoubleComparison.kt index 25851df0f29e..21919a29fcce 100644 --- a/plugins/kotlin/idea/tests/testData/inspections/dfa/DoubleComparison.kt +++ b/plugins/kotlin/idea/tests/testData/inspections/dfa/DoubleComparison.kt @@ -1,3 +1,11 @@ // WITH_RUNTIME +fun test(x: Double, y: Double) { + if (x > y) {} + else if (x == y) {} + else if (x < y) {} + else { + // x or y is NaN + } +} fun test1(x: Double) : Boolean = x > 5 fun test2(x: Double) : Boolean = x > 5 && x > 4 \ No newline at end of file