[klibs] header klibs should keep private interfaces

^KT-62213 Fixed
This commit is contained in:
Johan Bay
2023-09-29 11:33:47 +02:00
committed by Space Cloud
parent e43b634122
commit fb1d2278a0
4 changed files with 16 additions and 1 deletions
@@ -7,9 +7,11 @@ package org.jetbrains.kotlin.fir.serialization
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.utils.isInterface
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic
import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.languageVersionSettings
@@ -54,4 +56,6 @@ fun FirMemberDeclaration.isNotExpectOrShouldBeSerialized(actualizedExpectDeclara
fun FirMemberDeclaration.isNotPrivateOrShouldBeSerialized(produceHeaderKlib: Boolean): Boolean { fun FirMemberDeclaration.isNotPrivateOrShouldBeSerialized(produceHeaderKlib: Boolean): Boolean {
return !produceHeaderKlib || visibility.isPublicAPI return !produceHeaderKlib || visibility.isPublicAPI
// Always keep private interfaces as they can be part of public type hierarchies.
|| (this as? FirClass)?.isInterface == true
} }
@@ -1271,6 +1271,8 @@ open class IrFileSerializer(
private fun skipIfPrivate(declaration: IrDeclaration) = private fun skipIfPrivate(declaration: IrDeclaration) =
skipPrivateApi && (declaration as? IrDeclarationWithVisibility)?.visibility?.isPublicAPI != true skipPrivateApi && (declaration as? IrDeclarationWithVisibility)?.visibility?.isPublicAPI != true
// Always keep private interfaces as they can be part of public type hierarchies.
&& (declaration as? IrClass)?.isInterface != true
open fun memberNeedsSerialization(member: IrDeclaration): Boolean { open fun memberNeedsSerialization(member: IrDeclaration): Boolean {
val parent = member.parent val parent = member.parent
@@ -5,7 +5,11 @@ interface I {
fun iMethod(): Int fun iMethod(): Int
} }
open class A : I { private interface K {
fun kMethod() = 42
}
open class A : I, K {
override val iProperty: Int = 0 override val iProperty: Int = 0
override fun iMethod(): Int = 10 override fun iMethod(): Int = 10
@@ -7,6 +7,10 @@ fun useI(i: I) {
i.iMethod() i.iMethod()
} }
fun useK(k: A) {
k.kMethod()
}
fun useA(a: A) { fun useA(a: A) {
a.iProperty a.iProperty
a.iMethod() a.iMethod()
@@ -37,6 +41,7 @@ fun useC(b: String) {
fun runAppAndReturnOk(): String { fun runAppAndReturnOk(): String {
useI(A()) useI(A())
useK(A())
useA(A()) useA(A())
useB(B()) useB(B())
useC("test") useC("test")