From daa27016ca781327669b4d8bb7b7a6590cf27dd2 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 4 Apr 2019 15:43:42 +0300 Subject: [PATCH] [Invariant Fix] Adjust DataFlowValue::Identifier for refinement After refinement is introduced it becomes possible to have a different descriptors instances for effectively the same descriptors Also, it accidentally fixes KT-25432 because is caused by a different version of descriptors created for NewCapturedType ^KT-25432 Fixed --- .../calls/smartcasts/IdentifierInfo.kt | 6 +- .../diagnostics/notLinked/dfa/neg/40.kt | 6 +- .../diagnostics/notLinked/dfa/pos/50.kt | 12 +- .../diagnostics/notLinked/dfa/pos/9.kt | 264 +++++++++--------- 4 files changed, 145 insertions(+), 143 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt index 24609e50c07..b0b625c7bf1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.isSafeCall @@ -59,9 +60,10 @@ interface IdentifierInfo { override val canBeBound get() = kind == STABLE_VALUE - override fun equals(other: Any?) = other is Variable && variable == other.variable + override fun equals(other: Any?) = + other is Variable && DescriptorEquivalenceForOverrides.areCallableDescriptorsEquivalent(variable, other.variable) - override fun hashCode() = variable.hashCode() + override fun hashCode() = variable.name.hashCode() * 31 + variable.containingDeclaration.original.hashCode() override fun toString() = variable.toString() } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/40.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/40.kt index 2418b50f237..343ca2a464a 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/40.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/40.kt @@ -18,7 +18,7 @@ fun case_1(x: Pair<*, *>) { if (x.first !is String) return x.first - x.first.length + x.first.length } /* @@ -28,5 +28,5 @@ fun case_1(x: Pair<*, *>) { fun case_2(x: Pair<*, *>) { if (x.first !is String?) throw Exception() x.first - x.first?.length -} \ No newline at end of file + x.first?.length +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/50.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/50.kt index f0ee96c8535..e4ba32c2ea7 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/50.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/50.kt @@ -75,8 +75,8 @@ fun ClassWithSixTypeParameters.case_5() { */ fun case_6(y: Inv) { if (y.prop_3 is MutableList<*>) { - y.prop_3 - y.prop_3[0] + ")!>y.prop_3 + "), DEBUG_INFO_SMARTCAST!>y.prop_3[0] } } @@ -87,10 +87,10 @@ fun case_6(y: Inv) { */ fun Inv.case_7() { if (this.prop_3 is MutableList<*>) { - this.prop_3 - this.prop_3[0] - prop_3 - prop_3[0] + ")!>this.prop_3 + "), DEBUG_INFO_SMARTCAST!>this.prop_3[0] + ")!>prop_3 + "), DEBUG_INFO_SMARTCAST!>prop_3[0] } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/9.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/9.kt index ba8e133e7e1..b90f0e4d360 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/9.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/9.kt @@ -170,73 +170,73 @@ fun case_8(x: ClassWithThreeTypeParameters?> & ClassWithThreeTypeParameters?>?")!>x.funNullableT() ?> & ClassWithThreeTypeParameters?>?")!>x.funNullableAny() if (x.x != null) { - x.x - x.x.equals(null) - x.x.propT - x.x.propAny - x.x.propNullableT - x.x.propNullableAny - x.x.funT() - x.x.funAny() - x.x.funNullableT() - x.x.funNullableAny() + x.x + x.x.equals(null) + x.x.propT + x.x.propAny + x.x.propNullableT + x.x.propNullableAny + x.x.funT() + x.x.funAny() + x.x.funNullableT() + x.x.funNullableAny() } if (x.y != null) { - x.y - x.y.equals(null) - x.y.propT - x.y.propAny - x.y.propNullableT - x.y.propNullableAny - x.y.funT() - x.y.funAny() - x.y.funNullableT() - x.y.funNullableAny() + x.y + x.y.equals(null) + x.y.propT + x.y.propAny + x.y.propNullableT + x.y.propNullableAny + x.y.funT() + x.y.funAny() + x.y.funNullableT() + x.y.funNullableAny() } if (x.z != null) { - ?")!>x.z - ?")!>x.z.equals(null) - ?")!>x.z.propT - ?")!>x.z.propAny - ?")!>x.z.propNullableT - ?")!>x.z.propNullableAny - ?")!>x.z.funT() - ?")!>x.z.funAny() - ?")!>x.z.funNullableT() - ?")!>x.z.funNullableAny() - if (x.z.x != null) { - x.z.x - x.z.x.equals(null) - x.z.x.propT - x.z.x.propAny - x.z.x.propNullableT - x.z.x.propNullableAny - x.z.x.funT() - x.z.x.funAny() - x.z.x.funNullableT() - x.z.x.funNullableAny() + & ClassWithThreeTypeParameters?")!>x.z + & ClassWithThreeTypeParameters?")!>x.z.equals(null) + & ClassWithThreeTypeParameters?")!>x.z.propT + & ClassWithThreeTypeParameters?")!>x.z.propAny + & ClassWithThreeTypeParameters?")!>x.z.propNullableT + & ClassWithThreeTypeParameters?")!>x.z.propNullableAny + & ClassWithThreeTypeParameters?")!>x.z.funT() + & ClassWithThreeTypeParameters?")!>x.z.funAny() + & ClassWithThreeTypeParameters?")!>x.z.funNullableT() + & ClassWithThreeTypeParameters?")!>x.z.funNullableAny() + if (x.z.x != null) { + x.z.x + x.z.x.equals(null) + x.z.x.propT + x.z.x.propAny + x.z.x.propNullableT + x.z.x.propNullableAny + x.z.x.funT() + x.z.x.funAny() + x.z.x.funNullableT() + x.z.x.funNullableAny() } - if (x.z.y != null && x.z.z != null) { - x.z.y - x.z.z - x.z.y.equals(null) - x.z.y.propT - x.z.y.propAny - x.z.y.propNullableT - x.z.y.propNullableAny - x.z.y.funT() - x.z.y.funAny() - x.z.y.funNullableT() - x.z.y.funNullableAny() - x.z.z.equals(null) - x.z.z.propT - x.z.z.propAny - x.z.z.propNullableT - x.z.z.propNullableAny - x.z.z.funT() - x.z.z.funAny() - x.z.z.funNullableT() - x.z.z.funNullableAny() + if (x.z.y != null && x.z.z != null) { + x.z.y + x.z.z + x.z.y.equals(null) + x.z.y.propT + x.z.y.propAny + x.z.y.propNullableT + x.z.y.propNullableAny + x.z.y.funT() + x.z.y.funAny() + x.z.y.funNullableT() + x.z.y.funNullableAny() + x.z.z.equals(null) + x.z.z.propT + x.z.z.propAny + x.z.z.propNullableT + x.z.z.propNullableAny + x.z.z.funT() + x.z.z.funAny() + x.z.z.funNullableT() + x.z.z.funNullableAny() } } } @@ -428,16 +428,16 @@ fun case_17(a: Inv?>?>?>?>?>?) { */ fun case_18(a: Inv) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -460,16 +460,16 @@ fun case_19(a: Inv) { */ fun case_20(a: Inv) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -480,16 +480,16 @@ fun case_20(a: Inv) { */ fun case_21(a: Out<out Int?>) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -512,16 +512,16 @@ fun case_22(a: Out<out Nothing?>) { */ fun case_23(a: Out<out Any?>) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -572,16 +572,16 @@ fun case_26(a: Out) { */ fun case_27(a: Inv) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -592,16 +592,16 @@ fun case_27(a: Inv) { */ fun case_28(a: Inv) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } } @@ -612,16 +612,16 @@ fun case_28(a: Inv) { */ fun case_29(a: Inv) { if (a.x != null) { - a.x - a.x.equals(null) - a.x.propT - a.x.propAny - a.x.propNullableT - a.x.propNullableAny - a.x.funT() - a.x.funAny() - a.x.funNullableT() - a.x.funNullableAny() + a.x + a.x.equals(null) + a.x.propT + a.x.propAny + a.x.propNullableT + a.x.propNullableAny + a.x.funT() + a.x.funAny() + a.x.funNullableT() + a.x.funNullableAny() } }