Use a correct type for SERIALIZER_TYPE_INCOMPATIBLE diagnostic.
This diagnostic used an incorrect type for rendering (outer class type instead of a property type) and didn't expand type argument of `KSerializer`. Also add an additional test case for generic parameters. #KT-63570 Fixed
This commit is contained in:
committed by
Space Team
parent
1260d03561
commit
51e3e9af94
+2
-2
@@ -564,14 +564,14 @@ object FirSerializationPluginClassChecker : FirClassChecker() {
|
|||||||
serializerType: ConeKotlinType,
|
serializerType: ConeKotlinType,
|
||||||
reporter: DiagnosticReporter
|
reporter: DiagnosticReporter
|
||||||
) {
|
) {
|
||||||
val serializerForType = serializerType.serializerForType(session) ?: return
|
val serializerForType = serializerType.serializerForType(session)?.fullyExpandedType(session) ?: return
|
||||||
|
|
||||||
val declarationTypeClassId = declarationType.classId
|
val declarationTypeClassId = declarationType.classId
|
||||||
if (declarationTypeClassId == null || declarationTypeClassId != serializerForType.classId) {
|
if (declarationTypeClassId == null || declarationTypeClassId != serializerForType.classId) {
|
||||||
reporter.reportOn(
|
reporter.reportOn(
|
||||||
source ?: containingClassSymbol.serializableOrMetaAnnotationSource,
|
source ?: containingClassSymbol.serializableOrMetaAnnotationSource,
|
||||||
FirSerializationErrors.SERIALIZER_TYPE_INCOMPATIBLE,
|
FirSerializationErrors.SERIALIZER_TYPE_INCOMPATIBLE,
|
||||||
containingClassSymbol.defaultType(),
|
declarationType,
|
||||||
serializerType,
|
serializerType,
|
||||||
serializerForType
|
serializerForType
|
||||||
)
|
)
|
||||||
|
|||||||
+8
@@ -40,3 +40,11 @@ class Foo6(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZE
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
class Foo7(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZER_TYPE_INCOMPATIBLE!>Bar?<!>)
|
class Foo7(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZER_TYPE_INCOMPATIBLE!>Bar?<!>)
|
||||||
|
|
||||||
|
// It is OK to report, because subclasses can't generally be deserialized (as `deserialize()` signature returns base class)
|
||||||
|
@Serializable
|
||||||
|
@Suppress("FINAL_UPPER_BOUND")
|
||||||
|
class Foo8<Br: Bar>(@Serializable(BarSerializer::class) val b: <!SERIALIZER_TYPE_INCOMPATIBLE("Br; BarSerializer; Bar")!>Br<!>)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
class Foo9<T>(@Serializable(BarSerializer::class) val b: <!SERIALIZER_TYPE_INCOMPATIBLE("T; BarSerializer; Bar")!>T<!>)
|
||||||
|
|||||||
+8
@@ -40,3 +40,11 @@ class Foo6(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZE
|
|||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
class Foo7(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZER_TYPE_INCOMPATIBLE!>Bar?<!>)
|
class Foo7(@Serializable(with = NullableBazSerializer::class) val i: <!SERIALIZER_TYPE_INCOMPATIBLE!>Bar?<!>)
|
||||||
|
|
||||||
|
// It is OK to report, because subclasses can't generally be deserialized (as `deserialize()` signature returns base class)
|
||||||
|
@Serializable
|
||||||
|
@Suppress("FINAL_UPPER_BOUND")
|
||||||
|
class Foo8<Br: Bar>(@Serializable(BarSerializer::class) val b: <!SERIALIZER_TYPE_INCOMPATIBLE("Br; BarSerializer; Bar")!>Br<!>)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
class Foo9<T>(@Serializable(BarSerializer::class) val b: <!SERIALIZER_TYPE_INCOMPATIBLE("T; BarSerializer; Bar")!>T<!>)
|
||||||
|
|||||||
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// FIR_DISABLE_LAZY_RESOLVE_CHECKS
|
||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
// MODULE: lib
|
||||||
|
// FILE: libtest.kt
|
||||||
|
|
||||||
|
import kotlinx.serialization.*
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
typealias MyDate = java.util.Date
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: test.kt
|
||||||
|
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.descriptors.PrimitiveKind
|
||||||
|
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
|
||||||
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
|
internal object MyDateSerializer : KSerializer<MyDate> {
|
||||||
|
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("uuid", PrimitiveKind.STRING)
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder) = TODO()
|
||||||
|
|
||||||
|
override fun serialize(
|
||||||
|
encoder: Encoder,
|
||||||
|
value: MyDate
|
||||||
|
) = encoder.encodeString(value.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Session(
|
||||||
|
@Serializable(MyDateSerializer::class) val date: MyDate,
|
||||||
|
@Serializable(MyDateSerializer::class) val alsoDate: java.util.Date,
|
||||||
|
// The only difference with FIR is how RENDER_TYPE works:
|
||||||
|
@Serializable(MyDateSerializer::class) val s: <!SERIALIZER_TYPE_INCOMPATIBLE("kotlin.String; MyDateSerializer; java.util.Date")!>String<!>,
|
||||||
|
val sl: List<<!SERIALIZER_TYPE_INCOMPATIBLE("@Serializable(...) kotlin.String; MyDateSerializer; java.util.Date")!>@Serializable(MyDateSerializer::class) String<!>>
|
||||||
|
)
|
||||||
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
// FIR_DISABLE_LAZY_RESOLVE_CHECKS
|
||||||
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
// MODULE: lib
|
||||||
|
// FILE: libtest.kt
|
||||||
|
|
||||||
|
import kotlinx.serialization.*
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
typealias MyDate = java.util.Date
|
||||||
|
|
||||||
|
// MODULE: main(lib)
|
||||||
|
// FILE: test.kt
|
||||||
|
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.descriptors.PrimitiveKind
|
||||||
|
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
|
||||||
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
|
||||||
|
internal object MyDateSerializer : KSerializer<MyDate> {
|
||||||
|
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("uuid", PrimitiveKind.STRING)
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder) = TODO()
|
||||||
|
|
||||||
|
override fun serialize(
|
||||||
|
encoder: Encoder,
|
||||||
|
value: MyDate
|
||||||
|
) = encoder.encodeString(value.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Session(
|
||||||
|
@Serializable(MyDateSerializer::class) val date: MyDate,
|
||||||
|
@Serializable(MyDateSerializer::class) val alsoDate: java.util.Date,
|
||||||
|
// The only difference with FIR is how RENDER_TYPE works:
|
||||||
|
@Serializable(MyDateSerializer::class) val s: <!SERIALIZER_TYPE_INCOMPATIBLE("String; MyDateSerializer; MyDate /* = Date */")!>String<!>,
|
||||||
|
val sl: List<@Serializable(MyDateSerializer::class) <!SERIALIZER_TYPE_INCOMPATIBLE("String; MyDateSerializer; MyDate /* = Date */")!>String<!>>
|
||||||
|
)
|
||||||
+6
@@ -164,6 +164,12 @@ public class SerializationFirPsiDiagnosticTestGenerated extends AbstractSerializ
|
|||||||
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatible.kt");
|
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatible.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("SerializerTypeIncompatibleViaTypealias.kt")
|
||||||
|
public void testSerializerTypeIncompatibleViaTypealias() throws Exception {
|
||||||
|
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatibleViaTypealias.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("Transients.kt")
|
@TestMetadata("Transients.kt")
|
||||||
public void testTransients() throws Exception {
|
public void testTransients() throws Exception {
|
||||||
|
|||||||
+6
@@ -162,6 +162,12 @@ public class SerializationPluginDiagnosticTestGenerated extends AbstractSerializ
|
|||||||
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatible.kt");
|
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatible.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("SerializerTypeIncompatibleViaTypealias.kt")
|
||||||
|
public void testSerializerTypeIncompatibleViaTypealias() throws Exception {
|
||||||
|
runTest("plugins/kotlinx-serialization/testData/diagnostics/SerializerTypeIncompatibleViaTypealias.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("Transients.kt")
|
@TestMetadata("Transients.kt")
|
||||||
public void testTransients() throws Exception {
|
public void testTransients() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user