diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerDeclarationTranslator.java index c3f0c28df34..6c90a0c0545 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerDeclarationTranslator.java @@ -69,7 +69,7 @@ abstract class InnerDeclarationTranslator { return; } - List expressions = getCapturedValueParametersList(bind); + List expressions = bind.getArguments(); for (CallableDescriptor descriptor : closureContext.getDescriptors()) { JsName name; if (descriptor instanceof VariableDescriptor) { @@ -83,8 +83,4 @@ abstract class InnerDeclarationTranslator { expressions.add(name.makeRef()); } } - - protected List getCapturedValueParametersList(JsInvocation invocation) { - return invocation.getArguments(); - } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerFunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerFunctionTranslator.java index 97e1f1ee3a4..8aeee15761d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerFunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/InnerFunctionTranslator.java @@ -17,6 +17,7 @@ package org.jetbrains.k2js.translate.expression; import com.google.dart.compiler.backend.js.ast.*; +import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; @@ -56,10 +57,7 @@ class InnerFunctionTranslator extends InnerDeclarationTranslator { @Override protected JsInvocation createInvocation(@NotNull JsNameRef nameRef, @Nullable JsExpression self) { - JsInvocation bind = new JsInvocation(context.namer().kotlin(getBindMethodName())); - bind.getArguments().add(nameRef); - bind.getArguments().add(self); - return bind; + return new JsInvocation(new JsNameRef("bind", nameRef), new SmartList(self)); } @NotNull @@ -71,29 +69,4 @@ class InnerFunctionTranslator extends InnerDeclarationTranslator { return JsLiteral.NULL; } - - @NotNull - private String getBindMethodName() { - if (closureContext.getDescriptors().isEmpty()) { - return !hasArguments() ? "b3" : "b4"; - } - else { - return !hasArguments() ? (closureContext.getDescriptors().size() == 1 ? "b0" : "b1") : "b2"; - } - } - - private boolean hasArguments() { - return !getValueParameters().isEmpty() || descriptor.getReceiverParameter() != null; - } - - @Override - protected List getCapturedValueParametersList(JsInvocation invocation) { - if (closureContext.getDescriptors().size() > 1 || hasArguments()) { - JsArrayLiteral values = new JsArrayLiteral(); - invocation.getArguments().add(values); - return values.getExpressions(); - } - - return super.getCapturedValueParametersList(invocation); - } } diff --git a/js/js.translator/testFiles/kotlin_lib.js b/js/js.translator/testFiles/kotlin_lib.js index 19c8d1181d8..4f4db25f764 100644 --- a/js/js.translator/testFiles/kotlin_lib.js +++ b/js/js.translator/testFiles/kotlin_lib.js @@ -569,52 +569,9 @@ var kotlin = {set:function (receiver, key, value) { Kotlin.sure = function (obj) { return obj; }; - - // native concat doesn't work for arguments - Kotlin.concat = function (a, b) { - var r = new Array(a.length + b.length); - var i = 0; - var n = a.length; - for (; i < n; i++) { - r[i] = a[i]; - } - n = b.length; - for (var j = 0; j < n;) { - r[i++] = b[j++]; - } - return r; - } })(); Kotlin.assignOwner = function(f, o) { f.o = o; return f; }; - -// we cannot use Function.bind, because if we bind with null self, but call with not null — fun must receive passed not null self -// test case: WebDemoExamples2Test.testBuilder -Kotlin.b0 = function (f, self, value) { - return function () { - return f.call(self !== null ? self : this, value); - } -}; -Kotlin.b1 = function (f, self, values) { - return function () { - return f.apply(self !== null ? self : this, values); - } -}; -Kotlin.b2 = function (f, self, values) { - return function () { - return f.apply(self !== null ? self : this, Kotlin.concat(values, arguments)); - } -}; -Kotlin.b3 = function (f, self) { - return function () { - return f.call(self) - } -}; -Kotlin.b4 = function (f, self) { - return function () { - return f.apply(self, Kotlin.argumentsToArrayLike(arguments)); - } -}; diff --git a/js/js.translator/testFiles/kotlin_lib_ecma3.js b/js/js.translator/testFiles/kotlin_lib_ecma3.js index e9bda6386b8..995eedf4437 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma3.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma3.js @@ -48,15 +48,6 @@ var Kotlin = {}; return result; }; - Kotlin.argumentsToArrayLike = function (args) { - var n = args.length; - var result = new Array(n); - while (n--) { - result[n] = args[n]; - } - return result; - }; - function copyProperties(to, from) { for (var p in from) { if (from.hasOwnProperty(p)) { diff --git a/js/js.translator/testFiles/kotlin_lib_ecma5.js b/js/js.translator/testFiles/kotlin_lib_ecma5.js index ab57a7abd17..f4e5033fe26 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma5.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma5.js @@ -5,11 +5,6 @@ var Kotlin = Object.create(null); (function () { "use strict"; - // ecma5 is still sucks — concat doesn't accept arguments, but apply does, so, we just return arguments - Kotlin.argumentsToArrayLike = function (args) { - return args; - }; - Kotlin.keys = Object.keys; Kotlin.isType = function (object, type) {