[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:
+7
-6
@@ -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
|
||||
|
||||
+3
-2
@@ -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
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user