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,
@@ -31,7 +31,7 @@ open class K : J() {
private val privateKProp = Unit
}
class L : K() {
open class L : K() {
fun publicLFun() {}
private fun privateLFun() {}
val publicLProp = Unit
@@ -43,10 +43,18 @@ inline fun <reified T> test(vararg names: String) {
}
fun box(): String {
class Local : L() {
fun publicLocalFun() {}
private fun privateLocalFun() {}
val publicLocalProp = Unit
private var privateLocalProp = Unit
}
test<I>("publicStaticI", "publicMemberI", "privateStaticI", "privateMemberI")
test<J>("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ")
test<K>("publicKFun", "privateKFun", "publicKProp", "privateKProp")
test<L>("publicLFun", "privateLFun", "publicLProp", "privateLProp")
test<Local>("publicLocalFun", "privateLocalFun", "publicLocalProp", "privateLocalProp")
return "OK"
}