From 56cd15055436e65c9029cd8232f5c6d992acb62a Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 15 Nov 2022 19:18:31 +0100 Subject: [PATCH] Enable FIR plugin in SerializationComponentRegistrar so real projects can be built with K2 and serialization. Correctly register renderer for serialization plugin errors. --- .../extensions/SerializationComponentRegistrar.kt | 6 +++++- .../compiler/fir/checkers/FirSerializationErrors.kt | 5 +++++ .../checkers/KtDefaultErrorMessagesSerialization.kt | 10 +++------- .../serialization/serializationConfiguration.kt | 1 - 4 files changed, 13 insertions(+), 9 deletions(-) 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 167957fae9d..2bf47b2c74d 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter import org.jetbrains.kotlin.js.translate.extensions.JsSyntheticTranslateExtension import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil @@ -23,6 +24,7 @@ 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 +import org.jetbrains.kotlinx.serialization.compiler.fir.FirSerializationExtensionRegistrar object SerializationConfigurationKeys { val DISABLE_INTRINSIC: CompilerConfigurationKey = @@ -57,7 +59,7 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() { if (configuration.get(DISABLE_INTRINSIC) == true) SerializationIntrinsicsState.DISABLED else SerializationIntrinsicsState.NORMAL override val supportsK2: Boolean - get() = false + get() = true companion object { fun registerExtensions(extensionStorage: ExtensionStorage, intrinsicsState: SerializationIntrinsicsState = SerializationIntrinsicsState.NORMAL) = with(extensionStorage) { @@ -76,6 +78,8 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() { IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer, intrinsicsState)) StorageComponentContainerContributor.registerExtension(SerializationPluginComponentContainerContributor()) + + FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar()) } private fun registerProtoExtensions() { diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationErrors.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationErrors.kt index 930f11f93fa..b8238a9c31b 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationErrors.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationErrors.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlinx.serialization.compiler.fir.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.* +import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType @@ -47,4 +48,8 @@ object FirSerializationErrors { val EXTERNAL_CLASS_NOT_SERIALIZABLE by error2, ConeKotlinType>() val EXTERNAL_CLASS_IN_ANOTHER_MODULE by error2, ConeKotlinType>() + + init { + RootDiagnosticRendererFactory.registerFactory(KtDefaultErrorMessagesSerialization) + } } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/KtDefaultErrorMessagesSerialization.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/KtDefaultErrorMessagesSerialization.kt index 4efd5b2c2a7..09b62197242 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/KtDefaultErrorMessagesSerialization.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/KtDefaultErrorMessagesSerialization.kt @@ -8,16 +8,12 @@ package org.jetbrains.kotlinx.serialization.compiler.fir.checkers import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderer +import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers -object KtDefaultErrorMessagesSerialization { - fun getRendererForDiagnostic(diagnostic: KtDiagnostic): KtDiagnosticRenderer { - val factory = diagnostic.factory - return MAP[factory] ?: factory.ktRenderer - } - - val MAP = KtDiagnosticFactoryToRendererMap("Serialization").apply { +object KtDefaultErrorMessagesSerialization : BaseDiagnosticRendererFactory() { + override val MAP = KtDiagnosticFactoryToRendererMap("Serialization").apply { put( FirSerializationErrors.INLINE_CLASSES_NOT_SUPPORTED, "Inline classes require runtime serialization library version at least {0}, while your classpath has {1}.", diff --git a/plugins/kotlinx-serialization/tests/org/jetbrains/kotlinx/serialization/serializationConfiguration.kt b/plugins/kotlinx-serialization/tests/org/jetbrains/kotlinx/serialization/serializationConfiguration.kt index d36a90f4fc6..29abbf9f296 100644 --- a/plugins/kotlinx-serialization/tests/org/jetbrains/kotlinx/serialization/serializationConfiguration.kt +++ b/plugins/kotlinx-serialization/tests/org/jetbrains/kotlinx/serialization/serializationConfiguration.kt @@ -36,7 +36,6 @@ class SerializationEnvironmentConfigurator( configuration: CompilerConfiguration ) { SerializationComponentRegistrar.registerExtensions(this, SerializationIntrinsicsState.FORCE_ENABLED) - FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar()) } }