diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index a3c11659849..0d70962a716 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -6191,6 +6191,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("objectFunWithVararg.kt") + public void testObjectFunWithVararg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/objectFunWithVararg.kt"); + doTest(fileName); + } + @TestMetadata("overrideNativeOverloadedFunction.kt") public void testOverrideNativeOverloadedFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/overrideNativeOverloadedFunction.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt index ff0a042213d..d2b2de76765 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.js.translate.utils.TranslationUtils import org.jetbrains.kotlin.js.translate.utils.getReferenceToJsClass import org.jetbrains.kotlin.psi.Call import org.jetbrains.kotlin.psi.ValueArgument +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument @@ -150,6 +151,11 @@ class CallArgumentTranslator private constructor( cachedReceiver = context().getOrDeclareTemporaryConstVariable(receiver) result.add(0, cachedReceiver.reference()) } + else if (DescriptorUtils.isObject(resolvedCall.resultingDescriptor.containingDeclaration)) { + cachedReceiver = context().getOrDeclareTemporaryConstVariable( + ReferenceTranslator.translateAsValueReference(resolvedCall.resultingDescriptor.containingDeclaration, context())) + result.add(0, cachedReceiver.reference()) + } else { result.add(0, JsNullLiteral()) } diff --git a/js/js.translator/testData/box/native/objectFunWithVararg.js b/js/js.translator/testData/box/native/objectFunWithVararg.js new file mode 100644 index 00000000000..94e0f92f0d6 --- /dev/null +++ b/js/js.translator/testData/box/native/objectFunWithVararg.js @@ -0,0 +1,9 @@ +Test = { + test: function() { + var sum = 0; + for (var i = 0; i < arguments.length; ++i) { + sum += arguments[i]; + } + return sum; + } +}; \ No newline at end of file diff --git a/js/js.translator/testData/box/native/objectFunWithVararg.kt b/js/js.translator/testData/box/native/objectFunWithVararg.kt new file mode 100644 index 00000000000..c361820ca0d --- /dev/null +++ b/js/js.translator/testData/box/native/objectFunWithVararg.kt @@ -0,0 +1,13 @@ +// EXPECTED_REACHABLE_NODES: 995 +import Test.test + +external object Test { + fun test(vararg rest: Int): Int +} + +fun box(): String { + val result = test(23, 42) + if (result != 65) return "fail: $result" + + return "OK" +} \ No newline at end of file