[ANDROID] Move Parcelize plugin to general IrGenerationExtension API

This commit is contained in:
Roman Artemev
2020-05-26 12:52:46 +03:00
committed by romanart
parent adba0a03a6
commit 6f2972ee8b
3 changed files with 16 additions and 15 deletions
@@ -7,15 +7,15 @@ package org.jetbrains.kotlin.android.parcel
import org.jetbrains.kotlin.android.parcel.ir.AndroidSymbols import org.jetbrains.kotlin.android.parcel.ir.AndroidSymbols
import org.jetbrains.kotlin.android.parcel.ir.ParcelableIrTransformer import org.jetbrains.kotlin.android.parcel.ir.ParcelableIrTransformer
import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@Suppress("DEPRECATION_ERROR") class ParcelableIrGeneratorExtension : IrGenerationExtension {
class ParcelableIrGeneratorExtension : org.jetbrains.kotlin.backend.common.extensions.PureIrGenerationExtension { override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
override fun generate(moduleFragment: IrModuleFragment, context: CommonBackendContext) { val arrayOfNulls = pluginContext.symbols.arrayOfNulls
val arrayOfNulls = context.ir.symbols.arrayOfNulls val charSequence = pluginContext.symbols.charSequence
val charSequence = context.ir.symbols.charSequence val androidSymbols = AndroidSymbols(pluginContext.irBuiltIns, arrayOfNulls, charSequence, moduleFragment)
val androidSymbols = AndroidSymbols(context.irBuiltIns, arrayOfNulls, charSequence, moduleFragment) ParcelableIrTransformer(pluginContext, androidSymbols).transform(moduleFragment)
ParcelableIrTransformer(context, androidSymbols).transform(moduleFragment)
} }
} }
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.android.parcel.ANDROID_PARCELABLE_CLASS_FQNAME
import org.jetbrains.kotlin.android.parcel.PARCELER_FQNAME import org.jetbrains.kotlin.android.parcel.PARCELER_FQNAME
import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent
import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase
import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -34,13 +35,16 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class ParcelableIrTransformer(private val context: CommonBackendContext, private val androidSymbols: AndroidSymbols) : class ParcelableIrTransformer(private val context: IrPluginContext, private val androidSymbols: AndroidSymbols) :
ParcelableExtensionBase, IrElementVisitorVoid { ParcelableExtensionBase, IrElementVisitorVoid {
private val serializerFactory = IrParcelSerializerFactory(androidSymbols) private val serializerFactory = IrParcelSerializerFactory(androidSymbols)
private val deferredOperations = mutableListOf<() -> Unit>() private val deferredOperations = mutableListOf<() -> Unit>()
private fun defer(block: () -> Unit) = deferredOperations.add(block) private fun defer(block: () -> Unit) = deferredOperations.add(block)
private fun IrPluginContext.createIrBuilder(symbol: IrSymbol) =
DeclarationIrBuilder(this, symbol, symbol.owner.startOffset, symbol.owner.endOffset)
private val symbolMap = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>() private val symbolMap = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
fun transform(moduleFragment: IrModuleFragment) { fun transform(moduleFragment: IrModuleFragment) {
@@ -104,10 +104,7 @@ class AndroidComponentRegistrar : ComponentRegistrar {
companion object { companion object {
fun registerParcelExtensions(project: Project) { fun registerParcelExtensions(project: Project) {
ExpressionCodegenExtension.registerExtension(project, ParcelableCodegenExtension()) ExpressionCodegenExtension.registerExtension(project, ParcelableCodegenExtension())
@Suppress("DEPRECATION_ERROR") IrGenerationExtension.registerExtension(project, ParcelableIrGeneratorExtension())
org.jetbrains.kotlin.backend.common.extensions.PureIrGenerationExtension.registerExtension(
project, ParcelableIrGeneratorExtension()
)
SyntheticResolveExtension.registerExtension(project, ParcelableResolveExtension()) SyntheticResolveExtension.registerExtension(project, ParcelableResolveExtension())
ClassBuilderInterceptorExtension.registerExtension(project, ParcelableClinitClassBuilderInterceptorExtension()) ClassBuilderInterceptorExtension.registerExtension(project, ParcelableClinitClassBuilderInterceptorExtension())
} }