JS backend: fix is for trait. #KT-3519 fixed
This commit is contained in:
@@ -28,6 +28,14 @@ public class RTTITest extends SingleFileTranslationTest {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
|
||||
public void testRttiForTrait() throws Exception {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
|
||||
public void testRttiForTrait2() throws Exception {
|
||||
checkFooBoxIsOk();
|
||||
}
|
||||
|
||||
public void testIsSameClass() throws Exception {
|
||||
fooBoxTest();
|
||||
}
|
||||
|
||||
@@ -202,6 +202,7 @@ var Kotlin = {};
|
||||
}
|
||||
Object.defineProperties(prototypeObj, metadata.properties);
|
||||
copyProperties(prototypeObj, metadata.functions);
|
||||
prototypeObj.constructor = constructor;
|
||||
|
||||
if (metadata.baseClass != null) {
|
||||
constructor.baseInitializer = metadata.baseClass;
|
||||
@@ -231,11 +232,38 @@ var Kotlin = {};
|
||||
return obj;
|
||||
};
|
||||
|
||||
function isInheritanceFromTrait (objConstructor, trait) {
|
||||
if (isNativeClass(objConstructor) || objConstructor.$metadata$.classIndex < trait.$metadata$.classIndex) {
|
||||
return false;
|
||||
}
|
||||
var baseClasses = objConstructor.$metadata$.baseClasses;
|
||||
var i;
|
||||
for (i = 0; i < baseClasses.length; i++) {
|
||||
if (baseClasses[i] === trait) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < baseClasses.length; i++) {
|
||||
if (isInheritanceFromTrait(baseClasses[i], trait)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Kotlin.isType = function (object, klass) {
|
||||
if (object == null || klass == null) {
|
||||
return false;
|
||||
} else {
|
||||
return object instanceof klass; // TODO trait support
|
||||
if (object instanceof klass) {
|
||||
return true;
|
||||
}
|
||||
else if (isNativeClass(klass) || klass.$metadata$.type == Kotlin.TYPE.CLASS) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return isInheritanceFromTrait(object.constructor, klass);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package foo
|
||||
|
||||
|
||||
open class A
|
||||
|
||||
trait B
|
||||
|
||||
class C: A(), B
|
||||
|
||||
fun box(): String {
|
||||
|
||||
val a = A()
|
||||
val b = object : B {}
|
||||
val c = C()
|
||||
|
||||
if (a is B) return "a is B"
|
||||
if (b !is B) return "b !is B"
|
||||
if (c !is B) return "c !is B"
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package foo
|
||||
|
||||
trait A
|
||||
trait B : A
|
||||
trait C : A
|
||||
trait D : B, C
|
||||
trait E : C
|
||||
|
||||
open class CB: B
|
||||
class CB2: CB()
|
||||
|
||||
class CD: D
|
||||
|
||||
fun testPhrase(o: Any): String {
|
||||
var s = ""
|
||||
s += if(o is A) "Y" else "N"
|
||||
s += if(o is B) "Y" else "N"
|
||||
s += if(o is C) "Y" else "N"
|
||||
s += if(o is D) "Y" else "N"
|
||||
s += if(o is E) "Y" else "N"
|
||||
return s
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val b = CB()
|
||||
val b2 = CB2()
|
||||
val d = CD()
|
||||
val e = object : E {}
|
||||
|
||||
if (testPhrase(b) != "YYNNN") return "bad b, it: ${testPhrase(b)}"
|
||||
if (testPhrase(b2) != "YYNNN") return "bad b2, it: ${testPhrase(b2)}"
|
||||
if (testPhrase(d) != "YYYYN") return "bad d, it: ${testPhrase(d)}"
|
||||
if (testPhrase(e) != "YNYNY") return "bad e, it: ${testPhrase(e)}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user