[PL][JS] Add test for handling external declarations

^KT-57378
This commit is contained in:
Dmitriy Dolovov
2023-04-20 16:41:58 +02:00
committed by Space Team
parent 4afc5315ca
commit b5ad5edc08
17 changed files with 203 additions and 3 deletions
@@ -0,0 +1,25 @@
function ExternalClassInheritedFromAbstractExternalClass() {}
ExternalClassInheritedFromAbstractExternalClass.prototype = Object.create(AbstractExternalClass.prototype);
ExternalClassInheritedFromAbstractExternalClass.prototype.abstractFunction = function() {
return "ExternalClassInheritedFromAbstractExternalClass.abstractFunction";
}
ExternalClassInheritedFromAbstractExternalClass.prototype.removedAbstractFunction = function() {
return "ExternalClassInheritedFromAbstractExternalClass.removedAbstractFunction";
}
function OpenExternalClass() {}
OpenExternalClass.prototype.function = function() {
return "OpenExternalClass.function"
}
function ExternalInterfaceInheritedFromOpenExternalClass() {}
ExternalInterfaceInheritedFromOpenExternalClass.prototype = Object.create(OpenExternalClass.prototype);
ExternalInterfaceInheritedFromOpenExternalClass.prototype.abstractFunction = function() {
throw new Error("Calling abstract function ExternalInterfaceInheritedFromOpenExternalClass.abstractFunction");
}
function ExternalClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass() {}
ExternalClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass.prototype = Object.create(ExternalInterfaceInheritedFromOpenExternalClass.prototype);
ExternalClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass.prototype.abstractFunction = function() {
return "ExternalClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass.abstractFunction"
}
@@ -0,0 +1,38 @@
@Suppress("ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED")
external class ExternalClassInheritedFromAbstractExternalClass : AbstractExternalClass {
// override fun abstractFunction(): String
override fun removedAbstractFunction(): String
}
fun ExternalClassInheritedFromAbstractExternalClass.callRemovedFunction() = removedFunction()
class RegularClassInheritedFromAbstractExternalClass : AbstractExternalClass() {
override fun abstractFunction() = "RegularClassInheritedFromAbstractExternalClass.abstractFunction"
override fun removedAbstractFunction() = "RegularClassInheritedFromAbstractExternalClass.removedAbstractFunction"
}
fun RegularClassInheritedFromAbstractExternalClass.callRemovedFunction() = removedFunction()
open external class OpenExternalClass {
fun function(): String
}
@Suppress("INTERFACE_WITH_SUPERCLASS")
external interface ExternalInterfaceInheritedFromOpenExternalClass : OpenExternalClass {
fun abstractFunction(): String
}
external class ExternalClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass : ExternalInterfaceInheritedFromOpenExternalClass {
override fun abstractFunction(): String
}
class RegularClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass :
ExternalInterfaceInheritedFromOpenExternalClass,
/* Note: Have to explicitly inherit from 'OpenExternalClass' becase otherwise JS codegen sees that
* class 'RegularClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass' is inherited only from
* interface 'ExternalInterfaceInheritedFromOpenExternalClass' and does not figure out that a bridge has to be
* generated for function 'function' inherited from 'OpenExternalClass'.
*/
OpenExternalClass() {
override fun abstractFunction(): String = "RegularClassInheritedFromExternalInterfaceInheritedFromOpenExternalClass.abstractFunction"
}
@@ -0,0 +1,2 @@
STEP 0:
dependencies: stdlib, lib1