FIR2IR: do not approximate reified type arguments to super class

This commit is contained in:
pyos
2020-12-08 10:31:14 +01:00
committed by Mikhail Glukhikh
parent 148d540580
commit 12f936f6b7
3 changed files with 20 additions and 9 deletions
@@ -657,7 +657,7 @@ class CallAndReferenceGenerator(
val typeParameter = access.findTypeParameter(index)
val argumentFirType = (argument as FirTypeProjectionWithVariance).typeRef
val argumentIrType = if (typeParameter?.isReified == true) {
argumentFirType.approximatedIfNeededOrSelf(approximator, Visibilities.Public).toIrType()
argumentFirType.approximatedForPublicPosition(approximator).toIrType()
} else {
argumentFirType.toIrType()
}
@@ -256,16 +256,19 @@ fun FirTypeRef.approximatedIfNeededOrSelf(
containingCallableVisibility: Visibility?,
isInlineFunction: Boolean = false
): FirTypeRef {
val approximatedType = if (this is FirResolvedTypeRef &&
(containingCallableVisibility == Visibilities.Public || containingCallableVisibility == Visibilities.Protected)
) {
if (type.requiresApproximationInPublicPosition()) this.approximated(approximator, toSuper = true) else this
} else {
val approximated = if (containingCallableVisibility == Visibilities.Public || containingCallableVisibility == Visibilities.Protected)
approximatedForPublicPosition(approximator)
else
this
}
return approximatedType.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction).withoutEnhancedNullability()
return approximated.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction).withoutEnhancedNullability()
}
fun FirTypeRef.approximatedForPublicPosition(approximator: AbstractTypeApproximator): FirTypeRef =
if (this is FirResolvedTypeRef && type.requiresApproximationInPublicPosition())
this.approximated(approximator, toSuper = true)
else
this
private fun ConeKotlinType.requiresApproximationInPublicPosition(): Boolean {
return when (this) {
is ConeIntegerLiteralType,