Retrieve serializable properties from binding context in most of the places
Remove unused record 'SERIALIZER_FOR_PROPERTY'
This commit is contained in:
+1
-3
@@ -21,15 +21,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors
|
import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SERIALIZABLE_PROPERTIES
|
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
||||||
|
|
||||||
abstract class SerializableCodegen(
|
abstract class SerializableCodegen(
|
||||||
protected val serializableDescriptor: ClassDescriptor,
|
protected val serializableDescriptor: ClassDescriptor,
|
||||||
bindingContext: BindingContext
|
bindingContext: BindingContext
|
||||||
) : AbstractSerialGenerator(bindingContext, serializableDescriptor) {
|
) : AbstractSerialGenerator(bindingContext, serializableDescriptor) {
|
||||||
protected val properties = bindingContext.get(SERIALIZABLE_PROPERTIES, serializableDescriptor)
|
protected val properties = bindingContext.serializablePropertiesFor(serializableDescriptor)
|
||||||
?: SerializableProperties(serializableDescriptor, bindingContext)
|
|
||||||
|
|
||||||
fun generate() {
|
fun generate() {
|
||||||
generateSyntheticInternalConstructor()
|
generateSyntheticInternalConstructor()
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@ abstract class SerializerCodegen(
|
|||||||
) : AbstractSerialGenerator(bindingContext, serializerDescriptor) {
|
) : AbstractSerialGenerator(bindingContext, serializerDescriptor) {
|
||||||
val serializableDescriptor: ClassDescriptor = getSerializableClassDescriptorBySerializer(serializerDescriptor)!!
|
val serializableDescriptor: ClassDescriptor = getSerializableClassDescriptorBySerializer(serializerDescriptor)!!
|
||||||
protected val serialName: String = serializableDescriptor.annotations.serialNameValue ?: serializableDescriptor.fqNameUnsafe.asString()
|
protected val serialName: String = serializableDescriptor.annotations.serialNameValue ?: serializableDescriptor.fqNameUnsafe.asString()
|
||||||
protected val properties = SerializableProperties(serializableDescriptor, bindingContext)
|
protected val properties = bindingContext.serializablePropertiesFor(serializableDescriptor)
|
||||||
protected val serializableProperties = properties.serializableProperties
|
protected val serializableProperties = properties.serializableProperties
|
||||||
|
|
||||||
private fun checkSerializability() {
|
private fun checkSerializability() {
|
||||||
|
|||||||
+1
-6
@@ -115,12 +115,7 @@ fun AbstractSerialGenerator.findTypeSerializerOrContext(
|
|||||||
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
|
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
|
||||||
additionalSerializersInScopeOfCurrentFile[kType]?.let { return it }
|
additionalSerializersInScopeOfCurrentFile[kType]?.let { return it }
|
||||||
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
||||||
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType) /*?: throw CompilationException(
|
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)
|
||||||
"Serializer for element of type $kType has not been found.\n" +
|
|
||||||
"To use context serializer as fallback, explicitly annotate element with @ContextualSerialization",
|
|
||||||
null,
|
|
||||||
sourceElement
|
|
||||||
)*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findTypeSerializer(module: ModuleDescriptor, kType: KotlinType): ClassDescriptor? {
|
fun findTypeSerializer(module: ModuleDescriptor, kType: KotlinType): ClassDescriptor? {
|
||||||
|
|||||||
+1
-3
@@ -11,8 +11,6 @@ import org.jetbrains.kotlin.ir.IrElement
|
|||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
@@ -138,7 +136,7 @@ class SerializableIrGenerator(
|
|||||||
): Int {
|
): Int {
|
||||||
check(superClass.isInternalSerializable)
|
check(superClass.isInternalSerializable)
|
||||||
val superCtorRef = compilerContext.externalSymbols.serializableSyntheticConstructor(superClass)
|
val superCtorRef = compilerContext.externalSymbols.serializableSyntheticConstructor(superClass)
|
||||||
val superProperties = SerializableProperties(superClass, bindingContext).serializableProperties
|
val superProperties = bindingContext.serializablePropertiesFor(superClass).serializableProperties
|
||||||
val superSlots = superProperties.bitMaskSlotCount()
|
val superSlots = superProperties.bitMaskSlotCount()
|
||||||
val arguments = allValueParameters.subList(0, superSlots) +
|
val arguments = allValueParameters.subList(0, superSlots) +
|
||||||
allValueParameters.subList(propertiesStart, propertiesStart + superProperties.size) +
|
allValueParameters.subList(propertiesStart, propertiesStart + superProperties.size) +
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|||||||
import org.jetbrains.kotlin.codegen.CompilationException
|
import org.jetbrains.kotlin.codegen.CompilationException
|
||||||
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
||||||
import org.jetbrains.kotlin.js.translate.context.Namer
|
import org.jetbrains.kotlin.js.translate.context.Namer
|
||||||
@@ -141,7 +141,7 @@ class SerializableJsTranslator(
|
|||||||
): Int {
|
): Int {
|
||||||
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(superClass, context.bindingContext())
|
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(superClass, context.bindingContext())
|
||||||
val constrRef = context.getInnerNameForDescriptor(constrDesc).makeRef()
|
val constrRef = context.getInnerNameForDescriptor(constrDesc).makeRef()
|
||||||
val superProperties = SerializableProperties(superClass, bindingContext).serializableProperties
|
val superProperties = bindingContext.serializablePropertiesFor(superClass).serializableProperties
|
||||||
val superSlots = superProperties.bitMaskSlotCount()
|
val superSlots = superProperties.bitMaskSlotCount()
|
||||||
val arguments = parameters.subList(0, superSlots) +
|
val arguments = parameters.subList(0, superSlots) +
|
||||||
parameters.subList(propertiesStart, propertiesStart + superProperties.size) +
|
parameters.subList(propertiesStart, propertiesStart + superProperties.size) +
|
||||||
|
|||||||
+2
-2
@@ -93,7 +93,7 @@ class SerializableCodegenImpl(
|
|||||||
val superClass = serializableDescriptor.getSuperClassOrAny()
|
val superClass = serializableDescriptor.getSuperClassOrAny()
|
||||||
val myPropsStart: Int
|
val myPropsStart: Int
|
||||||
if (superClass.isInternalSerializable) {
|
if (superClass.isInternalSerializable) {
|
||||||
myPropsStart = SerializableProperties(superClass, classCodegen.bindingContext).serializableProperties.size
|
myPropsStart = bindingContext.serializablePropertiesFor(superClass).serializableProperties.size
|
||||||
val superTypeArguments =
|
val superTypeArguments =
|
||||||
serializableDescriptor.typeConstructor.supertypes.single { it.toClassDescriptor?.isInternalSerializable == true }.arguments
|
serializableDescriptor.typeConstructor.supertypes.single { it.toClassDescriptor?.isInternalSerializable == true }.arguments
|
||||||
//super.writeSelf(output, serialDesc)
|
//super.writeSelf(output, serialDesc)
|
||||||
@@ -259,7 +259,7 @@ class SerializableCodegenImpl(
|
|||||||
invokespecial(superType, "<init>", desc, false)
|
invokespecial(superType, "<init>", desc, false)
|
||||||
return 0 to propStartVar
|
return 0 to propStartVar
|
||||||
} else {
|
} else {
|
||||||
val superProps = SerializableProperties(superClass, classCodegen.bindingContext).serializableProperties
|
val superProps = bindingContext.serializablePropertiesFor(superClass).serializableProperties
|
||||||
val creator = buildInternalConstructorDesc(propStartVar, 1, classCodegen, superProps)
|
val creator = buildInternalConstructorDesc(propStartVar, 1, classCodegen, superProps)
|
||||||
invokespecial(superType, "<init>", creator, false)
|
invokespecial(superType, "<init>", creator, false)
|
||||||
return superProps.size to propStartVar + superProps.sumBy { it.asmType.size }
|
return superProps.size to propStartVar + superProps.sumBy { it.asmType.size }
|
||||||
|
|||||||
-3
@@ -29,7 +29,6 @@ import org.jetbrains.kotlinx.serialization.compiler.backend.common.primaryConstr
|
|||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.*
|
||||||
|
|
||||||
internal val SERIALIZABLE_PROPERTIES: WritableSlice<ClassDescriptor, SerializableProperties> = Slices.createSimpleSlice()
|
internal val SERIALIZABLE_PROPERTIES: WritableSlice<ClassDescriptor, SerializableProperties> = Slices.createSimpleSlice()
|
||||||
internal val SERIALIZER_FOR_PROPERTY: WritableSlice<PropertyDescriptor, ClassDescriptor> = Slices.createSimpleSlice()
|
|
||||||
|
|
||||||
class SerializationPluginDeclarationChecker : DeclarationChecker {
|
class SerializationPluginDeclarationChecker : DeclarationChecker {
|
||||||
override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
|
override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
|
||||||
@@ -55,7 +54,6 @@ class SerializationPluginDeclarationChecker : DeclarationChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: also check on a side of external serializer
|
|
||||||
private fun buildSerializableProperties(descriptor: ClassDescriptor, trace: BindingTrace): SerializableProperties? {
|
private fun buildSerializableProperties(descriptor: ClassDescriptor, trace: BindingTrace): SerializableProperties? {
|
||||||
if (!descriptor.annotations.hasAnnotation(SerializationAnnotations.serializableAnnotationFqName)) return null
|
if (!descriptor.annotations.hasAnnotation(SerializationAnnotations.serializableAnnotationFqName)) return null
|
||||||
if (!descriptor.isInternalSerializable) return null
|
if (!descriptor.isInternalSerializable) return null
|
||||||
@@ -123,7 +121,6 @@ class SerializationPluginDeclarationChecker : DeclarationChecker {
|
|||||||
val element = ktType.typeElement ?: return
|
val element = ktType.typeElement ?: return
|
||||||
checkSerializerNullability(it.type, serializer.defaultType, element, trace)
|
checkSerializerNullability(it.type, serializer.defaultType, element, trace)
|
||||||
generatorContextForAnalysis.checkTypeArguments(it.module, it.type, element, trace)
|
generatorContextForAnalysis.checkTypeArguments(it.module, it.type, element, trace)
|
||||||
trace.record(SERIALIZER_FOR_PROPERTY, it.descriptor, serializer)
|
|
||||||
} else {
|
} else {
|
||||||
generatorContextForAnalysis.checkType(it.module, it.type, ktType, trace)
|
generatorContextForAnalysis.checkType(it.module, it.type, ktType, trace)
|
||||||
}
|
}
|
||||||
+1
-3
@@ -29,11 +29,9 @@ import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import org.jetbrains.kotlin.types.typeUtil.supertypes
|
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.contextSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.polymorphicSerializerId
|
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.polymorphicSerializerId
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.KSERIALIZER_CLASS
|
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.serialInfoFqName
|
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.serialInfoFqName
|
||||||
|
|
||||||
internal fun isAllowedToHaveAutoGeneratedSerializerMethods(
|
internal fun isAllowedToHaveAutoGeneratedSerializerMethods(
|
||||||
@@ -62,7 +60,7 @@ internal fun ClassDescriptor.createSerializerTypeFor(argument: SimpleType, baseS
|
|||||||
val projectionType = Variance.INVARIANT
|
val projectionType = Variance.INVARIANT
|
||||||
val types = listOf(TypeProjectionImpl(projectionType, argument))
|
val types = listOf(TypeProjectionImpl(projectionType, argument))
|
||||||
val descriptor = module.findClassAcrossModuleDependencies(ClassId.topLevel(baseSerializerInterface))
|
val descriptor = module.findClassAcrossModuleDependencies(ClassId.topLevel(baseSerializerInterface))
|
||||||
?: throw IllegalArgumentException("Can't locate $baseSerializerInterface")
|
?: throw IllegalArgumentException("Can't locate $baseSerializerInterface. Is kotlinx-serialization library present in compile classpath?")
|
||||||
return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, descriptor, types)
|
return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, descriptor, types)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -293,7 +293,7 @@ object KSerializerDescriptorResolver {
|
|||||||
val markerDesc = classDescriptor.getKSerializerConstructorMarker()
|
val markerDesc = classDescriptor.getKSerializerConstructorMarker()
|
||||||
val markerType = markerDesc.toSimpleType()
|
val markerType = markerDesc.toSimpleType()
|
||||||
|
|
||||||
val serializableProperties = SerializableProperties(classDescriptor, bindingContext).serializableProperties
|
val serializableProperties = bindingContext.serializablePropertiesFor(classDescriptor).serializableProperties
|
||||||
val parameterDescsAsProps = serializableProperties.map { it.descriptor }
|
val parameterDescsAsProps = serializableProperties.map { it.descriptor }
|
||||||
val bitMaskSlotsCount = serializableProperties.bitMaskSlotCount()
|
val bitMaskSlotsCount = serializableProperties.bitMaskSlotCount()
|
||||||
var i = 0
|
var i = 0
|
||||||
|
|||||||
+4
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
|
|||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
||||||
import org.jetbrains.kotlin.resolve.hasBackingField
|
import org.jetbrains.kotlin.resolve.hasBackingField
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
|
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SERIALIZABLE_PROPERTIES
|
||||||
|
|
||||||
class SerializableProperties(private val serializableClass: ClassDescriptor, val bindingContext: BindingContext) {
|
class SerializableProperties(private val serializableClass: ClassDescriptor, val bindingContext: BindingContext) {
|
||||||
private val primaryConstructorParameters: List<ValueParameterDescriptor> =
|
private val primaryConstructorParameters: List<ValueParameterDescriptor> =
|
||||||
@@ -76,3 +77,6 @@ class SerializableProperties(private val serializableClass: ClassDescriptor, val
|
|||||||
|
|
||||||
internal fun List<SerializableProperty>.bitMaskSlotCount() = size / 32 + 1
|
internal fun List<SerializableProperty>.bitMaskSlotCount() = size / 32 + 1
|
||||||
internal fun bitMaskSlotAt(propertyIndex: Int) = propertyIndex / 32
|
internal fun bitMaskSlotAt(propertyIndex: Int) = propertyIndex / 32
|
||||||
|
|
||||||
|
internal fun BindingContext.serializablePropertiesFor(classDescriptor: ClassDescriptor): SerializableProperties =
|
||||||
|
this.get(SERIALIZABLE_PROPERTIES, classDescriptor) ?: SerializableProperties(classDescriptor, this)
|
||||||
Reference in New Issue
Block a user