From ee37bcf14b027120fe45eb724b260b85ddf36b07 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 16 Apr 2018 23:59:25 +0300 Subject: [PATCH] Parcelize: Serialize primitive arrays correctly when the custom parceler is provided. This fixes failing 'customSerializerBoxing' test. --- .../parcel/serializers/ParcelSerializer.kt | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt index b49758454f4..8333a546c6d 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt @@ -83,27 +83,37 @@ interface ParcelSerializer { val className = asmType.className fun strict() = strict && !type.annotations.hasAnnotation(RAWVALUE_ANNOTATION_FQNAME) - type.annotations.findAnnotation(WRITE_WITH_FQNAME)?.let { writeWith -> - val parceler = writeWith.type.arguments.singleOrNull()?.type - if (parceler != null && !parceler.isError) { - return TypeParcelerParcelSerializer(asmType, parceler, context.typeMapper) + fun findCustomParcelerType(type: KotlinType): KotlinType? { + type.annotations.findAnnotation(WRITE_WITH_FQNAME)?.let { writeWith -> + val parceler = writeWith.type.arguments.singleOrNull()?.type + if (parceler != null && !parceler.isError) { + return parceler + } } + + return context.findParcelerClass(type)?.takeIf { !it.isError } } - context.findParcelerClass(type)?.let { typeParceler -> - if (!typeParceler.isError) { - return TypeParcelerParcelSerializer(asmType, typeParceler, context.typeMapper) - } - } + findCustomParcelerType(type)?.let { return TypeParcelerParcelSerializer(asmType, it, context.typeMapper) } return when { asmType.descriptor == "[I" - || asmType.descriptor == "[Z" - || asmType.descriptor == "[B" - || asmType.descriptor == "[C" - || asmType.descriptor == "[D" - || asmType.descriptor == "[F" - || asmType.descriptor == "[L" -> PrimitiveArrayParcelSerializer(asmType) + || asmType.descriptor == "[Z" + || asmType.descriptor == "[B" + || asmType.descriptor == "[C" + || asmType.descriptor == "[S" + || asmType.descriptor == "[D" + || 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, Method("writeBinderArray"), Method("createBinderArray"))