Skip to content

Commit 23019ab

Browse files
JSMonkSpace Team
authored andcommitted
[K/JS] Make all the exported top-level declarations enumerable
^KT-19016 Fixed Merge-request: KT-MR-21552 Merged-by: Artem Kobzar <[email protected]>
1 parent 3f20af5 commit 23019ab

File tree

11 files changed

+164
-8
lines changed

11 files changed

+164
-8
lines changed

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelToJsStatements.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ class ExportModelToJsStatements(
110110
declaration.name,
111111
getter?.makeRef(),
112112
setter?.makeRef(),
113-
staticContext
113+
staticContext,
114+
enumerable = true
114115
).makeStmt()
115116
)
116117
}
@@ -150,7 +151,8 @@ class ExportModelToJsStatements(
150151
}
151152
).makeRef(),
152153
null,
153-
staticContext
154+
staticContext,
155+
enumerable = true
154156
).makeStmt()
155157
)
156158
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,25 @@ fun objectCreate(prototype: JsExpression, context: JsStaticContext) =
9393
prototype
9494
)
9595

96-
fun defineProperty(obj: JsExpression, name: String, getter: JsExpression?, setter: JsExpression?, context: JsStaticContext): JsExpression {
96+
fun defineProperty(
97+
obj: JsExpression,
98+
name: String,
99+
getter: JsExpression?,
100+
setter: JsExpression?,
101+
context: JsStaticContext,
102+
enumerable: Boolean = false,
103+
): JsExpression {
97104
return JsInvocation(
98105
context
99106
.getNameForStaticFunction(context.backendContext.intrinsics.jsDefinePropertySymbol.owner)
100107
.makeRef(),
101-
listOfNotNull(obj, JsStringLiteral(name), getter ?: runIf(setter != null) { jsUndefined(context) }, setter)
108+
listOfNotNull(
109+
obj,
110+
JsStringLiteral(name),
111+
getter ?: runIf(setter != null) { jsUndefined(context) },
112+
setter ?: runIf(enumerable) { jsUndefined(context) },
113+
runIf(enumerable) { JsBooleanLiteral(enumerable) }
114+
)
102115
)
103116
}
104117

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsBoxTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsBoxTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// ES_MODULES
2+
3+
// MODULE: lib
4+
// FILE: lib.kt
5+
@file:JsExport
6+
package foo
7+
8+
val valueSimpleProperty = "foo"
9+
var variableSimpleProperty = "foo"
10+
11+
val valueGetterProperty: String
12+
get() = "foo"
13+
14+
var variableGetterSetterProperty: String
15+
get() = variableSimpleProperty
16+
set(value) { variableSimpleProperty = value }
17+
18+
fun simpleFunction() {}
19+
20+
class SimpleClass {}
21+
22+
object SimpleObject
23+
24+
// FILE: test.mjs
25+
// ENTRY_ES_MODULE
26+
import * as lib from "./allTheExportedEntitiesAreEnumerable-lib_v5.mjs";
27+
28+
export function box() {
29+
var allTheExportedEntities = Object.keys(lib);
30+
31+
if (allTheExportedEntities[0] !== 'SimpleClass') return "Error: 'SimpleClass' is not enumerable"
32+
if (allTheExportedEntities[1] !== 'SimpleObject') return "Error: 'SimpleObject' is not enumerable"
33+
if (allTheExportedEntities[2] !== 'simpleFunction') return "Error: 'simpleFunction' is not enumerable"
34+
if (allTheExportedEntities[3] !== 'valueGetterProperty') return "Error: 'valueGetterProperty' is not enumerable"
35+
if (allTheExportedEntities[4] !== 'valueSimpleProperty') return "Error: 'valueSimpleProperty' is not enumerable"
36+
if (allTheExportedEntities[5] !== 'variableGetterSetterProperty') return "Error: 'variableGetterSetterProperty' is not enumerable"
37+
if (allTheExportedEntities[6] !== 'variableSimpleProperty') return "Error: 'variableSimpleProperty' is not enumerable"
38+
if (allTheExportedEntities.length !== 7) return "Error: some extra entities are visible"
39+
40+
return "OK"
41+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// TARGET_BACKEND: JS_IR, JS_IR_ES6
2+
// RUN_PLAIN_BOX_FUNCTION
3+
// INFER_MAIN_MODULE
4+
5+
// MODULE: lib
6+
// FILE: lib.kt
7+
@file:JsExport
8+
package foo
9+
10+
val valueSimpleProperty = "foo"
11+
var variableSimpleProperty = "foo"
12+
13+
val valueGetterProperty: String
14+
get() = "foo"
15+
16+
var variableGetterSetterProperty: String
17+
get() = variableSimpleProperty
18+
set(value) { variableSimpleProperty = value }
19+
20+
fun simpleFunction() {}
21+
22+
class SimpleClass {}
23+
24+
object SimpleObject
25+
26+
// FILE: test.js
27+
function box() {
28+
var allTheExportedEntities = Object.keys(this.lib.foo);
29+
30+
if (allTheExportedEntities[0] !== 'valueSimpleProperty') return "Error: 'valueSimpleProperty' is not enumerable"
31+
if (allTheExportedEntities[1] !== 'variableSimpleProperty') return "Error: 'variableSimpleProperty' is not enumerable"
32+
if (allTheExportedEntities[2] !== 'valueGetterProperty') return "Error: 'valueGetterProperty' is not enumerable"
33+
if (allTheExportedEntities[3] !== 'variableGetterSetterProperty') return "Error: 'variableGetterSetterProperty' is not enumerable"
34+
if (allTheExportedEntities[4] !== 'simpleFunction') return "Error: 'simpleFunction' is not enumerable"
35+
if (allTheExportedEntities[5] !== 'SimpleClass') return "Error: 'SimpleClass' is not enumerable"
36+
if (allTheExportedEntities[6] !== 'SimpleObject') return "Error: 'SimpleObject' is not enumerable"
37+
if (allTheExportedEntities.length !== 7) return "Error: some extra entities are visible"
38+
39+
return "OK"
40+
}

libraries/stdlib/js/runtime/collectionsInterop.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ private fun <E> createJsSetViewWith(
139139
): dynamic {
140140
val setView = objectCreate<JsSetView<E>>().also {
141141
js("it[Symbol.iterator] = valuesIterator")
142-
defineProp(it, "size", setSize, VOID)
142+
defineProp(it, "size", setSize, VOID, true)
143143
}
144144

145145
return js("""
@@ -202,7 +202,7 @@ private fun <K, V> createJsMapViewWith(
202202
): dynamic {
203203
val mapView = objectCreate<JsMapView<K, V>>().also {
204204
js("it[Symbol.iterator] = entriesIterator")
205-
defineProp(it, "size", mapSize, VOID)
205+
defineProp(it, "size", mapSize, VOID, true)
206206
}
207207

208208
return js("""

0 commit comments

Comments
 (0)