KT-4107 Data objects

This commit is contained in:
Pavel Mikhailovskii
2022-06-28 09:51:57 +02:00
parent 6c31dc90e4
commit c3c09aa95a
75 changed files with 1183 additions and 134 deletions
+15
View File
@@ -0,0 +1,15 @@
// LANGUAGE: +DataObjects
// WITH_STDLIB
package com.example
import kotlin.test.*
data object DataObject
fun box(): String {
assertEquals(DataObject, DataObject)
assertFalse(DataObject == null)
return "OK"
}
+19
View File
@@ -0,0 +1,19 @@
// LANGUAGE: +DataObjects
// WITH_STDLIB
package com.example
import kotlin.test.*
data object DataObject {
data object Inner
}
fun box(): String {
assertEquals(DataObject.hashCode(), DataObject.hashCode())
assertNotEquals(DataObject.hashCode(), DataObject.Inner.hashCode())
assertNotEquals(0, DataObject.hashCode())
assertNotEquals(0, DataObject.Inner.hashCode())
return "OK"
}
@@ -0,0 +1,18 @@
// LANGUAGE: +DataObjects
// WITH_STDLIB
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
data object DataObject
val doppelganger = DataObject::class.java.declaredConstructors[0].apply { isAccessible = true }.newInstance()
fun box(): String {
assertFalse(DataObject === doppelganger)
assertEquals(DataObject, doppelganger)
assertEquals(DataObject.hashCode(), DataObject::class.java.cast(doppelganger).hashCode())
return "OK"
}
@@ -0,0 +1,19 @@
// LANGUAGE: +DataObjects
// WITH_STDLIB
// TARGET_BACKEND: JVM_IR
// FULL_JDK
// CHECK_BYTECODE_LISTING
import java.io.*
data object NonSerializableDataObject
data object SerializableDataObject: Serializable
fun box(): String {
ByteArrayOutputStream().use { baos ->
ObjectOutputStream(baos).use { oos -> oos.writeObject(SerializableDataObject) }
ByteArrayInputStream(baos.toByteArray()).use { bais -> assert(java.io.ObjectInputStream(bais).readObject() === SerializableDataObject) }
}
return "OK"
}
@@ -0,0 +1,28 @@
@kotlin.Metadata
public final class NonSerializableDataObject {
// source: 'serialization.kt'
public final static @org.jetbrains.annotations.NotNull field INSTANCE: NonSerializableDataObject
static method <clinit>(): void
private method <init>(): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public method hashCode(): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
}
@kotlin.Metadata
public final class SerializableDataObject {
// source: 'serialization.kt'
public final static @org.jetbrains.annotations.NotNull field INSTANCE: SerializableDataObject
static method <clinit>(): void
private method <init>(): void
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public method hashCode(): int
private final method readResolve(): java.lang.Object
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
}
@kotlin.Metadata
public final class SerializationKt {
// source: 'serialization.kt'
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
}
+52
View File
@@ -0,0 +1,52 @@
// LANGUAGE: +DataObjects
// WITH_STDLIB
package com.example
import kotlin.test.*
data object DataObject {
data object Nested
}
class Foo {
data object Inner
}
data object Declared {
override fun toString() = "Overriden"
}
open class WithFinalToString {
final override fun toString() = "FinalToString"
}
data object InheritedFromClassWithFinalToString: WithFinalToString()
open class WithOpenToString {
override fun toString() = "OpenToString"
}
data object InheritedFromClassWithOpenToString: WithOpenToString()
abstract class WithAbstractToString {
abstract override fun toString(): String
}
data object InheritedFromClassWithAbstractToString : WithAbstractToString()
class C {
companion object CC
}
fun box(): String {
assertEquals("DataObject", DataObject.toString())
assertEquals("Nested", DataObject.Nested.toString())
assertEquals("Inner", Foo.Inner.toString())
assertEquals("Overriden", Declared.toString())
assertEquals("FinalToString", InheritedFromClassWithFinalToString.toString())
assertEquals("InheritedFromClassWithOpenToString", InheritedFromClassWithOpenToString.toString())
assertEquals("InheritedFromClassWithAbstractToString", InheritedFromClassWithAbstractToString.toString())
return "OK"
}