From bd2a0563add91211fc495abae31aa4aa4dbf7ecb Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Fri, 5 Jun 2020 11:52:13 +0300 Subject: [PATCH] JS: fix explicit cross-module SAM constructor calls --- .../box/funInterface/funConversionInVararg.kt | 2 +- .../codegen/box/funInterface/multimodule.kt | 18 +++++++++++++++++- .../callTranslator/FunctionCallCases.kt | 6 ++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/compiler/testData/codegen/box/funInterface/funConversionInVararg.kt b/compiler/testData/codegen/box/funInterface/funConversionInVararg.kt index 6ca40b386a8..034ba4e0093 100644 --- a/compiler/testData/codegen/box/funInterface/funConversionInVararg.kt +++ b/compiler/testData/codegen/box/funInterface/funConversionInVararg.kt @@ -1,6 +1,6 @@ // !LANGUAGE: +NewInference +FunctionalInterfaceConversion +SamConversionPerArgument -// IGNORE_BACKEND: JS_IR // IGNORE_BACKEND_FIR: JVM_IR +// SKIP_DCE_DRIVEN fun interface MyRunnable { fun run() diff --git a/compiler/testData/codegen/box/funInterface/multimodule.kt b/compiler/testData/codegen/box/funInterface/multimodule.kt index 562140724fe..c1eef7d5aac 100644 --- a/compiler/testData/codegen/box/funInterface/multimodule.kt +++ b/compiler/testData/codegen/box/funInterface/multimodule.kt @@ -12,6 +12,8 @@ fun rn(i: I) = i.f() inline fun rnInline(i: I) = i.f() +inline fun rnInlineCtor(s: String) = I { s + ".m1" } + // MODULE: m2(m1) // FILE: m2.kt @@ -19,12 +21,26 @@ fun rn2(f: () -> String) = rn(f) inline fun rn2Inline(noinline f: () -> String) = rnInline(f) +inline fun rnInlineCtorProxy(s: String) = rnInlineCtor(s + ".m2").f() + +fun interface II { + fun f(): String +} + // MODULE: main(m2) // FILE: main.kt +fun id(i: II) = i + fun box(): String { - if (rn2Inline { "inline" } != "inline") return "fail" + if (id { "1" }.f() != "1") return "fail 1" + + if (II { "2" }.f() != "2") return "fail 2" + + if (rnInlineCtorProxy("3") != "3.m2.m1") return "fail 3" + + if (rn2Inline { "inline" } != "inline") return "fail 4" return rn2 { "OK" } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt index bbe5b2b5d8d..0a95f34ca03 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt @@ -197,12 +197,14 @@ object ConstructorCallCase : FunctionCallCase() { private inline fun FunctionCallInfo.doTranslate( getArguments: CallArgumentTranslator.ArgumentsInfo.() -> List ): JsExpression { - val functionRef = ReferenceTranslator.translateAsValueReference(callableDescriptor, context) - if (callableDescriptor is SamConstructorDescriptor) { + (callableDescriptor as? SamConstructorDescriptor)?.baseDescriptorForSynthetic?.let { funInterface -> + val functionRef = ReferenceTranslator.translateAsTypeReference(funInterface, context) return JsNew(functionRef, argumentsInfo.getArguments()) } + val functionRef = ReferenceTranslator.translateAsValueReference(callableDescriptor, context) + val invocationArguments = mutableListOf() val constructorDescriptor = callableDescriptor as ClassConstructorDescriptor