[FIR] Support of intersection types in bareTypes.doUnify ^KT-48832 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
a509e819b5
commit
98cce8e05b
@@ -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)
|
||||
}
|
||||
|
||||
+23
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user