From d8b1d095663095e4bdb7cbd591da47e2c9d6610d Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 6 Feb 2019 14:27:43 +0300 Subject: [PATCH] [JS IR BE] Support codegen for external objects and properties --- .../IrElementToJsExpressionTransformer.kt | 22 +++++++++++++++++-- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 10 ++++++++- .../box/crossModuleRef/topLevelProperty.kt | 1 - .../interfaces/fromExternalInterface.kt | 1 - .../testData/box/jsModule/externalObject.kt | 1 - 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt index 9c1dd157813..4e44d8e57b2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt @@ -79,9 +79,14 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer { + val obj = expression.symbol.owner val className = context.getNameForSymbol(expression.symbol) - val getInstanceName = className.ident + "_getInstance" - JsInvocation(JsNameRef(getInstanceName)) + if (obj.isEffectivelyExternal()) { + className.makeRef() + } else { + val getInstanceName = className.ident + "_getInstance" + JsInvocation(JsNameRef(getInstanceName)) + } } else -> TODO() } @@ -131,6 +136,19 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer nameRef + property.setter -> jsAssignment(nameRef, arguments.single()) + else -> error("Function must be an accessor of corresponding property") + } + } + } + if (isNativeInvoke(expression)) { return JsInvocation(jsDispatchReceiver!!, arguments) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index ab6ffba1641..c8010a54bd9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -403,9 +403,17 @@ fun IrFunction.isFakeOverriddenFromAny(): Boolean { fun IrCall.isSuperToAny() = superQualifier?.let { this.symbol.owner.isFakeOverriddenFromAny() } ?: false fun IrDeclaration.isEffectivelyExternal(): Boolean { + + fun IrFunction.effectiveParentDeclaration(): IrDeclaration? = + when (this) { + is IrSimpleFunction -> correspondingProperty ?: parent as? IrDeclaration + else -> parent as? IrDeclaration + } + return when (this) { - is IrFunction -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() + is IrFunction -> isExternal || (effectiveParentDeclaration()?.isEffectivelyExternal() ?: false) is IrField -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() + is IrProperty -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() is IrClass -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() else -> false } diff --git a/js/js.translator/testData/box/crossModuleRef/topLevelProperty.kt b/js/js.translator/testData/box/crossModuleRef/topLevelProperty.kt index 964367c774f..85a6f165f7d 100644 --- a/js/js.translator/testData/box/crossModuleRef/topLevelProperty.kt +++ b/js/js.translator/testData/box/crossModuleRef/topLevelProperty.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1287 // MODULE: lib // FILE: lib.kt diff --git a/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt b/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt index bccf2528478..ff2219e548f 100644 --- a/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt +++ b/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1203 external interface Foo { diff --git a/js/js.translator/testData/box/jsModule/externalObject.kt b/js/js.translator/testData/box/jsModule/externalObject.kt index 60d8b658249..995c58b9ea9 100644 --- a/js/js.translator/testData/box/jsModule/externalObject.kt +++ b/js/js.translator/testData/box/jsModule/externalObject.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1285 // MODULE_KIND: AMD package foo