Skip to content

Commit

Permalink
[Parcelize] Use the new IR parameter API
Browse files Browse the repository at this point in the history
^KT-73366 Fixed
  • Loading branch information
pyos authored and Space Cloud committed Nov 29, 2024
1 parent 90c9cad commit 1339410
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,50 +28,50 @@ class AndroidIrBuilder internal constructor(

fun parcelReadParcelable(receiver: IrExpression, loader: IrExpression): IrExpression {
return irCall(androidSymbols.parcelReadParcelable).apply {
dispatchReceiver = receiver
putValueArgument(0, loader)
arguments[0] = receiver
arguments[1] = loader
}
}

fun parcelReadString(receiver: IrExpression): IrExpression {
return irCall(androidSymbols.parcelReadString).apply {
dispatchReceiver = receiver
arguments[0] = receiver
}
}

fun parcelWriteInt(receiver: IrExpression, value: IrExpression): IrExpression {
return irCall(androidSymbols.parcelWriteInt).apply {
dispatchReceiver = receiver
putValueArgument(0, value)
arguments[0] = receiver
arguments[1] = value
}
}

fun parcelWriteParcelable(receiver: IrExpression, p: IrExpression, parcelableFlags: IrExpression): IrExpression {
return irCall(androidSymbols.parcelWriteParcelable).apply {
dispatchReceiver = receiver
putValueArgument(0, p)
putValueArgument(1, parcelableFlags)
arguments[0] = receiver
arguments[1] = p
arguments[2] = parcelableFlags
}
}

fun parcelWriteString(receiver: IrExpression, value: IrExpression): IrExpression {
return irCall(androidSymbols.parcelWriteString).apply {
dispatchReceiver = receiver
putValueArgument(0, value)
arguments[0] = receiver
arguments[1] = value
}
}

fun textUtilsWriteToParcel(cs: IrExpression, p: IrExpression, parcelableFlags: IrExpression): IrExpression {
return irCall(androidSymbols.textUtilsWriteToParcel).apply {
putValueArgument(0, cs)
putValueArgument(1, p)
putValueArgument(2, parcelableFlags)
arguments[0] = cs
arguments[1] = p
arguments[2] = parcelableFlags
}
}

fun classGetClassLoader(receiver: IrExpression): IrExpression {
return irCall(androidSymbols.classGetClassLoader).apply {
dispatchReceiver = receiver
arguments[0] = receiver
}
}

Expand All @@ -83,7 +83,7 @@ class AndroidIrBuilder internal constructor(
return IrCallImpl.fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, toType, androidSymbols.unsafeCoerceIntrinsic).apply {
putTypeArgument(0, fromType)
putTypeArgument(1, toType)
putValueArgument(0, value)
arguments[0] = value
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -521,10 +521,7 @@ class AndroidSymbols(
): IrSimpleFunctionSymbol {
val callableId = CallableId(kotlinxCollectionsImmutable, Name.identifier(functionName))
return pluginContext.referenceFunctions(callableId)
.firstOrNull {
it.owner.extensionReceiverParameter?.type?.classFqName == receiver &&
it.owner.valueParameters.isEmpty()
}
.firstOrNull { it.owner.parameters.singleOrNull()?.type?.classFqName == receiver }
?: error("Function from kotlinx.collections.immutable is not found on classpath: $callableId")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,14 +252,10 @@ class IrParcelSerializerFactory(private val symbols: AndroidSymbols, private val
val listSerializer = IrListParcelSerializer(classifier, elementType, getChild(elementType))
val actualSerializer =
when (classifierFqName) {
in BuiltinParcelableTypes.IMMUTABLE_LIST_FQNAMES -> IrExtensionFunctionOnReadCallingSerializer(
delegated = listSerializer,
converterExtensionFunction = symbols.kotlinIterableToPersistentListExtension
)
in BuiltinParcelableTypes.IMMUTABLE_SET_FQNAMES -> IrExtensionFunctionOnReadCallingSerializer(
delegated = listSerializer,
converterExtensionFunction = symbols.kotlinIterableToPersistentSetExtension
)
in BuiltinParcelableTypes.IMMUTABLE_LIST_FQNAMES ->
listSerializer.withDeserializationPostprocessing(symbols.kotlinIterableToPersistentListExtension)
in BuiltinParcelableTypes.IMMUTABLE_SET_FQNAMES ->
listSerializer.withDeserializationPostprocessing(symbols.kotlinIterableToPersistentSetExtension)
else -> listSerializer
}

Expand All @@ -276,14 +272,10 @@ class IrParcelSerializerFactory(private val symbols: AndroidSymbols, private val
IrMapParcelSerializer(classifier, keyType, valueType, getChild(keyType), getChild(valueType))

val actualSerializer =
if (classifierFqName in BuiltinParcelableTypes.IMMUTABLE_MAP_FQNAMES) {
IrExtensionFunctionOnReadCallingSerializer(
mapSerializer,
symbols.kotlinMapToPersistentMapExtension
)
} else {
if (classifierFqName in BuiltinParcelableTypes.IMMUTABLE_MAP_FQNAMES)
mapSerializer.withDeserializationPostprocessing(symbols.kotlinMapToPersistentMapExtension)
else
mapSerializer
}
return wrapNullableSerializerIfNeeded(irType, actualSerializer)
}
}
Expand Down Expand Up @@ -358,19 +350,13 @@ class IrParcelSerializerFactory(private val symbols: AndroidSymbols, private val
private val stringArraySerializer = IrSimpleParcelSerializer(symbols.parcelCreateStringArray, symbols.parcelWriteStringArray)
private val stringListSerializer = IrSimpleParcelSerializer(symbols.parcelCreateStringArrayList, symbols.parcelWriteStringList)
private val stringPersistentListSerializer by lazy {
IrExtensionFunctionOnReadCallingSerializer(
delegated = stringListSerializer,
converterExtensionFunction = symbols.kotlinIterableToPersistentListExtension,
)
stringListSerializer.withDeserializationPostprocessing(symbols.kotlinIterableToPersistentListExtension)
}
private val iBinderSerializer = IrSimpleParcelSerializer(symbols.parcelReadStrongBinder, symbols.parcelWriteStrongBinder)
private val iBinderArraySerializer = IrSimpleParcelSerializer(symbols.parcelCreateBinderArray, symbols.parcelWriteBinderArray)
private val iBinderListSerializer = IrSimpleParcelSerializer(symbols.parcelCreateBinderArrayList, symbols.parcelWriteBinderList)
private val iBinderPersistentListSerializer by lazy {
IrExtensionFunctionOnReadCallingSerializer(
delegated = iBinderListSerializer,
converterExtensionFunction = symbols.kotlinIterableToPersistentListExtension,
)
iBinderListSerializer.withDeserializationPostprocessing(symbols.kotlinIterableToPersistentListExtension)
}
private val serializableSerializer = IrSimpleParcelSerializer(symbols.parcelReadSerializable, symbols.parcelWriteSerializable)
private val stringSerializer = IrSimpleParcelSerializer(symbols.parcelReadString, symbols.parcelWriteString)
Expand Down
Loading

0 comments on commit 1339410

Please sign in to comment.