From 62c12864f34cbf936ed8bb6aa819f861170965d4 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 22 Jul 2022 23:13:23 +0200 Subject: [PATCH] [Symbol LC] do not fail in LC on enum subtyping check --- .../symbol/classes/firLightClassUtils.kt | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt index 65fcbc1e05b..305032d648a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/firLightClassUtils.kt @@ -452,18 +452,39 @@ context(KtAnalysisSession) context(KtAnalysisSession) internal fun KtClassOrObject.checkIsInheritor(superClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean { if (this == superClassOrigin) return false + if (superClassOrigin is KtEnumEntry) { + return false // enum entry cannot have inheritors + } if (!superClassOrigin.canBeAnalysed()) { return false } - val subClassSymbol = this@checkIsInheritor.getClassOrObjectSymbol() + val superClassSymbol = superClassOrigin.getClassOrObjectSymbol() - if (subClassSymbol == superClassSymbol) return false + when (this) { + is KtEnumEntry -> { + val enumEntrySymbol = this.getEnumEntrySymbol() + val classId = enumEntrySymbol.containingEnumClassIdIfNonLocal ?: return false + val enumClassSymbol = classId.getCorrespondingToplevelClassOrObjectSymbol() ?: return false + if (enumClassSymbol == superClassSymbol) return true + return if (checkDeep) { + enumClassSymbol.isSubClassOf(superClassSymbol) + } else { + false + } + } - return if (checkDeep) { - subClassSymbol.isSubClassOf(superClassSymbol) - } else { - subClassSymbol.isDirectSubClassOf(superClassSymbol) + else -> { + val subClassSymbol = this.getClassOrObjectSymbol() + + if (subClassSymbol == superClassSymbol) return false + + return if (checkDeep) { + subClassSymbol.isSubClassOf(superClassSymbol) + } else { + subClassSymbol.isDirectSubClassOf(superClassSymbol) + } + } } }