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 de60aea2ef2..ec0e195c496 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 @@ -3547,6 +3547,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/inheritance/interfaces"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("fromExternalInterface.kt") + public void testFromExternalInterface() throws Exception { + runTest("js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt"); + } + @TestMetadata("withDefaultMethod.kt") public void testWithDefaultMethod() throws Exception { runTest("js/js.translator/testData/box/inheritance/interfaces/withDefaultMethod.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java index 01d78c498a6..1a14aaa7d7d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java @@ -3547,6 +3547,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/inheritance/interfaces"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS_IR, true); } + @TestMetadata("fromExternalInterface.kt") + public void testFromExternalInterface() throws Exception { + runTest("js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt"); + } + @TestMetadata("withDefaultMethod.kt") public void testWithDefaultMethod() throws Exception { runTest("js/js.translator/testData/box/inheritance/interfaces/withDefaultMethod.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt index cba6ccfb9fe..24ebcbc892f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassModelGenerator.kt @@ -192,7 +192,7 @@ class ClassModelGenerator(val context: TranslationContext) { if (!visitedDescriptors.add(original) || !original.filter()) return val overridden = original.getTypedOverriddenDescriptors().map { it.getOriginalDescriptor() } - if (original.kind.isReal) { + if (original.kind.isReal && !original.isEffectivelyExternal()) { collectedDescriptors.putIfAbsent(original, source) } else { diff --git a/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt b/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt new file mode 100644 index 00000000000..7df7bc2a8fd --- /dev/null +++ b/js/js.translator/testData/box/inheritance/interfaces/fromExternalInterface.kt @@ -0,0 +1,31 @@ +// EXPECTED_REACHABLE_NODES: 1093 + +external interface Foo { + var externalProperty: String? + get() = definedExternally + set(it) = definedExternally +} + +interface Bar : Foo + +class CCC: Foo + +class DDD: Bar + +interface Bar2: Foo { + override var externalProperty: String? + get() = "Bar2" + set(value) {} +} + +class FFF: Bar2 + +fun box(): String { + val c = CCC() + if (c.externalProperty != null) return "fail1" + val d = DDD() + if (d.externalProperty != null) return "fail2" + val f = FFF() + if (f.externalProperty != "Bar2") return "fail3" + return "OK" +} \ No newline at end of file