From 698594b14db2601bb041c631030ee6f635c01480 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Wed, 20 Mar 2019 20:35:16 +0300 Subject: [PATCH] [IR] Fix classifier equality for Local classes --- .../ir/symbols/IrClassifierEqualityChecker.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrClassifierEqualityChecker.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrClassifierEqualityChecker.kt index 531b4d9a833..b5ae70a7794 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrClassifierEqualityChecker.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrClassifierEqualityChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.symbols import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.name.FqName @@ -30,8 +31,22 @@ object FqNameEqualityChecker : IrClassifierEqualityChecker { return parentFqName?.child(name) } + private fun isLocalClass(declaration: IrClass): Boolean { + var current: IrDeclarationParent? = declaration + while (current != null && current !is IrPackageFragment) { + if (current is IrDeclarationWithVisibility && current.visibility == Visibilities.LOCAL) + return true + current = (current as? IrDeclaration)?.parent + } + + return false + } + private fun checkViaDeclarations(c1: IrSymbolOwner, c2: IrSymbolOwner): Boolean { if (c1 is IrClass && c2 is IrClass) { + if (isLocalClass(c1) || isLocalClass(c2)) + return c1 === c2 // Local declarations should be identical + return c1.fqName == c2.fqName }