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(); fooBoxTest();
} }
public void testInheritanceFromNativeClass() throws Exception {
checkFooBoxIsOk();
}
public void testClass() throws Exception { public void testClass() throws Exception {
fooBoxTest(); fooBoxTest();
} }
+12 -25
View File
@@ -110,7 +110,9 @@ var Kotlin = {};
return null; return null;
} }
var emptyFunction = function() {}; var emptyFunction = function() {
return function() {};
};
Kotlin.TYPE = { Kotlin.TYPE = {
CLASS: "class", CLASS: "class",
@@ -184,18 +186,10 @@ var Kotlin = {};
return this.$object$; return this.$object$;
} }
// as separated function to reduce scope // TODO: drop this Kotlin.createClass = function (bases, constructor, properties, staticProperties) {
function createConstructor() { if (constructor == null) {
return function $fun() { constructor = emptyFunction();
var initializer = $fun.$metadata$.initializer; }
if (initializer != null) {
initializer.apply(this, arguments);
}
};
}
Kotlin.createClass = function (bases, initializer, properties, staticProperties) {
var constructor = createConstructor();
copyProperties(constructor, staticProperties); copyProperties(constructor, staticProperties);
var metadata = computeMetadata(bases, properties); var metadata = computeMetadata(bases, properties);
@@ -210,15 +204,8 @@ var Kotlin = {};
Object.defineProperties(prototypeObj, metadata.properties); Object.defineProperties(prototypeObj, metadata.properties);
copyProperties(prototypeObj, metadata.functions); copyProperties(prototypeObj, metadata.functions);
var baseInitializer; if (metadata.baseClass != null) {
if (metadata.baseClass !== null && !isNativeClass(metadata.baseClass)) { constructor.baseInitializer = metadata.baseClass;
baseInitializer = metadata.baseClass.$metadata$.initializer; // TODO: native superClass
}
if (!(initializer == null)) {
metadata.initializer = initializer;
metadata.initializer.baseInitializer = baseInitializer;
} else {
metadata.initializer = emptyFunction;
} }
constructor.$metadata$ = metadata; constructor.$metadata$ = metadata;
@@ -228,8 +215,8 @@ var Kotlin = {};
return constructor; return constructor;
}; };
Kotlin.createObject = function (bases, initializer, functions) { Kotlin.createObject = function (bases, constructor, functions) {
var noNameClass = Kotlin.createClass(bases, initializer, functions); var noNameClass = Kotlin.createClass(bases, constructor, functions);
var obj = new noNameClass(); var obj = new noNameClass();
obj.$metadata$ = { obj.$metadata$ = {
type: Kotlin.TYPE.OBJECT type: Kotlin.TYPE.OBJECT
@@ -303,7 +290,7 @@ var Kotlin = {};
var definition = createDefinition(members); var definition = createDefinition(members);
if (initializer === null) { if (initializer === null) {
definition.$initializer$ = emptyFunction; definition.$initializer$ = emptyFunction();
} else { } else {
definition.$initializer$ = initializer; 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;
}
}