diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 4929f90abbd..671e8c62eda 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -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() } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index 9fe8a454905..cf0f97ff074 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -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, diff --git a/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt b/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt index 70a22cfb28c..85e6ba8d159 100644 --- a/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt +++ b/compiler/testData/codegen/box/reflection/classes/declaredMembers.kt @@ -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 test(vararg names: String) { } fun box(): String { + class Local : L() { + fun publicLocalFun() {} + private fun privateLocalFun() {} + val publicLocalProp = Unit + private var privateLocalProp = Unit + } + test("publicStaticI", "publicMemberI", "privateStaticI", "privateMemberI") test("publicStaticJ", "publicMemberJ", "privateStaticJ", "privateMemberJ") test("publicKFun", "privateKFun", "publicKProp", "privateKProp") test("publicLFun", "privateLFun", "publicLProp", "privateLProp") + test("publicLocalFun", "privateLocalFun", "publicLocalProp", "privateLocalProp") return "OK" }