From 21cc93860b3112babee5630a27b9f236fa965b62 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 25 Apr 2019 16:07:22 +0300 Subject: [PATCH] [Invariant Fix] Fix KotlinPsiUnifier after types refinement introduction Refined types with non-trivial substitution may result in different descriptors instances See PsiUnifierTestGenerated$Equivalence$Expressions.testArrayAccess --- .../kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt index e21cde4cc7f..455d146dc63 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -123,7 +124,8 @@ class KotlinPsiUnifier( } private fun matchDescriptors(d1: DeclarationDescriptor?, d2: DeclarationDescriptor?): Boolean { - if (d1 == d2 || d2 in declarationPatternsToTargets[d1] || d1 in declarationPatternsToTargets[d2]) return true + if (DescriptorEquivalenceForOverrides.areEquivalent(d1, d2)) return true + if (d2 in declarationPatternsToTargets[d1] || d1 in declarationPatternsToTargets[d2]) return true if (d1 == null || d2 == null) return false val decl1 = DescriptorToSourceUtils.descriptorToDeclaration(d1) as? KtDeclaration