JS backend: fixed trait inheritance implementation in ES3.
Now each traits in same hierarchy represent separate object, instead a single object.
This commit is contained in:
@@ -62,4 +62,8 @@ public final class TraitTest extends SingleFileTranslationTest {
|
|||||||
public void testDefinitionOrder() throws Exception {
|
public void testDefinitionOrder() throws Exception {
|
||||||
fooBoxTest();
|
fooBoxTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCheckImplementationCharacteristics() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,15 +80,14 @@ var Kotlin = {};
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
Kotlin.createTrait = (function () {
|
Kotlin.createTrait = function () {
|
||||||
return function () {
|
var n = arguments.length - 1;
|
||||||
var result = arguments[0];
|
var result = arguments[n] || {};
|
||||||
for (var i = 1, n = arguments.length; i < n; i++) {
|
for (var i = 0; i < n; i++) {
|
||||||
copyProperties(result, arguments[i]);
|
copyProperties(result, arguments[i]);
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
})();
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
Kotlin.definePackage = function (members) {
|
Kotlin.definePackage = function (members) {
|
||||||
return members === null ? {} : members;
|
return members === null ? {} : members;
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
trait A {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
|
trait B : A {
|
||||||
|
fun boo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
native fun eval(code: String): Any = noImpl
|
||||||
|
native val undefined: Any = noImpl
|
||||||
|
native class Function(vararg args: String)
|
||||||
|
|
||||||
|
val hasProp = Function("obj, prop", "return obj[prop] !== undefined") as ((Any, String)->Boolean)
|
||||||
|
val PREFIX = "Kotlin.modules.JS_TESTS.foo"
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val a = object: A {}
|
||||||
|
val b = object: B {}
|
||||||
|
|
||||||
|
if (!hasProp(a, "foo")) return "A hasn't foo"
|
||||||
|
if (hasProp(a, "boo")) return "A has boo"
|
||||||
|
|
||||||
|
if (!hasProp(b, "foo")) return "B hasn't foo"
|
||||||
|
if (!hasProp(b, "boo")) return "B hasn't boo"
|
||||||
|
|
||||||
|
if (eval("$PREFIX.A === $PREFIX.B") as Boolean) return "A and B refer to the same object"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user