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 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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user