[FIR IDE] LC Anonymous to SuperClass type substitution
This commit is contained in:
@@ -14,6 +14,7 @@ import com.intellij.util.IncorrectOperationException
|
|||||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||||
import org.jetbrains.kotlin.asJava.elements.KtLightMember
|
import org.jetbrains.kotlin.asJava.elements.KtLightMember
|
||||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.isPrimitiveType
|
import org.jetbrains.kotlin.fir.isPrimitiveType
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||||
@@ -83,12 +85,21 @@ private class AnonymousTypesSubstitutor(private val session: FirSession, private
|
|||||||
val isAnonymous = type.classId.let { it?.shortClassName?.asString() == SpecialNames.ANONYMOUS }
|
val isAnonymous = type.classId.let { it?.shortClassName?.asString() == SpecialNames.ANONYMOUS }
|
||||||
if (!isAnonymous) return null
|
if (!isAnonymous) return null
|
||||||
|
|
||||||
val firstSuperType = (type.lookupTag.toSymbol(session) as? FirClassSymbol)?.fir
|
fun ConeClassLikeType.isNotInterface(): Boolean {
|
||||||
?.withFirDeclaration(state, FirResolvePhase.SUPER_TYPES) {
|
val firClassNode = lookupTag.toSymbol(session)?.fir as? FirClass ?: return false
|
||||||
(it as? FirClass)?.superConeTypes?.firstOrNull()
|
return firClassNode.withFirDeclaration(state) { firSuperClass ->
|
||||||
|
firSuperClass.classKind != ClassKind.INTERFACE
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (firstSuperType != null) return firstSuperType
|
val firClassNode = (type.lookupTag.toSymbol(session) as? FirClassSymbol)?.fir
|
||||||
|
if (firClassNode != null) {
|
||||||
|
val superTypesCones = firClassNode.withFirDeclaration(state, FirResolvePhase.SUPER_TYPES) {
|
||||||
|
(it as? FirClass)?.superConeTypes
|
||||||
|
}
|
||||||
|
val superClass = superTypesCones?.firstOrNull { it.isNotInterface() }
|
||||||
|
if (superClass != null) return superClass
|
||||||
|
}
|
||||||
|
|
||||||
return if (type.nullability.isNullable) session.builtinTypes.nullableAnyType.type
|
return if (type.nullability.isNullable) session.builtinTypes.nullableAnyType.type
|
||||||
else session.builtinTypes.anyType.type
|
else session.builtinTypes.anyType.type
|
||||||
|
|||||||
Reference in New Issue
Block a user