JS: when RHS of as cast is non-nullable native interface, check LHS for null
This commit is contained in:
+1
-1
@@ -724,7 +724,7 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class Rtti extends AbstractDiagnosticsTestWithJsStdLib {
|
||||
public void testAllFilesPresentInRtti() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/native/rtti"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib/native/rtti"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||
}
|
||||
|
||||
@TestMetadata("castToNativeInterface.kt")
|
||||
|
||||
@@ -5504,6 +5504,18 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("castToNativeInterfaceChecked.kt")
|
||||
public void testCastToNativeInterfaceChecked() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/castToNativeInterfaceChecked.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("castToNullableNativeInterface.kt")
|
||||
public void testCastToNullableNativeInterface() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/castToNullableNativeInterface.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("castToTypeParamBoundedByNativeInterface.kt")
|
||||
public void testCastToTypeParamBoundedByNativeInterface() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/castToTypeParamBoundedByNativeInterface.kt");
|
||||
@@ -5648,6 +5660,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("safeCastToNativeInterface.kt")
|
||||
public void testSafeCastToNativeInterface() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/safeCastToNativeInterface.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("secondaryConstructor.kt")
|
||||
public void testSecondaryConstructor() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/secondaryConstructor.kt");
|
||||
|
||||
+1
-1
@@ -159,7 +159,7 @@ public final class PatternTranslator extends AbstractTranslator {
|
||||
private JsExpression doGetIsTypeCheckCallable(@NotNull KotlinType type) {
|
||||
ClassifierDescriptor targetDescriptor = type.getConstructor().getDeclarationDescriptor();
|
||||
if (targetDescriptor != null && AnnotationsUtils.isNativeInterface(targetDescriptor)) {
|
||||
return null;
|
||||
return type.isMarkedNullable() ? null : namer().isAny();
|
||||
}
|
||||
|
||||
JsExpression builtinCheck = getIsTypeCheckCallableForBuiltin(type);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
@native interface I {
|
||||
fun foo(): String
|
||||
}
|
||||
|
||||
fun createObject(): Any? = null
|
||||
|
||||
fun box(): String {
|
||||
try {
|
||||
(createObject() as I).foo()
|
||||
return "fail: exception not thrown"
|
||||
}
|
||||
catch (e: ClassCastException) {
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
@native interface I {
|
||||
fun foo(): String
|
||||
}
|
||||
|
||||
fun createObject(): Any? = null
|
||||
|
||||
fun box(): String {
|
||||
val result = (createObject() as I?)?.foo()
|
||||
return if (result == null) "OK" else "fail"
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
var global = ""
|
||||
|
||||
inline fun <reified T> log(x: T) {
|
||||
global += jsClass<T>().name + ": " + x
|
||||
inline fun <reified T : Any> log(x: T) {
|
||||
global += T::class.js.name + ": " + x
|
||||
}
|
||||
|
||||
@native class C {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
@native interface I {
|
||||
fun foo(): String
|
||||
}
|
||||
fun createObject(): Any? = null
|
||||
|
||||
fun box(): String {
|
||||
val result = (createObject() as? I)?.foo()
|
||||
return if (result == null) "OK" else "fail"
|
||||
}
|
||||
Reference in New Issue
Block a user