[K/N] keep internal members in header klibs

This is also the behavior of jvm-abi-gen and desired to support
friend modules.
^KT-65442
This commit is contained in:
Johan Bay
2024-01-09 15:32:15 +01:00
committed by Space Cloud
parent a2516548e4
commit 446db595ce
12 changed files with 27 additions and 35 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.encodings.*
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSimpleTypeNullability
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.INTERNAL
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrFileEntry
import org.jetbrains.kotlin.ir.declarations.*
@@ -1107,9 +1108,9 @@ open class IrFileSerializer(
.setBase(serializeIrDeclarationBase(property, PropertyFlags.encode(property)))
.setName(serializeName(property.name))
property.backingField?.let { proto.backingField = serializeIrField(it) }
property.getter?.let { proto.getter = serializeIrFunction(it) }
property.setter?.let { proto.setter = serializeIrFunction(it) }
property.backingField?.takeUnless { skipIfPrivate(it) }?.let { proto.backingField = serializeIrField(it) }
property.getter?.takeUnless { skipIfPrivate(it) }?.let { proto.getter = serializeIrFunction(it) }
property.setter?.takeUnless { skipIfPrivate(it) }?.let { proto.setter = serializeIrFunction(it) }
return proto.build()
}
@@ -1269,9 +1270,9 @@ open class IrFileSerializer(
open fun backendSpecificMetadata(irFile: IrFile): FileBackendSpecificMetadata? = null
private fun skipIfPrivate(declaration: IrDeclaration) =
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
skipPrivateApi && (declaration as? IrDeclarationWithVisibility)?.let { !it.visibility.isPublicAPI && it.visibility != INTERNAL } == true
// Always keep private interfaces and type aliases as they can be part of public type hierarchies.
&& (declaration as? IrClass)?.isInterface != true && declaration !is IrTypeAlias
open fun memberNeedsSerialization(member: IrDeclaration): Boolean {
val parent = member.parent
@@ -113,9 +113,10 @@ abstract class KlibMetadataSerializer(
private fun Sequence<DeclarationDescriptor>.filterPrivate(): Sequence<DeclarationDescriptor> =
if (produceHeaderKlib) {
// We keep all interfaces since publicly accessible classes can inherit from private interfaces.
this.filter {
it is ClassDescriptor && it.kind.isInterface || it is DeclarationDescriptorWithVisibility && it.effectiveVisibility().publicApi
val isPublicOrInternal = it is DeclarationDescriptorWithVisibility
&& (it.visibility.isPublicAPI || it.visibility.delegate == Visibilities.Internal)
it is ClassDescriptor && it.kind.isInterface || isPublicOrInternal
}
} else this
@@ -42,7 +42,7 @@ class KlibMetadataSerializerExtension(
DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope)
.filterIsInstance<CallableMemberDescriptor>()
.filter { it.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE }
.filter { it.visibility.isPublicAPI || classDescriptor.isInlineClass() }
.filter { it.visibility.isPublicAPI || it.visibility.delegate == Visibilities.Internal || classDescriptor.isInlineClass() }
)
}
else super.customClassMembersProducer