JS backend: fix inheritance from native class & remove createConstructor() function from stdLib

This commit is contained in:
Erokhin Stanislav
2013-09-19 20:33:59 +04:00
parent 571bcf63dc
commit 9654bd9bc8
4 changed files with 43 additions and 25 deletions
@@ -45,6 +45,10 @@ public final class NativeInteropTest extends SingleFileTranslationTest {
fooBoxTest();
}
public void testInheritanceFromNativeClass() throws Exception {
checkFooBoxIsOk();
}
public void testClass() throws Exception {
fooBoxTest();
}
+12 -25
View File
@@ -110,7 +110,9 @@ var Kotlin = {};
return null;
}
var emptyFunction = function() {};
var emptyFunction = function() {
return function() {};
};
Kotlin.TYPE = {
CLASS: "class",
@@ -184,18 +186,10 @@ var Kotlin = {};
return this.$object$;
}
// as separated function to reduce scope // TODO: drop this
function createConstructor() {
return function $fun() {
var initializer = $fun.$metadata$.initializer;
if (initializer != null) {
initializer.apply(this, arguments);
}
};
}
Kotlin.createClass = function (bases, initializer, properties, staticProperties) {
var constructor = createConstructor();
Kotlin.createClass = function (bases, constructor, properties, staticProperties) {
if (constructor == null) {
constructor = emptyFunction();
}
copyProperties(constructor, staticProperties);
var metadata = computeMetadata(bases, properties);
@@ -210,15 +204,8 @@ var Kotlin = {};
Object.defineProperties(prototypeObj, metadata.properties);
copyProperties(prototypeObj, metadata.functions);
var baseInitializer;
if (metadata.baseClass !== null && !isNativeClass(metadata.baseClass)) {
baseInitializer = metadata.baseClass.$metadata$.initializer; // TODO: native superClass
}
if (!(initializer == null)) {
metadata.initializer = initializer;
metadata.initializer.baseInitializer = baseInitializer;
} else {
metadata.initializer = emptyFunction;
if (metadata.baseClass != null) {
constructor.baseInitializer = metadata.baseClass;
}
constructor.$metadata$ = metadata;
@@ -228,8 +215,8 @@ var Kotlin = {};
return constructor;
};
Kotlin.createObject = function (bases, initializer, functions) {
var noNameClass = Kotlin.createClass(bases, initializer, functions);
Kotlin.createObject = function (bases, constructor, functions) {
var noNameClass = Kotlin.createClass(bases, constructor, functions);
var obj = new noNameClass();
obj.$metadata$ = {
type: Kotlin.TYPE.OBJECT
@@ -303,7 +290,7 @@ var Kotlin = {};
var definition = createDefinition(members);
if (initializer === null) {
definition.$initializer$ = emptyFunction;
definition.$initializer$ = emptyFunction();
} else {
definition.$initializer$ = initializer;
}
@@ -0,0 +1,19 @@
package foo
native
open class A(b: Int) {
fun g(): Int = noImpl
fun m(): Int = noImpl
}
class B(val b: Int) : A(b / 2)
fun box(): String {
val b = B(10)
if (b !is A) return "b !is A"
if (b.g() != 10) return "b.g() != 10, it: ${b.g()}"
if (b.m() != 4) return "b.m() != 4, it: ${b.m()}"
return "OK"
}
@@ -0,0 +1,8 @@
function A(b) {
this.g = function() {
return 2 * b;
};
this.m = function() {
return b - 1;
}
}