Parcelize: Serialize primitive arrays correctly when the custom parceler is provided.
This fixes failing 'customSerializerBoxing' test.
This commit is contained in:
+25
-15
@@ -83,27 +83,37 @@ interface ParcelSerializer {
|
|||||||
val className = asmType.className
|
val className = asmType.className
|
||||||
fun strict() = strict && !type.annotations.hasAnnotation(RAWVALUE_ANNOTATION_FQNAME)
|
fun strict() = strict && !type.annotations.hasAnnotation(RAWVALUE_ANNOTATION_FQNAME)
|
||||||
|
|
||||||
type.annotations.findAnnotation(WRITE_WITH_FQNAME)?.let { writeWith ->
|
fun findCustomParcelerType(type: KotlinType): KotlinType? {
|
||||||
val parceler = writeWith.type.arguments.singleOrNull()?.type
|
type.annotations.findAnnotation(WRITE_WITH_FQNAME)?.let { writeWith ->
|
||||||
if (parceler != null && !parceler.isError) {
|
val parceler = writeWith.type.arguments.singleOrNull()?.type
|
||||||
return TypeParcelerParcelSerializer(asmType, parceler, context.typeMapper)
|
if (parceler != null && !parceler.isError) {
|
||||||
|
return parceler
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return context.findParcelerClass(type)?.takeIf { !it.isError }
|
||||||
}
|
}
|
||||||
|
|
||||||
context.findParcelerClass(type)?.let { typeParceler ->
|
findCustomParcelerType(type)?.let { return TypeParcelerParcelSerializer(asmType, it, context.typeMapper) }
|
||||||
if (!typeParceler.isError) {
|
|
||||||
return TypeParcelerParcelSerializer(asmType, typeParceler, context.typeMapper)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
asmType.descriptor == "[I"
|
asmType.descriptor == "[I"
|
||||||
|| asmType.descriptor == "[Z"
|
|| asmType.descriptor == "[Z"
|
||||||
|| asmType.descriptor == "[B"
|
|| asmType.descriptor == "[B"
|
||||||
|| asmType.descriptor == "[C"
|
|| asmType.descriptor == "[C"
|
||||||
|| asmType.descriptor == "[D"
|
|| asmType.descriptor == "[S"
|
||||||
|| asmType.descriptor == "[F"
|
|| asmType.descriptor == "[D"
|
||||||
|| asmType.descriptor == "[L" -> PrimitiveArrayParcelSerializer(asmType)
|
|| asmType.descriptor == "[F"
|
||||||
|
|| asmType.descriptor == "[J" -> {
|
||||||
|
val customElementParcelerType = findCustomParcelerType(type.builtIns.getArrayElementType(type))
|
||||||
|
if (customElementParcelerType != null) {
|
||||||
|
val elementType = asmType.elementType
|
||||||
|
val elementParceler = TypeParcelerParcelSerializer(elementType, customElementParcelerType, context.typeMapper)
|
||||||
|
ArrayParcelSerializer(asmType, elementParceler)
|
||||||
|
} else {
|
||||||
|
PrimitiveArrayParcelSerializer(asmType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
asmType.descriptor == "[Landroid/os/IBinder;" -> NullCompliantObjectParcelSerializer(asmType,
|
asmType.descriptor == "[Landroid/os/IBinder;" -> NullCompliantObjectParcelSerializer(asmType,
|
||||||
Method("writeBinderArray"), Method("createBinderArray"))
|
Method("writeBinderArray"), Method("createBinderArray"))
|
||||||
|
|||||||
Reference in New Issue
Block a user