JS: fix runtime type checking for native non-fake interfaces on WebKit (JavaScriptCore); add tests for object and object expressions.
This commit is contained in:
@@ -53,6 +53,12 @@ public class RttiTestGenerated extends AbstractRttiTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("isObject.kt")
|
||||||
|
public void testIsObject() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/isObject.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("isSameClass.kt")
|
@TestMetadata("isSameClass.kt")
|
||||||
public void testIsSameClass() throws Exception {
|
public void testIsSameClass() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/isSameClass.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/isSameClass.kt");
|
||||||
@@ -65,6 +71,18 @@ public class RttiTestGenerated extends AbstractRttiTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("objectExpression.kt")
|
||||||
|
public void testObjectExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/objectExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("onNativeObject.kt")
|
||||||
|
public void testOnNativeObject() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/onNativeObject.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("rttiForClass.kt")
|
@TestMetadata("rttiForClass.kt")
|
||||||
public void testRttiForClass() throws Exception {
|
public void testRttiForClass() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/rttiForClass.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/rtti/cases/rttiForClass.kt");
|
||||||
|
|||||||
+14
-11
@@ -376,18 +376,21 @@
|
|||||||
if (object == null || klass == null || (typeof object !== 'object' && typeof object !== 'function')) {
|
if (object == null || klass == null || (typeof object !== 'object' && typeof object !== 'function')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (typeof klass === "function" && object instanceof klass) {
|
if (typeof klass === "function") {
|
||||||
return true;
|
return object instanceof klass;
|
||||||
}
|
|
||||||
else if (isNativeClass(klass) || klass.$metadata$.type == Kotlin.TYPE.CLASS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var metadata = "$metadata$" in object ? object.$metadata$ : object.constructor.$metadata$;
|
|
||||||
return isInheritanceFromTrait(metadata, klass);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
|
||||||
|
if (isNativeClass(klass)) {
|
||||||
|
return object instanceof klass;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object.constructor != null) {
|
||||||
|
return isInheritanceFromTrait(object.constructor.$metadata$, klass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO Store callable references for members in class
|
// TODO Store callable references for members in class
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
object Obj
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val r: Any = Obj
|
||||||
|
|
||||||
|
// TODO: fix KT-13465
|
||||||
|
// if (r !is Obj) return "r !is Obj"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
interface A
|
||||||
|
interface B
|
||||||
|
open class C
|
||||||
|
open class D
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
|
||||||
|
if ((object {} as Any) is A) return "object {} is A"
|
||||||
|
if ((object {} as Any) is C) return "object {} is C"
|
||||||
|
|
||||||
|
if ((object : A {} as Any) !is A) return "object : A {} !is A"
|
||||||
|
if ((object : A {} as Any) is B) return "object : A {} is B"
|
||||||
|
if ((object : A {} as Any) is C) return "object : A {} is C"
|
||||||
|
|
||||||
|
if ((object : C() {} as Any) is A) return "object : C() {} is A"
|
||||||
|
if ((object : C() {} as Any) !is C) return "object : C() {} !is C"
|
||||||
|
if ((object : C() {} as Any) is D) return "object : C() {} is D"
|
||||||
|
|
||||||
|
if ((object : B, D() {} as Any) is A) return "object : B, D() {} is A"
|
||||||
|
if ((object : B, D() {} as Any) !is B) return "object : B, D() {} !is B"
|
||||||
|
if ((object : B, D() {} as Any) is C) return "object : B, D() {} is C"
|
||||||
|
if ((object : B, D() {} as Any) !is D) return "object : B, D() {} !is D"
|
||||||
|
|
||||||
|
if ((object : D(), B {} as Any) is A) return "object : D(), B {} is A"
|
||||||
|
if ((object : D(), B {} as Any) !is B) return "object : D(), B {} !is B"
|
||||||
|
if ((object : D(), B {} as Any) is C) return "object : D(), B {} is C"
|
||||||
|
if ((object : D(), B {} as Any) !is D) return "object : D(), B {} !is D"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
class C
|
||||||
|
interface I
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val obj: Any = js("({})")
|
||||||
|
|
||||||
|
if (obj is C) return "obj is C"
|
||||||
|
if (obj is I) return "obj is I"
|
||||||
|
|
||||||
|
val obj2: Any = js("Object.create(null)")
|
||||||
|
|
||||||
|
if (obj2 is C) return "obj2 is C"
|
||||||
|
if (obj2 is I) return "obj2 is I"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user