[Symbol LC] do not fail in LC on enum subtyping check

This commit is contained in:
Ilya Kirillov
2022-07-22 23:13:23 +02:00
parent 71dd066288
commit 62c12864f3
@@ -452,18 +452,39 @@ context(KtAnalysisSession)
context(KtAnalysisSession) context(KtAnalysisSession)
internal fun KtClassOrObject.checkIsInheritor(superClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean { internal fun KtClassOrObject.checkIsInheritor(superClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
if (this == superClassOrigin) return false if (this == superClassOrigin) return false
if (superClassOrigin is KtEnumEntry) {
return false // enum entry cannot have inheritors
}
if (!superClassOrigin.canBeAnalysed()) { if (!superClassOrigin.canBeAnalysed()) {
return false return false
} }
val subClassSymbol = this@checkIsInheritor.getClassOrObjectSymbol()
val superClassSymbol = superClassOrigin.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) { else -> {
subClassSymbol.isSubClassOf(superClassSymbol) val subClassSymbol = this.getClassOrObjectSymbol()
} else {
subClassSymbol.isDirectSubClassOf(superClassSymbol) if (subClassSymbol == superClassSymbol) return false
return if (checkDeep) {
subClassSymbol.isSubClassOf(superClassSymbol)
} else {
subClassSymbol.isDirectSubClassOf(superClassSymbol)
}
}
} }
} }