| // KT-54635: Kotlin/JS cannot distinguish between Int and Double at runtime |
| // Expected: types third level 1.0 |
| // Actual: types third level 1 |
| // IGNORE_BACKEND: JS_IR, JS_IR_ES6 |
| |
| // WITH_STDLIB |
| // MODULE: lib |
| // FILE: lib.kt |
| |
| package foo.bar |
| |
| val sb = StringBuilder() |
| |
| class R<T> { |
| inline fun bar(t: T) { |
| sb.appendLine("just a single class: $t") |
| } |
| } |
| |
| class C { |
| inline fun foo() { |
| sb.appendLine("first level") |
| } |
| |
| class D { |
| inline fun foo() { |
| sb.appendLine("second level") |
| } |
| |
| class E { |
| inline fun foo() { |
| sb.appendLine("third levelxz") |
| } |
| } |
| } |
| } |
| |
| class C2 { |
| inline fun foo() { |
| sb.appendLine("inner first level") |
| } |
| |
| inner class D2 { |
| inline fun foo() { |
| sb.appendLine("inner second level") |
| } |
| |
| inner class E2 { |
| inline fun foo() { |
| sb.appendLine("inner third level") |
| } |
| } |
| } |
| } |
| |
| class C3<X> { |
| inline fun foo(x: X) { |
| sb.appendLine("types first level: $x") |
| } |
| |
| class D3<X> { |
| inline fun foo(x: X) { |
| sb.appendLine("types second level $x") |
| } |
| |
| class E3<X> { |
| inline fun foo(x: X) { |
| sb.appendLine("types third level $x") |
| } |
| } |
| } |
| } |
| |
| class C4<X> { |
| inline fun foo(x: X) { |
| sb.appendLine("inner types first level: $x") |
| } |
| |
| inner class D4<Y> { |
| inline fun foo(x: X, y: Y) { |
| sb.appendLine("inner types second level $x, $y") |
| } |
| |
| inner class E4<Z> { |
| inline fun foo(x: X, y: Y, z: Z) { |
| sb.appendLine("inner types third level $x, $y, $z") |
| } |
| } |
| } |
| } |
| |
| // MODULE: main(lib) |
| // FILE: main.kt |
| |
| import foo.bar.* |
| import kotlin.test.* |
| |
| fun box(): String { |
| val c = C() |
| val d = C.D() |
| val e = C.D.E() |
| c.foo() |
| d.foo() |
| e.foo() |
| |
| val c2 = C2() |
| val d2 = C2().D2() |
| val e2 = C2().D2().E2() |
| c2.foo() |
| d2.foo() |
| e2.foo() |
| |
| val c3 = C3<Int>() |
| val d3 = C3.D3<String>() |
| val e3 = C3.D3.E3<Float>() |
| c3.foo(13) |
| d3.foo("cha-cha-cha") |
| e3.foo(1.0f) |
| |
| val c4 = C4<Int>() |
| val d4 = C4<String>().D4<Int>() |
| val e4 = C4<Int>().D4<String>().E4<Int>() |
| c4.foo(13) |
| d4.foo("cawabunga", 17) |
| e4.foo(19, "raqa-taqa", 23) |
| |
| assertEquals(""" |
| first level |
| second level |
| third levelxz |
| inner first level |
| inner second level |
| inner third level |
| types first level: 13 |
| types second level cha-cha-cha |
| types third level 1.0 |
| inner types first level: 13 |
| inner types second level cawabunga, 17 |
| inner types third level 19, raqa-taqa, 23 |
| |
| """.trimIndent(), sb.toString()) |
| |
| return "OK" |
| } |