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();
|
fooBoxTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInheritanceFromNativeClass() throws Exception {
|
||||||
|
checkFooBoxIsOk();
|
||||||
|
}
|
||||||
|
|
||||||
public void testClass() throws Exception {
|
public void testClass() throws Exception {
|
||||||
fooBoxTest();
|
fooBoxTest();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user