Provide SerializerExtension methods with child DescriptorSerializer instance

to make Native be able to serialize backing properties and inline bodies.
Change visibility for functions and properties of DescriptorSerializer.
This commit is contained in:
Pavel Punegov
2018-10-30 18:57:13 +03:00
committed by Pavel Punegov
parent 726b9272f3
commit fe0a2bc75e
6 changed files with 84 additions and 55 deletions
@@ -35,25 +35,30 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri
get() = JvmMetadataVersion.INVALID_VERSION get() = JvmMetadataVersion.INVALID_VERSION
override fun serializeClass( override fun serializeClass(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
super.serializeClass(descriptor, proto, versionRequirementTable) super.serializeClass(descriptor, proto, versionRequirementTable, childSerializer)
if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) {
proto.setExtension(JavaClassProtoBuf.isPackagePrivateClass, true) proto.setExtension(JavaClassProtoBuf.isPackagePrivateClass, true)
} }
} }
override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { override fun serializeConstructor(descriptor: ConstructorDescriptor,
super.serializeConstructor(descriptor, proto) proto: ProtoBuf.Constructor.Builder,
childSerializer: DescriptorSerializer) {
super.serializeConstructor(descriptor, proto, childSerializer)
if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) {
proto.setExtension(JavaClassProtoBuf.isPackagePrivateConstructor, true) proto.setExtension(JavaClassProtoBuf.isPackagePrivateConstructor, true)
} }
} }
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { override fun serializeFunction(descriptor: FunctionDescriptor,
super.serializeFunction(descriptor, proto) proto: ProtoBuf.Function.Builder,
childSerializer: DescriptorSerializer) {
super.serializeFunction(descriptor, proto, childSerializer)
if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) {
proto.setExtension(JavaClassProtoBuf.isPackagePrivateMethod, true) proto.setExtension(JavaClassProtoBuf.isPackagePrivateMethod, true)
} }
@@ -64,11 +69,12 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri
} }
override fun serializeProperty( override fun serializeProperty(
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder, proto: ProtoBuf.Property.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
super.serializeProperty(descriptor, proto, versionRequirementTable) super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer)
if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) {
proto.setExtension(JavaClassProtoBuf.isPackagePrivateField, true) proto.setExtension(JavaClassProtoBuf.isPackagePrivateField, true)
} }
@@ -49,9 +49,10 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
override fun shouldUseTypeTable(): Boolean = useTypeTable override fun shouldUseTypeTable(): Boolean = useTypeTable
override fun serializeClass( override fun serializeClass(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
if (moduleName != JvmAbi.DEFAULT_MODULE_NAME) { if (moduleName != JvmAbi.DEFAULT_MODULE_NAME) {
proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)) proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName))
@@ -134,7 +135,9 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
} }
} }
override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { override fun serializeConstructor(descriptor: ConstructorDescriptor,
proto: ProtoBuf.Constructor.Builder,
childSerializer: DescriptorSerializer) {
val method = bindings.get(METHOD_FOR_FUNCTION, descriptor) val method = bindings.get(METHOD_FOR_FUNCTION, descriptor)
if (method != null) { if (method != null) {
val signature = SignatureSerializer().methodSignature(descriptor, method) val signature = SignatureSerializer().methodSignature(descriptor, method)
@@ -144,7 +147,9 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
} }
} }
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { override fun serializeFunction(descriptor: FunctionDescriptor,
proto: ProtoBuf.Function.Builder,
childSerializer: DescriptorSerializer) {
val method = bindings.get(METHOD_FOR_FUNCTION, descriptor) val method = bindings.get(METHOD_FOR_FUNCTION, descriptor)
if (method != null) { if (method != null) {
val signature = SignatureSerializer().methodSignature(descriptor, method) val signature = SignatureSerializer().methodSignature(descriptor, method)
@@ -155,9 +160,10 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
} }
override fun serializeProperty( override fun serializeProperty(
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder, proto: ProtoBuf.Property.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
val signatureSerializer = SignatureSerializer() val signatureSerializer = SignatureSerializer()
@@ -44,13 +44,13 @@ class DescriptorSerializer private constructor(
private val containingDeclaration: DeclarationDescriptor?, private val containingDeclaration: DeclarationDescriptor?,
private val typeParameters: Interner<TypeParameterDescriptor>, private val typeParameters: Interner<TypeParameterDescriptor>,
private val extension: SerializerExtension, private val extension: SerializerExtension,
private val typeTable: MutableTypeTable, val typeTable: MutableTypeTable,
private val versionRequirementTable: MutableVersionRequirementTable, private val versionRequirementTable: MutableVersionRequirementTable,
private val serializeTypeTableToFunction: Boolean private val serializeTypeTableToFunction: Boolean
) { ) {
private val contractSerializer = ContractSerializer() private val contractSerializer = ContractSerializer()
private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer = fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer =
DescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable, DescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
serializeTypeTableToFunction = false) serializeTypeTableToFunction = false)
@@ -145,7 +145,7 @@ class DescriptorSerializer private constructor(
builder.addAllVersionRequirement(serializeVersionRequirements(classDescriptor)) builder.addAllVersionRequirement(serializeVersionRequirements(classDescriptor))
extension.serializeClass(classDescriptor, builder, versionRequirementTable) extension.serializeClass(classDescriptor, builder, versionRequirementTable, this)
writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable) writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable)
@@ -269,7 +269,7 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
} }
extension.serializeProperty(descriptor, builder, versionRequirementTable) extension.serializeProperty(descriptor, builder, versionRequirementTable, local)
return builder return builder
} }
@@ -344,7 +344,7 @@ class DescriptorSerializer private constructor(
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this) contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
extension.serializeFunction(descriptor, builder) extension.serializeFunction(descriptor, builder, local)
return builder return builder
} }
@@ -375,7 +375,7 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
} }
extension.serializeConstructor(descriptor, builder) extension.serializeConstructor(descriptor, builder, local)
return builder return builder
} }
@@ -402,7 +402,7 @@ class DescriptorSerializer private constructor(
) )
} }
fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder { private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder {
val builder = ProtoBuf.TypeAlias.newBuilder() val builder = ProtoBuf.TypeAlias.newBuilder()
val local = createChildSerializer(descriptor) val local = createChildSerializer(descriptor)
@@ -442,7 +442,7 @@ class DescriptorSerializer private constructor(
return builder return builder
} }
fun enumEntryProto(descriptor: ClassDescriptor): ProtoBuf.EnumEntry.Builder { private fun enumEntryProto(descriptor: ClassDescriptor): ProtoBuf.EnumEntry.Builder {
val builder = ProtoBuf.EnumEntry.newBuilder() val builder = ProtoBuf.EnumEntry.newBuilder()
builder.name = getSimpleNameIndex(descriptor.name) builder.name = getSimpleNameIndex(descriptor.name)
extension.serializeEnumEntry(descriptor, builder) extension.serializeEnumEntry(descriptor, builder)
@@ -517,7 +517,7 @@ class DescriptorSerializer private constructor(
return builder return builder
} }
internal fun typeId(type: KotlinType): Int = typeTable[type(type)] fun typeId(type: KotlinType): Int = typeTable[type(type)]
internal fun type(type: KotlinType): ProtoBuf.Type.Builder { internal fun type(type: KotlinType): ProtoBuf.Type.Builder {
val builder = ProtoBuf.Type.newBuilder() val builder = ProtoBuf.Type.newBuilder()
@@ -32,25 +32,31 @@ abstract class SerializerExtension {
open fun serializeClass( open fun serializeClass(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
} }
open fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) { open fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) {
} }
open fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { open fun serializeConstructor(descriptor: ConstructorDescriptor,
proto: ProtoBuf.Constructor.Builder,
childSerializer: DescriptorSerializer) {
} }
open fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { open fun serializeFunction(descriptor: FunctionDescriptor,
proto: ProtoBuf.Function.Builder,
childSerializer: DescriptorSerializer) {
} }
open fun serializeProperty( open fun serializeProperty(
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder, proto: ProtoBuf.Property.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
} }
@@ -28,9 +28,10 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt
override val stringTable = StringTableImpl() override val stringTable = StringTableImpl()
override fun serializeClass( override fun serializeClass(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
for (annotation in descriptor.nonSourceAnnotations) { for (annotation in descriptor.nonSourceAnnotations) {
proto.addExtension(protocol.classAnnotation, annotationSerializer.serializeAnnotation(annotation)) proto.addExtension(protocol.classAnnotation, annotationSerializer.serializeAnnotation(annotation))
@@ -41,22 +42,27 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt
proto.setExtension(protocol.packageFqName, stringTable.getPackageFqNameIndex(packageFqName)) proto.setExtension(protocol.packageFqName, stringTable.getPackageFqNameIndex(packageFqName))
} }
override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { override fun serializeConstructor(descriptor: ConstructorDescriptor,
proto: ProtoBuf.Constructor.Builder,
childSerializer: DescriptorSerializer) {
for (annotation in descriptor.nonSourceAnnotations) { for (annotation in descriptor.nonSourceAnnotations) {
proto.addExtension(protocol.constructorAnnotation, annotationSerializer.serializeAnnotation(annotation)) proto.addExtension(protocol.constructorAnnotation, annotationSerializer.serializeAnnotation(annotation))
} }
} }
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { override fun serializeFunction(descriptor: FunctionDescriptor,
proto: ProtoBuf.Function.Builder,
childSerializer: DescriptorSerializer) {
for (annotation in descriptor.nonSourceAnnotations) { for (annotation in descriptor.nonSourceAnnotations) {
proto.addExtension(protocol.functionAnnotation, annotationSerializer.serializeAnnotation(annotation)) proto.addExtension(protocol.functionAnnotation, annotationSerializer.serializeAnnotation(annotation))
} }
} }
override fun serializeProperty( override fun serializeProperty(
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder, proto: ProtoBuf.Property.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
for (annotation in descriptor.nonSourceAnnotations) { for (annotation in descriptor.nonSourceAnnotations) {
proto.addExtension(protocol.propertyAnnotation, annotationSerializer.serializeAnnotation(annotation)) proto.addExtension(protocol.propertyAnnotation, annotationSerializer.serializeAnnotation(annotation))
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTabl
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.source.PsiSourceFile import org.jetbrains.kotlin.resolve.source.PsiSourceFile
import org.jetbrains.kotlin.serialization.DescriptorSerializer
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.types.FlexibleType import org.jetbrains.kotlin.types.FlexibleType
@@ -41,35 +42,39 @@ class KotlinJavascriptSerializerExtension(
} }
override fun serializeClass( override fun serializeClass(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
val id = getFileId(descriptor) val id = getFileId(descriptor)
if (id != null) { if (id != null) {
proto.setExtension(JsProtoBuf.classContainingFileId, id) proto.setExtension(JsProtoBuf.classContainingFileId, id)
} }
super.serializeClass(descriptor, proto, versionRequirementTable) super.serializeClass(descriptor, proto, versionRequirementTable, childSerializer)
} }
override fun serializeProperty( override fun serializeProperty(
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder, proto: ProtoBuf.Property.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable,
childSerializer: DescriptorSerializer
) { ) {
val id = getFileId(descriptor) val id = getFileId(descriptor)
if (id != null) { if (id != null) {
proto.setExtension(JsProtoBuf.propertyContainingFileId, id) proto.setExtension(JsProtoBuf.propertyContainingFileId, id)
} }
super.serializeProperty(descriptor, proto, versionRequirementTable) super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer)
} }
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { override fun serializeFunction(descriptor: FunctionDescriptor,
proto: ProtoBuf.Function.Builder,
childSerializer: DescriptorSerializer) {
val id = getFileId(descriptor) val id = getFileId(descriptor)
if (id != null) { if (id != null) {
proto.setExtension(JsProtoBuf.functionContainingFileId, id) proto.setExtension(JsProtoBuf.functionContainingFileId, id)
} }
super.serializeFunction(descriptor, proto) super.serializeFunction(descriptor, proto, childSerializer)
} }
private fun getFileId(descriptor: DeclarationDescriptor): Int? { private fun getFileId(descriptor: DeclarationDescriptor): Int? {