diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 6665e9766cf..73b01be669a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -28763,6 +28763,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT public void testPackageProperty() throws Exception { runTest("compiler/testData/codegen/box/javaVisibility/package/packageProperty.kt"); } + + @Test + @TestMetadata("publicInterfaceImplementedByPackagePrivateClass.kt") + public void testPublicInterfaceImplementedByPackagePrivateClass() throws Exception { + runTest("compiler/testData/codegen/box/javaVisibility/package/publicInterfaceImplementedByPackagePrivateClass.kt"); + } } @Nested diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index 2e7c117d68a..26b6f773537 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -148,9 +148,12 @@ abstract class FirVisibilityChecker : FirSessionComponent { ): FirClassLikeDeclaration? { return when (this) { is FirCallableDeclaration -> { - if (dispatchReceiverValue != null && dispatchReceiverType != null) { - dispatchReceiverValue.type.findClassRepresentation(dispatchReceiverType!!, session)?.toSymbol(session)?.fir?.let { - return it + if (dispatchReceiverValue != null) { + val baseReceiverType = dispatchReceiverClassTypeOrNull() + if (baseReceiverType != null) { + dispatchReceiverValue.type.findClassRepresentation(baseReceiverType, session)?.toSymbol(session)?.fir?.let { + return it + } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 43968e28f9b..e8114f7ae2f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -19,11 +19,14 @@ fun FirCallableSymbol<*>.dispatchReceiverTypeOrNull(): ConeKotlinType? = fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? = fir.dispatchReceiverClassOrNull() -fun FirCallableDeclaration.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? { - if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride) return symbol.baseForIntersectionOverride!!.fir.dispatchReceiverClassOrNull() +fun FirCallableDeclaration.dispatchReceiverClassTypeOrNull(): ConeClassLikeType? = + if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride) + baseForIntersectionOverride!!.dispatchReceiverClassTypeOrNull() + else + dispatchReceiverType as? ConeClassLikeType - return (dispatchReceiverType as? ConeClassLikeType)?.lookupTag -} +fun FirCallableDeclaration.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? = + dispatchReceiverClassTypeOrNull()?.lookupTag fun FirCallableSymbol<*>.containingClassLookupTag(): ConeClassLikeLookupTag? = fir.containingClassLookupTag() fun FirCallableDeclaration.containingClassLookupTag(): ConeClassLikeLookupTag? { diff --git a/compiler/testData/codegen/box/javaVisibility/package/publicInterfaceImplementedByPackagePrivateClass.kt b/compiler/testData/codegen/box/javaVisibility/package/publicInterfaceImplementedByPackagePrivateClass.kt new file mode 100644 index 00000000000..668b942df71 --- /dev/null +++ b/compiler/testData/codegen/box/javaVisibility/package/publicInterfaceImplementedByPackagePrivateClass.kt @@ -0,0 +1,33 @@ +// TARGET_BACKEND: JVM_IR +// MODULE: lib +// FILE: I.java +package test; + +public interface I { + String foo(); +} + +// FILE: J.java +package test; + +class JBase { + public String foo() { return "OK"; } +} + +public class J extends JBase {} + +// FILE: JImpl.java +package test; + +public class JImpl { + public static class C1 extends J implements I {} + public static class C2 extends J implements I {} +} + +// MODULE: main(lib) +// FILE: main.kt +import test.JImpl + +fun select(a: T, b: T): T = a + +fun box() = select(JImpl.C1(), JImpl.C2()).foo() diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 63a200c3ef8..fbca70ed175 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -28763,6 +28763,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testPackageProperty() throws Exception { runTest("compiler/testData/codegen/box/javaVisibility/package/packageProperty.kt"); } + + @Test + @TestMetadata("publicInterfaceImplementedByPackagePrivateClass.kt") + public void testPublicInterfaceImplementedByPackagePrivateClass() throws Exception { + runTest("compiler/testData/codegen/box/javaVisibility/package/publicInterfaceImplementedByPackagePrivateClass.kt"); + } } @Nested