From 74d181246142bbe1a7607a502cf8c81692641fe5 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 14 May 2021 13:27:08 +0300 Subject: [PATCH] [JS IR] Review remarks - Move origin to common place - Add comments and todo about solution - Remove MODULE directive from tests - Add test with in-place using of js function --- .../org/jetbrains/kotlin/ir/backend/js/Dce.kt | 12 +++++- .../ir/backend/js/DeclarationOrigins.kt | 1 + .../js/lower/ClassReferenceLowering.kt | 7 +--- .../semantics/IrBoxJsES6TestGenerated.java | 5 +++ .../ir/semantics/IrBoxJsTestGenerated.java | 5 +++ .../js/test/semantics/BoxJsTestGenerated.java | 5 +++ .../box/reflection/kClassReifiedWithJsCall.kt | 1 - .../box/reflection/kClassWithJsCall.kt | 1 - .../box/reflection/kJsClassWithJsCall.kt | 38 +++++++++++++++++++ .../box/reflection/kTypeWithJsCall.kt | 1 - 10 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt index 146effd3f83..591b559d809 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt @@ -386,11 +386,19 @@ fun usefulDeclarations(roots: Iterable, context: JsIrBackendConte val ref = expression.getTypeArgument(0)!!.classifierOrFail.owner as IrDeclaration ref.enqueue("intrinsic: jsClass") referencedJsClasses += ref - if (expression.origin == ClassReferenceLowering.Companion.CLASS_REFERENCE) { + // When class reference provided as parameter to external function + // It can be instantiated by external JS script + // Need to leave constructor for this + // https://youtrack.jetbrains.com/issue/KT-46672 + // TODO: Possibly solution with origin is not so good + // There is option with applying this hack to jsGetKClass + if (expression.origin == JsLoweredDeclarationOrigin.CLASS_REFERENCE) { + // Maybe we need to filter primary constructor + // Although at this time, we should have only primary constructor (ref as IrClass) .constructors .forEach { - it.enqueue("intrinsic: jsClass constructor") + it.enqueue("intrinsic: jsClass (constructor)") } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/DeclarationOrigins.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/DeclarationOrigins.kt index f15d2d938a5..2f25ae96ec0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/DeclarationOrigins.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/DeclarationOrigins.kt @@ -17,4 +17,5 @@ object JsLoweredDeclarationOrigin : IrDeclarationOrigin { object BRIDGE_WITHOUT_STABLE_NAME : IrDeclarationOriginImpl("BRIDGE_WITHOUT_STABLE_NAME") object OBJECT_GET_INSTANCE_FUNCTION : IrDeclarationOriginImpl("OBJECT_GET_INSTANCE_FUNCTION") object JS_SHADOWED_EXPORT : IrDeclarationOriginImpl("JS_SHADOWED_EXPORT") + object CLASS_REFERENCE : IrStatementOriginImpl("CLASS_REFERENCE") } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt index 3b720ab6085..176bb02796e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext +import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.utils.toJsArrayLiteral import org.jetbrains.kotlin.ir.declarations.* @@ -130,7 +131,7 @@ class ClassReferenceLowering(val context: JsIrBackendContext) : BodyLoweringPass JsIrBuilder.buildCall( intrinsics.jsClass, typeArguments = listOf(type), - origin = CLASS_REFERENCE + origin = JsLoweredDeclarationOrigin.CLASS_REFERENCE ) private fun buildCall(name: IrSimpleFunctionSymbol, vararg args: IrExpression): IrExpression = @@ -256,9 +257,5 @@ class ClassReferenceLowering(val context: JsIrBackendContext) : BodyLoweringPass } }) } - - companion object { - object CLASS_REFERENCE : IrStatementOriginImpl("CLASS_REFERENCE") - } } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index 6b4ee285d6d..a3397bf0e84 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -7136,6 +7136,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/reflection/kClassWithJsCall.kt"); } + @TestMetadata("kJsClassWithJsCall.kt") + public void testKJsClassWithJsCall() throws Exception { + runTest("js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt"); + } + @TestMetadata("kTypeWithJsCall.kt") public void testKTypeWithJsCall() throws Exception { runTest("js/js.translator/testData/box/reflection/kTypeWithJsCall.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 721ff39fc6d..7f91d62c8cf 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -7136,6 +7136,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/reflection/kClassWithJsCall.kt"); } + @TestMetadata("kJsClassWithJsCall.kt") + public void testKJsClassWithJsCall() throws Exception { + runTest("js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt"); + } + @TestMetadata("kTypeWithJsCall.kt") public void testKTypeWithJsCall() throws Exception { runTest("js/js.translator/testData/box/reflection/kTypeWithJsCall.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 70e6d8f4007..da9acbd0cdf 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -7161,6 +7161,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/reflection/kClassWithJsCall.kt"); } + @TestMetadata("kJsClassWithJsCall.kt") + public void testKJsClassWithJsCall() throws Exception { + runTest("js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt"); + } + @TestMetadata("kTypeWithJsCall.kt") public void testKTypeWithJsCall() throws Exception { runTest("js/js.translator/testData/box/reflection/kTypeWithJsCall.kt"); diff --git a/js/js.translator/testData/box/reflection/kClassReifiedWithJsCall.kt b/js/js.translator/testData/box/reflection/kClassReifiedWithJsCall.kt index c0e6becc4de..20db130ba88 100644 --- a/js/js.translator/testData/box/reflection/kClassReifiedWithJsCall.kt +++ b/js/js.translator/testData/box/reflection/kClassReifiedWithJsCall.kt @@ -1,6 +1,5 @@ import kotlin.reflect.KClass -// MODULE: main // FILE: main.kt external abstract open class A( o: String diff --git a/js/js.translator/testData/box/reflection/kClassWithJsCall.kt b/js/js.translator/testData/box/reflection/kClassWithJsCall.kt index 51c2a16b234..aa055dceaa5 100644 --- a/js/js.translator/testData/box/reflection/kClassWithJsCall.kt +++ b/js/js.translator/testData/box/reflection/kClassWithJsCall.kt @@ -1,6 +1,5 @@ import kotlin.reflect.KClass -// MODULE: main // FILE: main.kt external abstract open class A( o: String diff --git a/js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt b/js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt new file mode 100644 index 00000000000..d51da2e25ca --- /dev/null +++ b/js/js.translator/testData/box/reflection/kJsClassWithJsCall.kt @@ -0,0 +1,38 @@ +import kotlin.reflect.KClass + +// FILE: main.kt +external abstract open class A( + o: String +) { + abstract val k: String + + fun test(): String +} + +class B( + o: String +) : A(o) { + override val k = "K" +} + +external fun test( + klazz: Any +) : B + +fun box(): String { + return test(B::class.js).test() +} + +// FILE: test.js + +function test(classType) { + return new classType("O") +} + +function A(o) { + this.o = o +} + +A.prototype.test = function() { + return this.o + this.k +} \ No newline at end of file diff --git a/js/js.translator/testData/box/reflection/kTypeWithJsCall.kt b/js/js.translator/testData/box/reflection/kTypeWithJsCall.kt index 00ed8052800..b149d6a08df 100644 --- a/js/js.translator/testData/box/reflection/kTypeWithJsCall.kt +++ b/js/js.translator/testData/box/reflection/kTypeWithJsCall.kt @@ -4,7 +4,6 @@ import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.reflect.typeOf -// MODULE: main // FILE: main.kt external abstract open class A( o: String