[Serialization] Add DiagnosticsTests for FIR

This commit is contained in:
Dmitriy Novozhilov
2022-09-05 11:25:37 +03:00
committed by teamcity
parent 21aec49709
commit 84b8ab1f9c
22 changed files with 520 additions and 0 deletions
@@ -0,0 +1,10 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
@Serializable
open class Parent(open val arg: Int)
@Serializable
class Derived(override val arg: Int): Parent(arg)
@@ -0,0 +1,29 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.*
@Serializable
enum class ImplicitlyDuplicated {
@SerialName("foo")
FIRST,
@SerialName("foo")
SECOND
}
@Serializable
enum class ExplicitlyDuplicated {
FIRST,
SECOND,
@SerialName("FIRST")
THIRD
}
@Serializable
enum class ReversedExplicitlyDuplicated {
@SerialName("THIRD")
FIRST,
SECOND,
THIRD
}
@@ -0,0 +1,3 @@
An operation is not implemented: Support @Serializer(for=...) supertype generation
kotlin.NotImplementedError: An operation is not implemented: Support @Serializer(for=...) supertype generation
at org.jetbrains.kotlinx.serialization.compiler.fir.SerializationFirSupertypesExtension.computeAdditionalSupertypes(SerializationFirSupertypesExtension.kt:39)
@@ -0,0 +1,10 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE, -OPT_IN_USAGE
// SKIP_TXT
// FILE: test.kt
import kotlinx.serialization.*
class Foo(i: Int, val j: Int)
@Serializer(forClass = Foo::class)
object ExternalSerializer
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.Serializable
import java.io.Serializable as JavaSerializable
@Serializable
class Data(val x: Int, @Transient val y: String)
@Serializable
class Data2(val x: Int, @Transient val y: String) : JavaSerializable
@@ -0,0 +1,20 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import java.io.Serializable as JavaSerializable
import kotlin.jvm.Transient as JavaTransient
@Serializable
class Data(val x: Int, @Transient val y: String = "a")
@Serializable
class Data2(val x: Int, @Transient val y: String = "a") : JavaSerializable
@Serializable
class Data3(val x: Int, @Transient @JavaTransient val y: String = "a") : JavaSerializable
@Serializable
class Data4(val x: Int, @JavaTransient val y: String)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// SKIP_TXT
@@ -0,0 +1,10 @@
// This test enshures that analysis ends up without compiler exceptions
// !DIAGNOSTICS: -OPT_IN_USAGE
import kotlinx.serialization.*
@Serializable
class Digest() {
@<!OPT_IN_USAGE_ERROR!>Serializer<!>(forClass = Digest::class)
companion <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object<!> : KSerializer<Digest> {}
}
@@ -0,0 +1,47 @@
// !DIAGNOSTICS: -OPT_IN_USAGE_ERROR, -OPT_IN_USAGE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
fun container() {
@Serializable
class X // local classes are allowed
val y = @Serializable object {
fun inObjectFun() {
@Serializable
class X // local classes in anonymous object functions are not allowed
}
}
class LocalSerializer : KSerializer<Any?> {
override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", PrimitiveKind.INT)
override fun serialize(encoder: Encoder, value: Any?) {
encoder.encodeNull()
}
override fun deserialize(decoder: Decoder): Any? {
return decoder.decodeNull()
}
}
@Serializable
class WithLocalSerializerInProperty(@Serializable(with = LocalSerializer::class) val x: Any?)
@Serializable(with = LocalSerializer::class)
data class WithLocalSerializer(val i: Int)
}
val topLevelAnon = @Serializable object {}
@Serializable class A {
@Serializable class B // nested classes are allowed
@Serializable inner class C // inner classes are not
@Serializable object F {} // regular named object, OK
}
@@ -0,0 +1,9 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
open class NonSerializableParent(val arg: Int)
@Serializable
class Derived(val someData: String): NonSerializableParent(42)
@@ -0,0 +1,17 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
class NonSerializable
@Serializable
class Basic(val foo: NonSerializable)
@Serializable
class Inside(val foo: List<NonSerializable>)
@Serializable
class WithImplicitType {
val foo = NonSerializable()
}
@@ -0,0 +1,17 @@
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
@Serializable(NopeNullableSerializer::class)
class Nope {}
class NopeNullableSerializer: KSerializer<Nope?> {
override val descriptor: SerialDescriptor get() = TODO()
override fun deserialize(decoder: Decoder): Nope? = TODO()
override fun serialize(encoder: Encoder, value: Nope?) = TODO()
}
@Serializable
class Foo(val foo: Nope)
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
@Serializable
class Test(val someData: String, cantBeDeserialized: Int)
@@ -0,0 +1,24 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
import kotlinx.serialization.encoding.*
enum class SimpleEnum { A, B }
enum class MarkedNameEnum { @SerialName("a") A, B}
@Serializable
enum class ExplicitlyMarkedEnum { @SerialName("a") A, B}
@Serializable(EnumSerializer::class)
enum class ExplicitlyMarkedEnumCustom { @SerialName("a") A, B}
object EnumSerializer: KSerializer<ExplicitlyMarkedEnumCustom> {
override val descriptor = TODO()
override fun serialize(encoder: Encoder, value: ExplicitlyMarkedEnumCustom) = TODO()
override fun deserialize(decoder: Decoder): ExplicitlyMarkedEnumCustom = TODO()
}
@Serializable
data class EnumUsage(val s: SimpleEnum, val m: MarkedNameEnum, val e: ExplicitlyMarkedEnum)
@@ -0,0 +1,11 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// SKIP_TXT
// FILE: test.kt
import kotlinx.serialization.*
@Serializable
interface INonSerializable
@Serializable
sealed interface SealedSerializable
@@ -0,0 +1,19 @@
// !DIAGNOSTICS: -OPT_IN_USAGE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.*
class Bar
@Serializer(forClass = Bar::class)
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object BarSerializer<!>: KSerializer<Bar>
class Baz
@Serializer(forClass = Baz::class)
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object BazSerializer<!>: KSerializer<Baz>
@Serializable
class Foo1(@Polymorphic val i: Baz)
@Serializable
class Foo2(val li: MutableList<@Serializable(with = BazSerializer::class) Baz>)
@@ -0,0 +1,39 @@
// !DIAGNOSTICS: -OPT_IN_USAGE
// WITH_STDLIB
// SKIP_TXT
import kotlinx.serialization.*
class Bar
@Serializer(forClass = Bar::class)
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object BarSerializer<!>: KSerializer<Bar>
class Baz
@Serializer(forClass = Baz::class)
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object BazSerializer<!>: KSerializer<Baz>
@Serializer(forClass = Baz::class)
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>object NullableBazSerializer<!>: KSerializer<Baz?>
@Serializable(with = BazSerializer::class)
class Biz(val i: Int)
@Serializable
class Foo(@Serializable(with = BazSerializer::class) val i: Bar)
@Serializable
class Foo2(val li: List<@Serializable(with = BazSerializer::class) Bar>)
@Serializable
class Foo3(@Serializable(with = BazSerializer::class) val i: Baz)
@Serializable
class Foo4(val li: List<@Serializable(with = BazSerializer::class) Baz>)
@Serializable
class Foo5(@Serializable(with = BazSerializer::class) val i: Bar?)
@Serializable
class Foo6(@Serializable(with = NullableBazSerializer::class) val i: Bar)
@Serializable
class Foo7(@Serializable(with = NullableBazSerializer::class) val i: Bar?)
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER,-UNUSED_VARIABLE
// WITH_STDLIB
// FILE: test.kt
import kotlinx.serialization.*
@Serializable
data class WithTransients(@Transient val missing: Int) {
@Transient val redundant: Int get() = 42
@Transient
lateinit var allowTransientLateinitWithoutInitializer: String
}