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
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)
}
@@ -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()
@@ -44,13 +44,13 @@ class DescriptorSerializer private constructor(
private val containingDeclaration: DeclarationDescriptor?,
private val typeParameters: Interner<TypeParameterDescriptor>,
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()
@@ -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
) {
}
@@ -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))
@@ -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? {