FIR2IR: do not approximate reified type arguments to super class
This commit is contained in:
+1
-1
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user