From 66683d295236241d1a3826f2a7cc4cac3427321b Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 28 Apr 2021 19:07:31 +0300 Subject: [PATCH] Unwrap both parts of light element in KtLightElementBase.isEquivalentTo Even if origins are same, wrapped light elements are not equivalent. Revealed by running bunch of JavaAgainstKotlinBinariesCheckerTestGenerated tests. com.intellij.testFramework.LoggedErrorProcessor$TestLoggerAssertionError: Non-idempotent computation: it returns different results when invoked multiple times or on different threads: KtLightMethodForDecompiledDeclaration of KtLightClassForDecompiledDeclaration of PsiFile:A.class != KtLightMethodForDecompiledDeclaration of KtLightClassForDecompiledDeclaration of PsiFile:A.class --- .../kotlin/asJava/elements/KtLightElementBase.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt index 322b40753f3..7c953f78117 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt @@ -44,6 +44,13 @@ abstract class KtLightElementBase(private var parent: PsiElement) : LightElement override fun getPresentation() = (kotlinOrigin ?: this).let { ItemPresentationProviders.getItemPresentation(it) } override fun isValid() = parent.isValid && (kotlinOrigin?.isValid != false) override fun findElementAt(offset: Int) = kotlinOrigin?.findElementAt(offset) - override fun isEquivalentTo(another: PsiElement?): Boolean = - super.isEquivalentTo(another) || kotlinOrigin?.isEquivalentTo(another) == true + override fun isEquivalentTo(another: PsiElement?): Boolean { + if (super.isEquivalentTo(another)) { + return true + } + + val origin = kotlinOrigin ?: return false + return origin.isEquivalentTo(another) || + (another is KtLightElementBase && origin.isEquivalentTo(another.kotlinOrigin)) + } }