diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index 5715631d03c..32cb2b66979 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -35,7 +35,6 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.PrimitiveType; import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInFunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; @@ -119,7 +118,7 @@ public final class TopLevelFIF extends CompositeFIF { public static final FunctionIntrinsicFactory INSTANCE = new TopLevelFIF(); private TopLevelFIF() { - add(pattern("jet", "toString").receiverExists(true), new BuiltInFunctionIntrinsic("toString")); + add(pattern("jet", "toString").receiverExists(true), new KotlinFunctionIntrinsic("toString")); add(pattern("jet", "equals").receiverExists(true), EQUALS); add(pattern(NamePredicate.PRIMITIVE_NUMBERS, "equals"), EQUALS); add(pattern("String|Boolean|Char|Number.equals"), EQUALS); diff --git a/js/js.translator/testFiles/kotlin_lib.js b/js/js.translator/testFiles/kotlin_lib.js index 2244398b899..25effe55ea0 100644 --- a/js/js.translator/testFiles/kotlin_lib.js +++ b/js/js.translator/testFiles/kotlin_lib.js @@ -35,16 +35,8 @@ String.prototype.contains = function (s) { return obj2 == null; } - if (obj1 instanceof Array) { - if (!(obj2 instanceof Array) || obj1.length != obj2.length) { - return false; - } - for (var i = 0; i < obj1.length; i++) { - if (!Kotlin.equals(obj1[i], obj2[i])) { - return false; - } - } - return true; + if (Array.isArray(obj1)) { + return Kotlin.arrayEquals(obj1, obj2); } if (typeof obj1 == "object" && obj1.equals !== undefined) { @@ -53,6 +45,22 @@ String.prototype.contains = function (s) { return obj1 === obj2; }; + + Kotlin.toString = function (o) { + if (o == null) { + return "null"; + } + else if (Array.isArray(o)) { + return Kotlin.arrayToString(o); + } + else { + return o.toString(); + } + }; + + Kotlin.arrayToString = function(a) { + return "[" + a.join(", ") + "]"; + }; Kotlin.intUpto = function (from, to) { return Kotlin.$new(Kotlin.NumberRange)(from, to); @@ -298,6 +306,22 @@ String.prototype.contains = function (s) { return isNaN(r) ? null : r; }; + Kotlin.arrayEquals = function (a, b) { + if (a === b) { + return true; + } + if (!Array.isArray(b) || a.length !== b.length) { + return false; + } + + for (var i = 0, n = a.length; i < n; i++) { + if (!Kotlin.equals(a[i], b[i])) { + return false; + } + } + return true; + }; + Kotlin.System = function () { var output = ""; @@ -427,12 +451,12 @@ String.prototype.contains = function (s) { return Kotlin.$new(ComparatorImpl)(f); }; - Kotlin.collectionsMax = function (col, comp) { - var it = col.iterator(); - if (col.isEmpty()) { + Kotlin.collectionsMax = function (c, comp) { + if (c.isEmpty()) { //TODO: which exception? - throw Kotlin.Exception(); + throw new Error(); } + var it = c.iterator(); var max = it.next(); while (it.hasNext()) { var el = it.next(); diff --git a/js/js.translator/testFiles/kotlin_lib_ecma3.js b/js/js.translator/testFiles/kotlin_lib_ecma3.js index 995eedf4437..82e9fc59484 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma3.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma3.js @@ -12,6 +12,12 @@ var Kotlin = {}; var emptyFunction = function () { }; + if (!Array.isArray) { + Array.isArray = function (vArg) { + return Object.prototype.toString.call(vArg) === "[object Array]"; + }; + } + if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") {