Prohibit @JvmRecord for non-data classes

^KT-43677 In Progress
This commit is contained in:
Denis.Zharkov
2020-11-30 20:20:14 +03:00
parent cc0b584445
commit c8851c4f75
11 changed files with 92 additions and 53 deletions
@@ -10,7 +10,7 @@ public class JavaClass {
// FILE: main.kt
@JvmRecord
class MyRec<R>(val x: String, val y: R)
data class MyRec<R>(val x: String, val y: R)
fun box(): String {
val recordComponents = MyRec::class.java.recordComponents
@@ -0,0 +1,16 @@
// !LANGUAGE: +JvmRecordSupport
// JVM_TARGET: 15_PREVIEW
@JvmRecord
data class MyRec<R>(val x: String, val y: R)
fun box(): String {
val m1 = MyRec("O", "K")
val m2 = MyRec("O", "K")
if (m1 != m2) return "fail 1"
if (m1.hashCode() != m2.hashCode()) return "fail 2"
if (m1.toString() != "MyRec(x=O, y=K)") return "fail 3: $m1"
return "OK"
}
@@ -1,25 +1,25 @@
// !LANGUAGE: +JvmRecordSupport
// SKIP_TXT
@JvmRecord
class <!JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS!>A0<!>
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A0
@JvmRecord
class <!JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS!>A1<!> {
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A1 {
constructor()
}
@JvmRecord
class A2<!JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS!>()<!>
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A2()
@JvmRecord
class A3(<!JVM_RECORD_NOT_VAL_PARAMETER!><!UNUSED_PARAMETER!>name<!>: String<!>)
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A3(<!UNUSED_PARAMETER!>name<!>: String)
@JvmRecord
class A4(<!JVM_RECORD_NOT_VAL_PARAMETER!>var name: String<!>)
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A4(var name: String)
@JvmRecord
class A5(vararg val name: String, <!JVM_RECORD_NOT_VAL_PARAMETER!><!UNUSED_PARAMETER!>y<!>: Int<!>)
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A5(vararg val name: String, <!UNUSED_PARAMETER!>y<!>: Int)
@JvmRecord
<!NON_FINAL_JVM_RECORD!>open<!> class A6(val x: String)
@@ -35,7 +35,7 @@ class A5(vararg val name: String, <!JVM_RECORD_NOT_VAL_PARAMETER!><!UNUSED_PARAM
X("");
}
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class A10(
val x: String,
val y: Int,
@@ -6,15 +6,15 @@ interface I
val i: I = object : I {}
@JvmRecord
class MyRec1(val name: String) : <!DELEGATION_BY_IN_JVM_RECORD!>I by i<!>
data class MyRec1(val name: String) : <!DELEGATION_BY_IN_JVM_RECORD!>I by i<!>
@JvmRecord
class MyRec2(val name: String) {
data class MyRec2(val name: String) {
<!FIELD_IN_JVM_RECORD!>val x: Int = 0<!>
}
@JvmRecord
class MyRec3(val name: String) {
data class MyRec3(val name: String) {
<!FIELD_IN_JVM_RECORD!>val y: String
get() = field + "1"<!>
@@ -24,12 +24,12 @@ class MyRec3(val name: String) {
}
@JvmRecord
class MyRec4(val name: String) {
data class MyRec4(val name: String) {
<!FIELD_IN_JVM_RECORD!>val z: Int by lazy { 1 }<!>
}
@JvmRecord
class MyRec5(val name: String) {
data class MyRec5(val name: String) {
val w: String get() = name + "1"
}
@@ -1,11 +1,11 @@
// !LANGUAGE: +JvmRecordSupport
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class BasicRecord(val x: String)
@JvmRecord
data class BasicDataRecord(val x: String)
@JvmRecord
<!NON_DATA_CLASS_JVM_RECORD!>@JvmRecord<!>
class BasicRecordWithSuperClass(val x: String) : Record()
@@ -4,16 +4,16 @@ abstract class Abstract
interface I
@JvmRecord
class <!JVM_RECORD_EXTENDS_CLASS!>A1<!>(val x: String) : Abstract(), I
data class <!JVM_RECORD_EXTENDS_CLASS!>A1<!>(val x: String) : Abstract(), I
@JvmRecord
class <!JVM_RECORD_EXTENDS_CLASS!>A2<!>(val x: String) : Any(), I
data class <!JVM_RECORD_EXTENDS_CLASS!>A2<!>(val x: String) : Any(), I
@JvmRecord
class A3(val x: String) : Record(), I
data class A3(val x: String) : Record(), I
@JvmRecord
class A4(val x: String) : java.lang.Record(), I
data class A4(val x: String) : java.lang.Record(), I
@JvmRecord
class A5(val x: String) : I
data class A5(val x: String) : I
@@ -1,40 +1,50 @@
package
@kotlin.jvm.JvmRecord public final class A1 : Abstract, I, java.lang.Record {
@kotlin.jvm.JvmRecord public final data class A1 : Abstract, I, java.lang.Record {
public constructor A1(/*0*/ x: kotlin.String)
public final val x: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.String = ...): A1
public open override /*3*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*3*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*3*/ /*synthesized*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmRecord public final class A2 : kotlin.Any, I, java.lang.Record {
@kotlin.jvm.JvmRecord public final data class A2 : kotlin.Any, I, java.lang.Record {
public constructor A2(/*0*/ x: kotlin.String)
public final val x: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.String = ...): A2
public open override /*3*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*3*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*3*/ /*synthesized*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmRecord public final class A3 : java.lang.Record, I {
@kotlin.jvm.JvmRecord public final data class A3 : java.lang.Record, I {
public constructor A3(/*0*/ x: kotlin.String)
public final val x: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.String = ...): A3
public open override /*2*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*synthesized*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmRecord public final class A4 : java.lang.Record, I {
@kotlin.jvm.JvmRecord public final data class A4 : java.lang.Record, I {
public constructor A4(/*0*/ x: kotlin.String)
public final val x: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.String = ...): A4
public open override /*2*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*synthesized*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmRecord public final class A5 : I, java.lang.Record {
@kotlin.jvm.JvmRecord public final data class A5 : I, java.lang.Record {
public constructor A5(/*0*/ x: kotlin.String)
public final val x: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.String = ...): A5
public open override /*2*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*synthesized*/ fun toString(): kotlin.String