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(
|
open class SerializationLoweringExtension @JvmOverloads constructor(
|
||||||
val metadataPlugin: SerializationDescriptorSerializerPlugin? = null
|
private val metadataPlugin: SerializationDescriptorSerializerPlugin? = null
|
||||||
) : IrGenerationExtension {
|
) : IrGenerationExtension {
|
||||||
|
|
||||||
|
private var disableIntrinsics = false
|
||||||
|
|
||||||
|
constructor(metadataPlugin: SerializationDescriptorSerializerPlugin, disableIntrinsics: Boolean) : this(metadataPlugin) {
|
||||||
|
this.disableIntrinsics = disableIntrinsics
|
||||||
|
}
|
||||||
|
|
||||||
override fun generate(
|
override fun generate(
|
||||||
moduleFragment: IrModuleFragment,
|
moduleFragment: IrModuleFragment,
|
||||||
pluginContext: IrPluginContext
|
pluginContext: IrPluginContext
|
||||||
@@ -142,7 +149,7 @@ open class SerializationLoweringExtension @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getPlatformIntrinsicExtension(): IrIntrinsicExtension? {
|
override fun getPlatformIntrinsicExtension(): IrIntrinsicExtension? {
|
||||||
return object : JvmIrIntrinsicExtension {
|
return if (disableIntrinsics) null else object : JvmIrIntrinsicExtension {
|
||||||
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? =
|
override fun getIntrinsic(symbol: IrFunctionSymbol): IntrinsicMethod? =
|
||||||
SerializationJvmIrIntrinsicSupport.intrinsicForMethod(symbol.owner)
|
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.backend.common.extensions.IrGenerationExtension
|
||||||
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
|
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.CompilerConfiguration
|
||||||
|
import org.jetbrains.kotlin.config.CompilerConfigurationKey
|
||||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||||
import org.jetbrains.kotlin.container.useInstance
|
import org.jetbrains.kotlin.container.useInstance
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
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.DescriptorSerializerPlugin
|
||||||
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
||||||
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker
|
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() {
|
class SerializationComponentRegistrar : CompilerPluginRegistrar() {
|
||||||
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
|
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
|
override val supportsK2: Boolean
|
||||||
get() = false
|
get() = false
|
||||||
|
|
||||||
companion object {
|
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.
|
// 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'
|
// Since IDE does not perform any serialization of descriptors, metadata written to the 'serializationDescriptorSerializer'
|
||||||
// is never deleted, effectively causing memory leaks.
|
// is never deleted, effectively causing memory leaks.
|
||||||
@@ -44,7 +72,7 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() {
|
|||||||
|
|
||||||
ExpressionCodegenExtension.registerExtension(SerializationCodegenExtension(serializationDescriptorSerializer))
|
ExpressionCodegenExtension.registerExtension(SerializationCodegenExtension(serializationDescriptorSerializer))
|
||||||
JsSyntheticTranslateExtension.registerExtension(SerializationJsExtension(serializationDescriptorSerializer))
|
JsSyntheticTranslateExtension.registerExtension(SerializationJsExtension(serializationDescriptorSerializer))
|
||||||
IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer))
|
IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer, disableIntrinsics))
|
||||||
|
|
||||||
StorageComponentContainerContributor.registerExtension(SerializationPluginComponentContainerContributor())
|
StorageComponentContainerContributor.registerExtension(SerializationPluginComponentContainerContributor())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user