Generate copy function for data classes

#KT-2779 Fixed
This commit is contained in:
Natalia.Ukhorskaya
2012-10-31 15:34:46 +04:00
parent 6009038342
commit 3b58eb4b60
20 changed files with 388 additions and 33 deletions
@@ -0,0 +1,29 @@
data class A(val a: Int = 1, val b: String = "$a") {}
fun box() : String {
var result = ""
val a = A()
val b = a.copy()
if (b.a == 1 && b.b == "1") {
result += "1"
}
val c = a.copy(a = 2)
if (c.a == 2 && c.b == "1") {
result += "2"
}
val d = a.copy(b = "2")
if (d.a == 1 && d.b == "2") {
result += "3"
}
val e = a.copy(a = 2, b = "2")
if (e.a == 2 && e.b == "2") {
result += "4"
}
if (result == "1234") {
return "OK"
}
return "fail"
}
@@ -0,0 +1,17 @@
data class A(a: Int, b: String) {}
fun box() : String {
for (method in javaClass<A>().getDeclaredMethods()) {
if (method.getName() == "copy"){
val parameterTypes = method.getParameterTypes()
if (parameterTypes != null && parameterTypes.size == 2) {
val copy = A(1, "a").copy(a = 2, b = "b")
return "OK"
}
else {
return "Method copy has " + (if (parameterTypes == null) "0" else parameterTypes.size) + " parameters, expected 2"
}
}
}
return "fail"
}
@@ -0,0 +1,29 @@
data class A(val a: Int, val b: String) {}
fun box() : String {
var result = ""
val a = A(1, "a")
val b = a.copy()
if (b.a == 1 && b.b == "a") {
result += "1"
}
val c = a.copy(a = 2)
if (c.a == 2 && c.b == "a") {
result += "2"
}
val d = a.copy(b = "b")
if (d.a == 1 && d.b == "b") {
result += "3"
}
val e = a.copy(a = 2, b = "b")
if (e.a == 2 && e.b == "b") {
result += "4"
}
if (result == "1234") {
return "OK"
}
return "fail"
}
@@ -0,0 +1,29 @@
data class A(var a: Int, var b: String) {}
fun box() : String {
var result = ""
val a = A(1, "a")
val b = a.copy()
if (b.a == 1 && b.b == "a") {
result += "1"
}
val c = a.copy(a = 2)
if (c.a == 2 && c.b == "a") {
result += "2"
}
val d = a.copy(b = "b")
if (d.a == 1 && d.b == "b") {
result += "3"
}
val e = a.copy(a = 2, b = "b")
if (e.a == 2 && e.b == "b") {
result += "4"
}
if (result == "1234") {
return "OK"
}
return "fail"
}
@@ -0,0 +1,14 @@
data class A(val a: Foo<String>) {}
class Foo<T>(val a: T) { }
fun box() : String {
val f1 = Foo("a")
val f2 = Foo("b")
val a = A(f1)
val b = a.copy(f2)
if (b.a.a == "b") {
return "OK"
}
return "fail"
}