[FIR] Support of intersection types in bareTypes.doUnify ^KT-48832 Fixed

This commit is contained in:
Ivan Kochurkin
2021-11-09 23:25:35 +03:00
committed by TeamCityServer
parent a509e819b5
commit 98cce8e05b
3 changed files with 25 additions and 2 deletions
@@ -16,6 +16,6 @@ FILE: castToBareType.kt
public final fun foo(firAdaptee: R|FirFunction<*>|): R|kotlin/Unit| {
}
public final fun test(symbol: R|AbstractFirBasedSymbol<*>|): R|kotlin/Unit| {
lval firAdaptee: R|FirFunction<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out kotlin/Any?> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)>| = (R|<local>/symbol|.R|SubstitutionOverride</AbstractFirBasedSymbol.fir: R|CapturedType(*)|>| as R|FirFunction<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out kotlin/Any?> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)>|)
lval firAdaptee: R|FirFunction<FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out kotlin/Any?> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)>>| = (R|<local>/symbol|.R|SubstitutionOverride</AbstractFirBasedSymbol.fir: R|CapturedType(*)|>| as R|FirFunction<FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out it(FirSymbolOwner<out kotlin/Any?> & FirDeclaration)> & FirDeclaration)> & FirDeclaration)>>|)
R|/foo|(R|<local>/firAdaptee|)
}
@@ -12,6 +12,6 @@ interface AbstractFirBasedSymbol<E> where E : FirSymbolOwner<E>, E : FirDeclarat
fun foo(firAdaptee: FirFunction<*>) {}
fun test(symbol: AbstractFirBasedSymbol<*>) {
val firAdaptee = symbol.fir <!UNCHECKED_CAST!>as FirFunction<!> // TODO: KT-48832
val firAdaptee = symbol.fir as FirFunction
foo(firAdaptee)
}
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
fun BodyResolveComponents.computeRepresentativeTypeForBareType(type: ConeClassLikeType, originalType: ConeKotlinType): ConeKotlinType? {
originalType.lowerBoundIfFlexible().fullyExpandedType(session).let {
@@ -90,6 +91,28 @@ private fun BodyResolveComponents.doUnify(
val originalType = originalTypeProjection.type
val typeWithParameters = typeWithParametersProjection.type
if (originalType is ConeIntersectionType) {
val intersectionResult = mutableMapOf<FirTypeParameterRef, ConeTypeProjection>()
for (intersectedType in originalType.intersectedTypes) {
val localResult = mutableMapOf<FirTypeParameterRef, ConeTypeProjection>()
if (!doUnify(intersectedType, typeWithParametersProjection, targetTypeParameters, localResult)) return false
for ((typeParameter, typeProjection) in localResult) {
val existingTypeProjection = intersectionResult[typeParameter]
if (existingTypeProjection == null
|| (typeProjection is KotlinTypeMarker &&
existingTypeProjection is KotlinTypeMarker &&
AbstractTypeChecker.isSubtypeOf(session.typeContext, typeProjection, existingTypeProjection))
) {
intersectionResult[typeParameter] = typeProjection
}
}
}
for ((key, value) in intersectionResult) {
result[key] = value
}
return true
}
// in Foo ~ in X => Foo ~ X
if (originalTypeProjection.kind == typeWithParametersProjection.kind &&
originalTypeProjection.kind != ProjectionKind.INVARIANT && originalTypeProjection.kind != ProjectionKind.STAR) {