From fe0a2bc75e1559c1f09f2d5d8ff09d56a2938694 Mon Sep 17 00:00:00 2001 From: Pavel Punegov Date: Tue, 30 Oct 2018 18:57:13 +0300 Subject: [PATCH] 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. --- .../JavaClassesSerializerExtension.kt | 30 +++++++++++-------- .../serialization/JvmSerializerExtension.kt | 22 +++++++++----- .../serialization/DescriptorSerializer.kt | 18 +++++------ .../serialization/SerializerExtension.kt | 22 +++++++++----- .../serialization/SerializerExtensionBase.kt | 22 +++++++++----- .../js/KotlinJavascriptSerializerExtension.kt | 25 +++++++++------- 6 files changed, 84 insertions(+), 55 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt index 02e5dc127d9..9c7cd0aa499 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt @@ -35,25 +35,30 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri get() = JvmMetadataVersion.INVALID_VERSION override fun serializeClass( - descriptor: ClassDescriptor, - proto: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: ClassDescriptor, + proto: ProtoBuf.Class.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { - super.serializeClass(descriptor, proto, versionRequirementTable) + super.serializeClass(descriptor, proto, versionRequirementTable, childSerializer) if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { proto.setExtension(JavaClassProtoBuf.isPackagePrivateClass, true) } } - override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { - super.serializeConstructor(descriptor, proto) + override fun serializeConstructor(descriptor: ConstructorDescriptor, + proto: ProtoBuf.Constructor.Builder, + childSerializer: DescriptorSerializer) { + super.serializeConstructor(descriptor, proto, childSerializer) if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { proto.setExtension(JavaClassProtoBuf.isPackagePrivateConstructor, true) } } - override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { - super.serializeFunction(descriptor, proto) + override fun serializeFunction(descriptor: FunctionDescriptor, + proto: ProtoBuf.Function.Builder, + childSerializer: DescriptorSerializer) { + super.serializeFunction(descriptor, proto, childSerializer) if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { proto.setExtension(JavaClassProtoBuf.isPackagePrivateMethod, true) } @@ -64,11 +69,12 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri } override fun serializeProperty( - descriptor: PropertyDescriptor, - proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { - super.serializeProperty(descriptor, proto, versionRequirementTable) + super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer) if (descriptor.visibility == JavaVisibilities.PACKAGE_VISIBILITY) { proto.setExtension(JavaClassProtoBuf.isPackagePrivateField, true) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index 1c351e5f68b..931d07fdcaf 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -49,9 +49,10 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta override fun shouldUseTypeTable(): Boolean = useTypeTable override fun serializeClass( - descriptor: ClassDescriptor, - proto: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: ClassDescriptor, + proto: ProtoBuf.Class.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { if (moduleName != JvmAbi.DEFAULT_MODULE_NAME) { 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) if (method != null) { 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) if (method != null) { val signature = SignatureSerializer().methodSignature(descriptor, method) @@ -155,9 +160,10 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta } override fun serializeProperty( - descriptor: PropertyDescriptor, - proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { val signatureSerializer = SignatureSerializer() diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 42358f48bbb..1942e363666 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -44,13 +44,13 @@ class DescriptorSerializer private constructor( private val containingDeclaration: DeclarationDescriptor?, private val typeParameters: Interner, private val extension: SerializerExtension, - private val typeTable: MutableTypeTable, + val typeTable: MutableTypeTable, private val versionRequirementTable: MutableVersionRequirementTable, private val serializeTypeTableToFunction: Boolean ) { private val contractSerializer = ContractSerializer() - private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer = + fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer = DescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable, serializeTypeTableToFunction = false) @@ -145,7 +145,7 @@ class DescriptorSerializer private constructor( builder.addAllVersionRequirement(serializeVersionRequirements(classDescriptor)) - extension.serializeClass(classDescriptor, builder, versionRequirementTable) + extension.serializeClass(classDescriptor, builder, versionRequirementTable, this) writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable) @@ -269,7 +269,7 @@ class DescriptorSerializer private constructor( builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } - extension.serializeProperty(descriptor, builder, versionRequirementTable) + extension.serializeProperty(descriptor, builder, versionRequirementTable, local) return builder } @@ -344,7 +344,7 @@ class DescriptorSerializer private constructor( contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this) - extension.serializeFunction(descriptor, builder) + extension.serializeFunction(descriptor, builder, local) return builder } @@ -375,7 +375,7 @@ class DescriptorSerializer private constructor( builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } - extension.serializeConstructor(descriptor, builder) + extension.serializeConstructor(descriptor, builder, local) 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 local = createChildSerializer(descriptor) @@ -442,7 +442,7 @@ class DescriptorSerializer private constructor( return builder } - fun enumEntryProto(descriptor: ClassDescriptor): ProtoBuf.EnumEntry.Builder { + private fun enumEntryProto(descriptor: ClassDescriptor): ProtoBuf.EnumEntry.Builder { val builder = ProtoBuf.EnumEntry.newBuilder() builder.name = getSimpleNameIndex(descriptor.name) extension.serializeEnumEntry(descriptor, builder) @@ -517,7 +517,7 @@ class DescriptorSerializer private constructor( 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 { val builder = ProtoBuf.Type.newBuilder() diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt index 73b6ee821a8..e46711b4374 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt @@ -32,25 +32,31 @@ abstract class SerializerExtension { open fun serializeClass( - descriptor: ClassDescriptor, - proto: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: ClassDescriptor, + proto: ProtoBuf.Class.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { } 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( - descriptor: PropertyDescriptor, - proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt index 511bc80e445..3bd57bd8d1b 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt @@ -28,9 +28,10 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt override val stringTable = StringTableImpl() override fun serializeClass( - descriptor: ClassDescriptor, - proto: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: ClassDescriptor, + proto: ProtoBuf.Class.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { for (annotation in descriptor.nonSourceAnnotations) { 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)) } - 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) { 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) { proto.addExtension(protocol.functionAnnotation, annotationSerializer.serializeAnnotation(annotation)) } } override fun serializeProperty( - descriptor: PropertyDescriptor, - proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { for (annotation in descriptor.nonSourceAnnotations) { proto.addExtension(protocol.propertyAnnotation, annotationSerializer.serializeAnnotation(annotation)) diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt index b720151ba22..a7a2fddb494 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTabl import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.source.PsiSourceFile +import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.types.FlexibleType @@ -41,35 +42,39 @@ class KotlinJavascriptSerializerExtension( } override fun serializeClass( - descriptor: ClassDescriptor, - proto: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: ClassDescriptor, + proto: ProtoBuf.Class.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { val id = getFileId(descriptor) if (id != null) { proto.setExtension(JsProtoBuf.classContainingFileId, id) } - super.serializeClass(descriptor, proto, versionRequirementTable) + super.serializeClass(descriptor, proto, versionRequirementTable, childSerializer) } override fun serializeProperty( - descriptor: PropertyDescriptor, - proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable + descriptor: PropertyDescriptor, + proto: ProtoBuf.Property.Builder, + versionRequirementTable: MutableVersionRequirementTable, + childSerializer: DescriptorSerializer ) { val id = getFileId(descriptor) if (id != null) { 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) if (id != null) { proto.setExtension(JsProtoBuf.functionContainingFileId, id) } - super.serializeFunction(descriptor, proto) + super.serializeFunction(descriptor, proto, childSerializer) } private fun getFileId(descriptor: DeclarationDescriptor): Int? {