diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt index 7ebbef71a32..12209967758 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt @@ -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) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor b/plugins/kotlinx-serialization/kotlinx-serialization.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor new file mode 100644 index 00000000000..784f5bfb368 --- /dev/null +++ b/plugins/kotlinx-serialization/kotlinx-serialization.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor @@ -0,0 +1 @@ +org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginOptions \ No newline at end of file diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.cli/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt b/plugins/kotlinx-serialization/kotlinx-serialization.cli/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt index 8fe1a63e820..73a481f3d03 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.cli/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.cli/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt @@ -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 = + CompilerConfigurationKey.create("Disable replacement of serializer() call with direct serializer retrieval.") +} + +class SerializationPluginOptions : CommandLineProcessor { + companion object { + val DISABLE_INTRINSIC_OPTION = CliOption( + "disableIntrinsic", "true/false", + "Disable replacement of serializer() 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()) }