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 typeParameter = access.findTypeParameter(index)
val argumentFirType = (argument as FirTypeProjectionWithVariance).typeRef val argumentFirType = (argument as FirTypeProjectionWithVariance).typeRef
val argumentIrType = if (typeParameter?.isReified == true) { val argumentIrType = if (typeParameter?.isReified == true) {
argumentFirType.approximatedIfNeededOrSelf(approximator, Visibilities.Public).toIrType() argumentFirType.approximatedForPublicPosition(approximator).toIrType()
} else { } else {
argumentFirType.toIrType() argumentFirType.toIrType()
} }
@@ -256,16 +256,19 @@ fun FirTypeRef.approximatedIfNeededOrSelf(
containingCallableVisibility: Visibility?, containingCallableVisibility: Visibility?,
isInlineFunction: Boolean = false isInlineFunction: Boolean = false
): FirTypeRef { ): FirTypeRef {
val approximatedType = if (this is FirResolvedTypeRef && val approximated = if (containingCallableVisibility == Visibilities.Public || containingCallableVisibility == Visibilities.Protected)
(containingCallableVisibility == Visibilities.Public || containingCallableVisibility == Visibilities.Protected) approximatedForPublicPosition(approximator)
) { else
if (type.requiresApproximationInPublicPosition()) this.approximated(approximator, toSuper = true) else this
} else {
this this
} return approximated.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction).withoutEnhancedNullability()
return approximatedType.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 { private fun ConeKotlinType.requiresApproximationInPublicPosition(): Boolean {
return when (this) { return when (this) {
is ConeIntegerLiteralType, is ConeIntegerLiteralType,
@@ -31,7 +31,7 @@ open class K : J() {
private val privateKProp = Unit private val privateKProp = Unit
} }
class L : K() { open class L : K() {
fun publicLFun() {} fun publicLFun() {}
private fun privateLFun() {} private fun privateLFun() {}
val publicLProp = Unit val publicLProp = Unit
@@ -43,10 +43,18 @@ inline fun <reified T> test(vararg names: String) {
} }
fun box(): 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<I>("publicStaticI", "publicMemberI", "privateStaticI", "privateMemberI")
test<J>("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ") test<J>("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ")
test<K>("publicKFun", "privateKFun", "publicKProp", "privateKProp") test<K>("publicKFun", "privateKFun", "publicKProp", "privateKProp")
test<L>("publicLFun", "privateLFun", "publicLProp", "privateLProp") test<L>("publicLFun", "privateLFun", "publicLProp", "privateLProp")
test<Local>("publicLocalFun", "privateLocalFun", "publicLocalProp", "privateLocalProp")
return "OK" return "OK"
} }