From 0b669e72b07671ff3ed0dac93b1918c251d3148b Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 5 Sep 2019 16:36:18 +0300 Subject: [PATCH] Do not report error about 'initializer required for @Transient properties' on lateinit vars Fixes https://github.com/Kotlin/kotlinx.serialization/issues/553 --- .../diagnostic/SerializationPluginDeclarationChecker.kt | 2 +- .../testData/diagnostics/Transients.kt | 3 +++ .../testData/diagnostics/Transients.txt | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt index 46657849923..efd37867dfd 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginDeclarationChecker.kt @@ -114,7 +114,7 @@ open class SerializationPluginDeclarationChecker : DeclarationChecker { filterUninitialized = false ) + declaration.primaryConstructorPropertiesDescriptorsMap(trace.bindingContext) propertiesMap.forEach { (descriptor, declaration) -> - val isInitialized = declarationHasInitializer(declaration) + val isInitialized = declarationHasInitializer(declaration) || descriptor.isLateInit val isMarkedTransient = descriptor.annotations.serialTransient val hasBackingField = descriptor.hasBackingField(trace.bindingContext) if (!hasBackingField && isMarkedTransient) { diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.kt index a126dfb4632..717ec5aa1b4 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.kt @@ -6,4 +6,7 @@ import kotlinx.serialization.* @Serializable data class WithTransients(@Transient val missing: Int) { @Transient val redundant: Int get() = 42 + + @Transient + lateinit var allowTransientLateinitWithoutInitializer: String } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.txt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.txt index 644c2afe067..bf60040c1d3 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.txt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/diagnostics/Transients.txt @@ -3,6 +3,7 @@ package @kotlinx.serialization.Serializable public final data class WithTransients { public constructor WithTransients(/*0*/ missing: kotlin.Int) @kotlin.Deprecated(level = DeprecationLevel.HIDDEN, message = "This synthesized declaration should not be used directly", replaceWith = kotlin.ReplaceWith(expression = "", imports = {})) public /*synthesized*/ constructor WithTransients(/*0*/ seen1: kotlin.Int, /*1*/ serializationConstructorMarker: kotlinx.serialization.SerializationConstructorMarker?) + @kotlinx.serialization.Transient public final lateinit var allowTransientLateinitWithoutInitializer: kotlin.String @kotlinx.serialization.Transient public final val missing: kotlin.Int @kotlinx.serialization.Transient public final val redundant: kotlin.Int public final operator /*synthesized*/ fun component1(): kotlin.Int