JS: fix explicit cross-module SAM constructor calls

This commit is contained in:
Anton Bannykh
2020-06-05 11:52:13 +03:00
parent 489290263f
commit bd2a0563ad
3 changed files with 22 additions and 4 deletions
@@ -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()
+17 -1
View File
@@ -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" }
}
@@ -197,12 +197,14 @@ object ConstructorCallCase : FunctionCallCase() {
private inline fun FunctionCallInfo.doTranslate(
getArguments: CallArgumentTranslator.ArgumentsInfo.() -> List<JsExpression>
): 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<JsExpression>()
val constructorDescriptor = callableDescriptor as ClassConstructorDescriptor