JS backend: fix inheritance from native class & remove createConstructor() function from stdLib
This commit is contained in:
@@ -45,6 +45,10 @@ public final class NativeInteropTest extends SingleFileTranslationTest {
|
||||
fooBoxTest();
|
||||
}
|
||||
|
||||
public void testInheritanceFromNativeClass() throws Exception {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
|
||||
public void testClass() throws Exception {
|
||||
fooBoxTest();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user