diff --git a/jslib/src/core/javautil.kt b/jslib/src/core/javautil.kt index 2acaad22beb..4e9a1a3428a 100644 --- a/jslib/src/core/javautil.kt +++ b/jslib/src/core/javautil.kt @@ -2,16 +2,13 @@ package java.util import js.annotations.*; -//LibraryClass -//public trait Comparator { -// fun compare(obj1 : T, obj2 : T) : Int; -//} -// -//LibraryFun("comparator") -//public fun comparator(f : (T, T) -> Int) : Comparator {} -// -//LibraryFun("max") -//public fun max(col : Collection, comp : Comparator) {} +LibraryClass +public trait Comparator { + fun compare(obj1 : T, obj2 : T) : Int; +} + +LibraryFun("comparator") +public fun comparator(f : (T, T) -> Int) : Comparator {} LibraryClass diff --git a/jslib/src/core/javautilcollections.kt b/jslib/src/core/javautilcollections.kt new file mode 100644 index 00000000000..22e5d282453 --- /dev/null +++ b/jslib/src/core/javautilcollections.kt @@ -0,0 +1,8 @@ +package java.util.Collections; + +import js.annotations.LibraryFun +import java.util.Collection +import java.util.Comparator + +LibraryFun("collectionsMax") +public fun max(col : Collection, comp : Comparator) {} \ No newline at end of file diff --git a/translator/src/org/jetbrains/k2js/config/Config.java b/translator/src/org/jetbrains/k2js/config/Config.java index 8234d17b646..3741f587396 100644 --- a/translator/src/org/jetbrains/k2js/config/Config.java +++ b/translator/src/org/jetbrains/k2js/config/Config.java @@ -31,7 +31,8 @@ public abstract class Config { PATH_TO_JS_LIB_SRC + "\\core\\core.kt", PATH_TO_JS_LIB_SRC + "\\raphael\\raphael.kt", PATH_TO_JS_LIB_SRC + "\\core\\json.kt", - PATH_TO_JS_LIB_SRC + "\\html5\\core.kt" + PATH_TO_JS_LIB_SRC + "\\html5\\core.kt", + PATH_TO_JS_LIB_SRC + "\\core\\javautilcollections.kt" ); diff --git a/translator/test/org/jetbrains/k2js/test/ExtensionPropertyTest.java b/translator/test/org/jetbrains/k2js/test/ExtensionPropertyTest.java index 510a1830f63..f6b0490f74b 100644 --- a/translator/test/org/jetbrains/k2js/test/ExtensionPropertyTest.java +++ b/translator/test/org/jetbrains/k2js/test/ExtensionPropertyTest.java @@ -18,9 +18,13 @@ public final class ExtensionPropertyTest extends TranslationTest { testFooBoxIsTrue("simplePropertyWithGetter.kt"); } - @Test public void propertyWithGetterAndSetter() throws Exception { testFooBoxIsTrue("propertyWithGetterAndSetter.kt"); } + + @Test + public void absExtension() throws Exception { + testFooBoxIsTrue("absExtension.kt"); + } } diff --git a/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java b/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java index c4b46d4dce3..cc14a7f1229 100644 --- a/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java +++ b/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java @@ -32,7 +32,7 @@ public final class WebDemoExamples2Test extends TranslationTest { testWithMain("builder", "1", "over9000"); } - //TODO: comparator dependencies + //TODO: comparator LinkedList dependencies // @Test // public void maze() throws Exception { // testWithMain("maze", ""); diff --git a/translator/testFiles/extensionProperty/cases/absExtension.kt b/translator/testFiles/extensionProperty/cases/absExtension.kt new file mode 100644 index 00000000000..d0399758498 --- /dev/null +++ b/translator/testFiles/extensionProperty/cases/absExtension.kt @@ -0,0 +1,11 @@ +package foo; + +val Double.abs : Double + get() = if (this > 0) this else -this + +fun box() : Boolean { + if (4.0.abs != 4.0) return false; + if ((-5.2).abs != 5.2) return false; + + return true; +} diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js index ba7106ec77d..52cbb4d5d40 100644 --- a/translator/testFiles/kotlin_lib.js +++ b/translator/testFiles/kotlin_lib.js @@ -109,16 +109,15 @@ current = current.superclass; } return true; - } + }; var emptyFunction = function () { - } + }; var Class = (function () { function subclass() { } - ; function create() { var parent = null, properties = $A(arguments); @@ -203,7 +202,7 @@ var Trait = (function () { function add(object, source) { - properties = Object.keys(source); + var properties = Object.keys(source); for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i]; var value = source[property]; @@ -238,7 +237,17 @@ }; })(); - Kotlin = {} + var object = (function () { + function create() { + var singletonClass = Class.create.apply(Class, arguments); + return new singletonClass; + } + return { + create:create + }; + })(); + + Kotlin = {}; Kotlin.Class = Class; Kotlin.Namespace = Namespace; Kotlin.Trait = Trait; @@ -315,9 +324,9 @@ Kotlin.parseInt = - function (str) { - return parseInt(str); - } + function (str) { + return parseInt(str); + } ; Kotlin.System = function () { @@ -454,14 +463,26 @@ { initialize:function () { }, - compare:function () { + compare:function (el1, el2) { throw new Kotlin.AbstractFunctionInvokationError(); } } ); - Kotlin.collectionsMax = function(col, comp) { - + Kotlin.collectionsMax = function (col, comp) { + var it = col.iterator(); + if (col.isEmpty()) { + //TODO: which exception? + throw Kotlin.Exception(); + } + var max = it.next(); + while (it.hasNext()) { + var el = it.next(); + if (comp.compare(max, el) < 0) { + max = el; + } + } + return max; }; Kotlin.StringBuilder = Kotlin.Class.create( diff --git a/translator/testFiles/webDemoExamples2/cases/maze.kt b/translator/testFiles/webDemoExamples2/cases/maze.kt index f6dbb9eed3e..f599ea9f829 100644 --- a/translator/testFiles/webDemoExamples2/cases/maze.kt +++ b/translator/testFiles/webDemoExamples2/cases/maze.kt @@ -31,10 +31,10 @@ import java.util.* fun findPath(maze : Maze) : List<#(Int, Int)>? { val previous = HashMap<#(Int, Int), #(Int, Int)> - val queue = LinkedList<#(Int, Int)> + val queue = ArrayList<#(Int, Int)> val visited = HashSet<#(Int, Int)> - queue.offer(maze.start) + queue.add(maze.start) visited.add(maze.start) while (!queue.isEmpty()) { val cell = queue.poll()