diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 851f97a9dea..939d95bb2a3 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -6065,6 +6065,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/light/jsClassOnReifiedType.kt"); doTest(fileName); } + + @TestMetadata("jsClassSimpleName.kt") + public void testJsClassSimpleName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/reflection/light/jsClassSimpleName.kt"); + doTest(fileName); + } } } diff --git a/js/js.translator/testData/box/reflection/light/jsClassSimpleName.kt b/js/js.translator/testData/box/reflection/light/jsClassSimpleName.kt new file mode 100644 index 00000000000..4a9e14337d1 --- /dev/null +++ b/js/js.translator/testData/box/reflection/light/jsClassSimpleName.kt @@ -0,0 +1,46 @@ +package foo + +class undefined + +class Outer { + class Nested + + inner class Inner +} + +fun testWithInstance() { + assertEquals("A", A().jsClass.simpleName) + assertEquals("B", B().jsClass.simpleName) + assertEquals("O", O.jsClass.simpleName) + assertEquals("E", E.X.jsClass.simpleName) + assertEquals("Y", E.Y.jsClass.simpleName) +// TODO uncomment after KT-13338 is fixed +// assertEquals("E", E.Z.jsClass.name) + assertEquals("undefined", undefined().jsClass.simpleName) + assertEquals("Nested", Outer.Nested().jsClass.simpleName) + assertEquals("Inner", Outer().Inner().jsClass.simpleName) +} + +fun testWithClassReference() { + assertEquals("A", jsClass().simpleName) + assertEquals("B", jsClass().simpleName) + assertEquals("O", jsClass().simpleName) + assertEquals("I", jsClass().simpleName) + assertEquals("E", jsClass().simpleName) + assertEquals("undefined", jsClass().simpleName) + assertEquals("Nested", jsClass().simpleName) + assertEquals("Inner", jsClass().simpleName) +} + +val JsClass<*>.simpleName: String + get() { + val dynClass: dynamic = this + return dynClass.`$metadata$`.simpleName as? String ?: "" + } + +fun box(): String { + testWithInstance() + testWithClassReference() + + return "OK" +} diff --git a/js/js.translator/testData/kotlin_lib_ecma5.js b/js/js.translator/testData/kotlin_lib_ecma5.js index 9086413bb39..843a27e2276 100644 --- a/js/js.translator/testData/kotlin_lib_ecma5.js +++ b/js/js.translator/testData/kotlin_lib_ecma5.js @@ -225,6 +225,7 @@ Kotlin.createClass = function (basesFun, constructor, properties, staticProperties) { function $o() { var klass = Kotlin.createClassNow(getBases(basesFun), constructor, properties, staticProperties); + klass.$metadata$.simpleName = $o.className; Object.defineProperty(this, $o.className, {value: klass}); if (staticProperties && staticProperties.object_initializer$) { staticProperties.object_initializer$(klass); @@ -265,7 +266,7 @@ else { entryObject = entryFactory(); } - + entryObject.ordinal$ = i++; entryObject.name$ = entryName; cls[entryName] = entryObject; @@ -302,6 +303,7 @@ function $o() { var klass = Kotlin.createTraitNow(getBases(basesFun), properties, staticProperties); klass.name = $o.className; + klass.$metadata$.simpleName = $o.className; Object.defineProperty(this, $o.className, {value: klass}); return klass; } @@ -325,6 +327,7 @@ var obj = Object.create(klass.prototype); var metadata = klass.$metadata$; metadata.type = Kotlin.TYPE.OBJECT; + metadata.simpleName = $o.className; Object.defineProperty(this, $o.className, {value: obj}); defineNestedTypes(obj, klass.$metadata$.types); copyProperties(obj, metadata.staticMembers);