[K/JS] Fix initialization issue for objects which annotated with @JsExport and contain nested classes
Merge-request: KT-MR-11146 Merged-by: Artem Kobzar <Artem.Kobzar@jetbrains.com>
This commit is contained in:
+3
-7
@@ -119,11 +119,7 @@ class ExportModelToJsStatements(
|
|||||||
is ExportedObject -> {
|
is ExportedObject -> {
|
||||||
require(namespace != null || esModules) { "Only namespaced properties are allowed" }
|
require(namespace != null || esModules) { "Only namespaced properties are allowed" }
|
||||||
val (name, objectClassInitialization) = declaration.getNameAndInitialization()
|
val (name, objectClassInitialization) = declaration.getNameAndInitialization()
|
||||||
val newNameSpace = when {
|
val newNameSpace = jsElementAccess(Namer.PROTOTYPE_NAME, name.makeRef())
|
||||||
namespace != null -> jsElementAccess(declaration.name, namespace)
|
|
||||||
else ->
|
|
||||||
jsElementAccess(Namer.PROTOTYPE_NAME, name.makeRef())
|
|
||||||
}
|
|
||||||
val staticsExport =
|
val staticsExport =
|
||||||
declaration.nestedClasses.flatMap { generateDeclarationExport(it, newNameSpace, esModules, declaration.ir) }
|
declaration.nestedClasses.flatMap { generateDeclarationExport(it, newNameSpace, esModules, declaration.ir) }
|
||||||
|
|
||||||
@@ -256,11 +252,11 @@ class ExportModelToJsStatements(
|
|||||||
|
|
||||||
private fun ExportedClass.getNameAndInitialization(): Pair<JsName, JsStatement?> {
|
private fun ExportedClass.getNameAndInitialization(): Pair<JsName, JsStatement?> {
|
||||||
return when (val classRef = ir.getClassRef(staticContext)) {
|
return when (val classRef = ir.getClassRef(staticContext)) {
|
||||||
!is JsNameRef -> {
|
is JsNameRef -> classRef.name!! to null
|
||||||
|
else -> {
|
||||||
val stableName = JsName(name, true)
|
val stableName = JsName(name, true)
|
||||||
stableName to JsVars(JsVars.JsVar(stableName, classRef))
|
stableName to JsVars(JsVars.JsVar(stableName, classRef))
|
||||||
}
|
}
|
||||||
else -> classRef.name!! to null
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
// See KT-6201
|
// See KT-6201
|
||||||
package foo
|
package foo
|
||||||
|
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
|
|
||||||
var log = ""
|
var log = ""
|
||||||
|
|
||||||
open class Mixin {
|
open class Mixin {
|
||||||
@@ -39,8 +37,20 @@ object O5 {
|
|||||||
val someValue = O3.also { log = "O5 also" }
|
val someValue = O3.also { log = "O5 also" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
object O6 {
|
||||||
|
init {
|
||||||
|
log = "O6 init"
|
||||||
|
}
|
||||||
|
object O7 {
|
||||||
|
init {
|
||||||
|
log = "O7 init"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
if (log != "") return "Fail: something was initialized before any object was used"
|
if (log != "") return "Fail: something was initialized before any object was used: $log"
|
||||||
O1
|
O1
|
||||||
if (log != "O1 init") return "Fail: O1 didn't initialized lazy"
|
if (log != "O1 init") return "Fail: O1 didn't initialized lazy"
|
||||||
O2
|
O2
|
||||||
@@ -51,5 +61,10 @@ fun box(): String {
|
|||||||
if (log != "initCall") return "Fail: O4 didn't initialized lazy"
|
if (log != "initCall") return "Fail: O4 didn't initialized lazy"
|
||||||
O5
|
O5
|
||||||
if (log != "O5 also") return "Fail: O5 didn't initialized lazy"
|
if (log != "O5 also") return "Fail: O5 didn't initialized lazy"
|
||||||
|
O6
|
||||||
|
if (log != "O6 init") return "Fail: O6 didn't initialized lazy"
|
||||||
|
O6.O7
|
||||||
|
if (log != "O7 init") return "Fail: O7 didn't initialized lazy"
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user