From 0302fcbb72d32b2dbc4dd3cea07e31a2a8d82422 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 29 Nov 2016 16:11:31 +0300 Subject: [PATCH] JS: don't write native superclass to metadata. Fix KT-15007 --- .../js/test/semantics/BoxJsTestGenerated.java | 12 +++++++++ .../translate/declaration/ClassTranslator.kt | 11 ++++++-- .../testData/box/rtti/exceptionIsInterface.kt | 13 ++++++++++ .../box/rtti/subclassOfNativeIsInterface.js | 2 ++ .../box/rtti/subclassOfNativeIsInterface.kt | 25 +++++++++++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/box/rtti/exceptionIsInterface.kt create mode 100644 js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.js create mode 100644 js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index e40f77b68b9..ee8911fb8a3 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -6758,6 +6758,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("exceptionIsInterface.kt") + public void testExceptionIsInterface() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/rtti/exceptionIsInterface.kt"); + doTest(fileName); + } + @TestMetadata("isComparable.kt") public void testIsComparable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/rtti/isComparable.kt"); @@ -6841,6 +6847,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/rtti/stdlibEmptyListClass.kt"); doTest(fileName); } + + @TestMetadata("subclassOfNativeIsInterface.kt") + public void testSubclassOfNativeIsInterface() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.kt"); + doTest(fileName); + } } @TestMetadata("js/js.translator/testData/box/safeCall") diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 69178ed1cea..21b01ab0f89 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -376,7 +376,12 @@ class ClassTranslator private constructor( if (supertypes.size == 1) { val type = supertypes[0] val supertypeDescriptor = getClassDescriptorForType(type) - return listOf(ReferenceTranslator.translateAsTypeReference(supertypeDescriptor, context())) + return if (!AnnotationsUtils.isNativeObject(supertypeDescriptor)) { + listOf(ReferenceTranslator.translateAsTypeReference(supertypeDescriptor, context())) + } + else { + listOf() + } } val supertypeConstructors = mutableSetOf() @@ -392,7 +397,9 @@ class ClassTranslator private constructor( for (typeConstructor in sortedAllSuperTypes) { if (supertypeConstructors.contains(typeConstructor)) { val supertypeDescriptor = getClassDescriptorForTypeConstructor(typeConstructor) - supertypesRefs += ReferenceTranslator.translateAsTypeReference(supertypeDescriptor, context()) + if (!AnnotationsUtils.isNativeObject(supertypeDescriptor)) { + supertypesRefs += ReferenceTranslator.translateAsTypeReference(supertypeDescriptor, context()) + } } } return supertypesRefs diff --git a/js/js.translator/testData/box/rtti/exceptionIsInterface.kt b/js/js.translator/testData/box/rtti/exceptionIsInterface.kt new file mode 100644 index 00000000000..f64cc48cdc2 --- /dev/null +++ b/js/js.translator/testData/box/rtti/exceptionIsInterface.kt @@ -0,0 +1,13 @@ +interface I + +class MyException: Exception(), I + +fun box(): String { + var e: Any = MyException() + if (e !is I) return "fail1" + + e = Exception() + if (e is I) return "fail2" + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.js b/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.js new file mode 100644 index 00000000000..259b58db20c --- /dev/null +++ b/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.js @@ -0,0 +1,2 @@ +function A() { +} \ No newline at end of file diff --git a/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.kt b/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.kt new file mode 100644 index 00000000000..faef815873f --- /dev/null +++ b/js/js.translator/testData/box/rtti/subclassOfNativeIsInterface.kt @@ -0,0 +1,25 @@ +@native open class A + +interface I + +class B : A(), I + +open class C : A() + +class D : C(), I + +fun box(): String { + var a: Any = A() + if (a is I) return "fail1" + + a = B() + if (a !is I) return "fail2" + + a = D() + if (a !is I) return "fail3" + + a = C() + if (a is I) return "fail4" + + return "OK" +} \ No newline at end of file