diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java index d9657d1e6e6..a9b664306cb 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NativeInteropTest.java @@ -45,6 +45,10 @@ public final class NativeInteropTest extends SingleFileTranslationTest { fooBoxTest(); } + public void testInheritanceFromNativeClass() throws Exception { + checkFooBoxIsOk(); + } + public void testClass() throws Exception { fooBoxTest(); } diff --git a/js/js.translator/testFiles/kotlin_lib_ecma5.js b/js/js.translator/testFiles/kotlin_lib_ecma5.js index 71308dc1377..ebc78e4908f 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma5.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma5.js @@ -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; } diff --git a/js/js.translator/testFiles/native/cases/inheritanceFromNativeClass.kt b/js/js.translator/testFiles/native/cases/inheritanceFromNativeClass.kt new file mode 100644 index 00000000000..42c203610ee --- /dev/null +++ b/js/js.translator/testFiles/native/cases/inheritanceFromNativeClass.kt @@ -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" +} \ No newline at end of file diff --git a/js/js.translator/testFiles/native/native/inheritanceFromNativeClass.js b/js/js.translator/testFiles/native/native/inheritanceFromNativeClass.js new file mode 100644 index 00000000000..c8c3052a34e --- /dev/null +++ b/js/js.translator/testFiles/native/native/inheritanceFromNativeClass.js @@ -0,0 +1,8 @@ +function A(b) { + this.g = function() { + return 2 * b; + }; + this.m = function() { + return b - 1; + } +} \ No newline at end of file