Provide feature-flag to disable intrinsics in serialization plugin

This commit is contained in:
Leonid Startsev
2022-09-05 17:23:04 +02:00
committed by Space
parent ad2adadb36
commit 637e8c7d8a
3 changed files with 42 additions and 6 deletions
@@ -129,8 +129,15 @@ private class SerializerClassPreLowering(
}
open class SerializationLoweringExtension @JvmOverloads constructor(
val metadataPlugin: SerializationDescriptorSerializerPlugin? = null
private val metadataPlugin: SerializationDescriptorSerializerPlugin? = null
) : IrGenerationExtension {
private var disableIntrinsics = false
constructor(metadataPlugin: SerializationDescriptorSerializerPlugin, disableIntrinsics: Boolean) : this(metadataPlugin) {
this.disableIntrinsics = disableIntrinsics
}
override fun generate(
moduleFragment: IrModuleFragment,
pluginContext: IrPluginContext
@@ -142,7 +149,7 @@ open class SerializationLoweringExtension @JvmOverloads constructor(
}
override fun getPlatformIntrinsicExtension(): IrIntrinsicExtension? {
return object : JvmIrIntrinsicExtension {
return if (disableIntrinsics) null else object : JvmIrIntrinsicExtension {
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? =
SerializationJvmIrIntrinsicSupport.intrinsicForMethod(symbol.owner)
@@ -0,0 +1 @@
org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginOptions
@@ -7,8 +7,9 @@ package org.jetbrains.kotlinx.serialization.compiler.extensions
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.compiler.plugin.*
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -21,17 +22,44 @@ import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationConfigurationKeys.DISABLE_INTRINSIC
object SerializationConfigurationKeys {
val DISABLE_INTRINSIC: CompilerConfigurationKey<Boolean> =
CompilerConfigurationKey.create("Disable replacement of serializer<T>() call with direct serializer retrieval.")
}
class SerializationPluginOptions : CommandLineProcessor {
companion object {
val DISABLE_INTRINSIC_OPTION = CliOption(
"disableIntrinsic", "true/false",
"Disable replacement of serializer<T>() call with direct serializer retrieval. Use if you experience errors during inlining.",
required = false, allowMultipleOccurrences = false
)
}
override val pluginId = "org.jetbrains.kotlinx.serialization"
override val pluginOptions = listOf(DISABLE_INTRINSIC_OPTION)
override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) = when (option) {
DISABLE_INTRINSIC_OPTION -> configuration.put(DISABLE_INTRINSIC, value == "true")
else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
}
}
class SerializationComponentRegistrar : CompilerPluginRegistrar() {
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
Companion.registerExtensions(this)
Companion.registerExtensions(this, loadDisableIntrinsic(configuration))
}
private fun loadDisableIntrinsic(configuration: CompilerConfiguration) = configuration.get(DISABLE_INTRINSIC) ?: false
override val supportsK2: Boolean
get() = false
companion object {
fun registerExtensions(extensionStorage: ExtensionStorage) = with(extensionStorage) {
fun registerExtensions(extensionStorage: ExtensionStorage, disableIntrinsics: Boolean = false) = with(extensionStorage) {
// This method is never called in the IDE, therefore this extension is not available there.
// Since IDE does not perform any serialization of descriptors, metadata written to the 'serializationDescriptorSerializer'
// is never deleted, effectively causing memory leaks.
@@ -44,7 +72,7 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() {
ExpressionCodegenExtension.registerExtension(SerializationCodegenExtension(serializationDescriptorSerializer))
JsSyntheticTranslateExtension.registerExtension(SerializationJsExtension(serializationDescriptorSerializer))
IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer))
IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer, disableIntrinsics))
StorageComponentContainerContributor.registerExtension(SerializationPluginComponentContainerContributor())
}