From 498c1abbc645d6fa9620a22e96fbff630d462d34 Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Tue, 14 Feb 2023 22:10:30 +0000 Subject: [PATCH] [KxSerialization] Fix SERIALIZER_NOT_FOUND diagnostic for enums If enum class from dependencies is used, which was compiled by a new version of the plugin, which uses a factory and does not create a nested `$serializer` class, then an `SERIALIZER_NOT_FOUND` diagnostic error is thrown for such an enumeration. This happens if the old serialization runtime is used for the current project - in this case, the serializer is taken from the nested class `$serializer`. Since it is missing, the diagnostics does not work correctly. It is acceptable for enumerations to ignore this error, because we know that enumerations are always serializable. Merge-request: KT-MR-8818 Merged-by: Sergey Shanshin --- .../backend/ir/SerializationJvmIrIntrinsicSupport.kt | 2 +- .../diagnostic/SerializationPluginDeclarationChecker.kt | 6 +++++- .../fir/checkers/FirSerializationPluginClassChecker.kt | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt index 871743207f5..f0b43dab6de 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt @@ -160,7 +160,7 @@ class SerializationJvmIrIntrinsicSupport( } override val runtimeHasEnumSerializerFactoryFunctions: Boolean - get() = currentVersion != null && currentVersion!! > ApiVersion.parse("1.4.0")!! + get() = currentVersion != null && currentVersion!! >= ApiVersion.parse("1.5.0")!! private val hasNewContextSerializerSignature: Boolean get() = currentVersion != null && currentVersion!! >= ApiVersion.parse("1.2.0")!! diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k1/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k1/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt index 2226e853658..6dcb7d6ab85 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k1/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k1/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.typeUtil.isEnum import org.jetbrains.kotlin.types.typeUtil.supertypes import org.jetbrains.kotlin.util.slicedMap.Slices import org.jetbrains.kotlin.util.slicedMap.WritableSlice @@ -501,7 +502,10 @@ open class SerializationPluginDeclarationChecker : DeclarationChecker { checkSerializerNullability(type, serializer.defaultType, element, trace, fallbackElement) checkTypeArguments(module, type, element, trace, fallbackElement) } else { - trace.report(SerializationErrors.SERIALIZER_NOT_FOUND.on(element ?: fallbackElement, type)) + if (!type.isEnum()) { + // enums are always serializable + trace.report(SerializationErrors.SERIALIZER_NOT_FOUND.on(element ?: fallbackElement, type)) + } } } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt index 31b1e109663..6d16304bb53 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt @@ -539,7 +539,10 @@ object FirSerializationPluginClassChecker : FirClassChecker() { } checkTypeArguments(type, source, reporter) } else { - reporter.reportOn(source, FirSerializationErrors.SERIALIZER_NOT_FOUND, type) + if (!type.isEnum) { + // enums are always serializable + reporter.reportOn(source, FirSerializationErrors.SERIALIZER_NOT_FOUND, type) + } } }