JS backend: added regression tests for closure bugs.
#KT-4236 In Progress #KT-4600 In Progress #KT-4237 In Progress #KT-4207 In Progress #KT-4218 In Progress #KT-4263 Obsolete
This commit is contained in:
@@ -143,4 +143,24 @@ public final class ClosureTest extends SingleFileTranslationTest {
|
|||||||
public void testClosureInFewFunctionWithDifferentName() throws Exception {
|
public void testClosureInFewFunctionWithDifferentName() throws Exception {
|
||||||
checkFooBoxIsOk();
|
checkFooBoxIsOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testClosureLambdaVarInLambda() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testClosureThisInExtLambdaInsideMethod() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testClosureInWithInsideWith() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testClosureInNestedLambdasInObject() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testClosureThisInLambdaInsideMethod() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// KT-4218 Nested function literal on singleton object fails
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
object SomeObject {
|
||||||
|
val values = create()
|
||||||
|
fun create() = Array<Array<String>>(1) { y ->
|
||||||
|
Array<String>(1) { x ->
|
||||||
|
"(${x}, ${y})"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if (SomeObject.values[0][0] != "(0, 0)") return SomeObject.values[0][0]
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// KT-4237 With in with
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
class A {
|
||||||
|
val ok = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class B
|
||||||
|
|
||||||
|
fun with<T>(o: T, body: T.() -> Unit) {
|
||||||
|
o.body()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var o = ""
|
||||||
|
|
||||||
|
with(A()) {
|
||||||
|
with(B()) {
|
||||||
|
o = ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return o
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// KT-4263 Wrong capturing a function literal variable
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
fun assertEquals<T>(expected: T, actual: T) {
|
||||||
|
if (expected != actual) throw Exception("expected = $expected, actual = $actual")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var foo = { 1 }
|
||||||
|
var bar = 1
|
||||||
|
|
||||||
|
val t = { "${foo()} $bar" }
|
||||||
|
fun b() = "${foo()} $bar"
|
||||||
|
|
||||||
|
foo = { 2 }
|
||||||
|
bar = 2
|
||||||
|
|
||||||
|
assertEquals("2 2", t())
|
||||||
|
assertEquals("2 2", b())
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// KT-4600 Generated wrong code when capturing `this` in extension function inside a method
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
fun run<T>(f: Int.() -> T) = 1.f()
|
||||||
|
|
||||||
|
public class Foo(val trigger: () -> Any) {
|
||||||
|
fun test() = run {trigger()};
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Foo({ "OK" }).test()
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// KT-4207 Closure this doesn't work in JS backend
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
fun String.foo() = { this }
|
||||||
|
|
||||||
|
class A {
|
||||||
|
fun foo() = { this }
|
||||||
|
val ok = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
if ("OK".foo()() != "OK") return "\"OK\".foo()() != \"OK\""
|
||||||
|
if (A().foo()().ok != "OK") return "A().foo()().ok != \"OK\""
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user