[K/JS] Fix interfaces inside TypeScript definitions if they have only an external interface parent ^KT-64708 Fixed

Merge-request: KT-MR-14665
Merged-by: Artem Kobzar <Artem.Kobzar@jetbrains.com>
This commit is contained in:
Artem Kobzar
2024-03-01 09:37:00 +00:00
committed by Space Team
parent 610b9eae91
commit ee2aa6d67f
5 changed files with 33 additions and 1 deletions
@@ -379,7 +379,7 @@ class ExportModelGenerator(val context: JsIrBackendContext, val generateNamespac
private fun IrClass.shouldContainImplementationOfMagicProperty(superTypes: Iterable<IrType>): Boolean { private fun IrClass.shouldContainImplementationOfMagicProperty(superTypes: Iterable<IrType>): Boolean {
return !isExternal && superTypes.any { return !isExternal && superTypes.any {
val superClass = it.classOrNull?.owner ?: return@any false val superClass = it.classOrNull?.owner ?: return@any false
superClass.isInterface && superClass.isExported(context) || superClass.isJsImplicitExport() superClass.isInterface && it.shouldAddMagicPropertyOfSuper() || superClass.isJsImplicitExport()
} }
} }
@@ -5,6 +5,8 @@ declare namespace JS_TESTS {
readonly required: number; readonly required: number;
readonly notRequired?: Nullable<number>; readonly notRequired?: Nullable<number>;
} }
interface ExportedParentInterface {
}
} }
namespace foo { namespace foo {
interface TestInterface { interface TestInterface {
@@ -45,5 +47,11 @@ declare namespace JS_TESTS {
readonly "foo.InterfaceWithCompanion": unique symbol; readonly "foo.InterfaceWithCompanion": unique symbol;
}; };
} }
interface ExportedChildInterface extends foo.ExportedParentInterface {
bar(): void;
readonly __doNotUseOrImplementIt: {
readonly "foo.ExportedChildInterface": unique symbol;
};
}
} }
} }
@@ -66,3 +66,11 @@ interface InterfaceWithCompanion {
fun foo() = "String" fun foo() = "String"
} }
} }
external interface ExportedParentInterface
interface ExportedChildInterface : ExportedParentInterface {
fun bar()
}
@@ -5,6 +5,8 @@ declare namespace JS_TESTS {
readonly required: number; readonly required: number;
readonly notRequired?: Nullable<number>; readonly notRequired?: Nullable<number>;
} }
interface ExportedParentInterface {
}
} }
namespace foo { namespace foo {
interface TestInterface { interface TestInterface {
@@ -45,5 +47,11 @@ declare namespace JS_TESTS {
readonly "foo.InterfaceWithCompanion": unique symbol; readonly "foo.InterfaceWithCompanion": unique symbol;
}; };
} }
interface ExportedChildInterface extends foo.ExportedParentInterface {
bar(): void;
readonly __doNotUseOrImplementIt: {
readonly "foo.ExportedChildInterface": unique symbol;
};
}
} }
} }
@@ -62,3 +62,11 @@ interface InterfaceWithCompanion {
fun foo() = "String" fun foo() = "String"
} }
} }
@JsExport
external interface ExportedParentInterface
@JsExport
interface ExportedChildInterface : ExportedParentInterface {
fun bar()
}