Provide feature-flag to disable intrinsics in serialization plugin
This commit is contained in:
+9
-2
@@ -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)
|
||||
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginOptions
|
||||
+32
-4
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user