From f7ccb3819ed4fa07da89c4d7a5154eeb774868e3 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Mon, 13 Jul 2015 00:27:51 +0300 Subject: [PATCH] JS: don't pollute object with `$metadata$` #KT-8126 Fixed --- .../kotlin/js/test/semantics/ObjectTest.java | 4 ++ js/js.translator/testData/kotlin_lib_ecma5.js | 4 +- .../object/cases/dontPolluteObject.kt | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/object/cases/dontPolluteObject.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ObjectTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ObjectTest.java index f1a2f0d9cc8..2b5e4b88d6f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ObjectTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ObjectTest.java @@ -59,4 +59,8 @@ public final class ObjectTest extends SingleFileTranslationTest { public void testLambdaInObjectInsideObject() throws Exception { checkFooBoxIsOk(); } + + public void testDontPolluteObject() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/testData/kotlin_lib_ecma5.js b/js/js.translator/testData/kotlin_lib_ecma5.js index e0c62d82ba2..fd799ac5cd8 100644 --- a/js/js.translator/testData/kotlin_lib_ecma5.js +++ b/js/js.translator/testData/kotlin_lib_ecma5.js @@ -175,9 +175,7 @@ var Kotlin = {}; Kotlin.createObjectNow = function (bases, constructor, functions) { var noNameClass = Kotlin.createClassNow(bases, constructor, functions); var obj = new noNameClass(); - obj.$metadata$ = { - type: Kotlin.TYPE.OBJECT - }; + noNameClass.$metadata$.type = Kotlin.TYPE.OBJECT; return obj; }; diff --git a/js/js.translator/testData/object/cases/dontPolluteObject.kt b/js/js.translator/testData/object/cases/dontPolluteObject.kt new file mode 100644 index 00000000000..9349125a2b6 --- /dev/null +++ b/js/js.translator/testData/object/cases/dontPolluteObject.kt @@ -0,0 +1,45 @@ +package foo + +object EmptyObject {} + +object SomeObject { + val foo = 1 + var bar = "t" + fun baz() {} +} + +val emptyObjectExpr = object {} + +val someObjectExpr = object { + val foo = 1 + var bar = "t" + fun baz() {} +} + +val o = js("Object") + +fun keys(a: Any): List { + val arr: Array = o.keys(a) + return arr.toList() +} + +fun getOwnPropertyNames(a: Any): List { + val arr: Array = o.getOwnPropertyNames(a) + return arr.toList() +} + +fun box(): String { + assertEquals(listOf(), getOwnPropertyNames(EmptyObject)) + assertEquals(listOf(), keys(EmptyObject)) + + assertEquals(listOf("foo", "bar"), getOwnPropertyNames(SomeObject)) + assertEquals(listOf("foo", "bar"), keys(SomeObject)) + + assertEquals(listOf(), getOwnPropertyNames(emptyObjectExpr)) + assertEquals(listOf(), keys(emptyObjectExpr)) + + assertEquals(listOf("foo", "bar"), getOwnPropertyNames(someObjectExpr)) + assertEquals(listOf("foo", "bar"), keys(someObjectExpr)) + + return "OK" +}