[JS] Keep interfaces

^KT-54173 fixed
This commit is contained in:
Ilya Goncharov
2022-09-29 16:12:19 +00:00
committed by Space Team
parent 41c9ffb060
commit 7d8636aac4
6 changed files with 87 additions and 2 deletions
@@ -127,7 +127,8 @@ internal class JsUsefulDeclarationProcessor(
override fun processSuperTypes(irClass: IrClass) {
irClass.superTypes.forEach {
if (!it.isInterface()) {
val shouldClassBeKept = it.classOrNull?.let { context.keeper.shouldKeep(it.owner) } ?: false
if (!it.isInterface() || shouldClassBeKept) {
(it.classifierOrNull as? IrClassSymbol)?.owner?.enqueue(irClass, "superTypes")
}
}
@@ -63,7 +63,7 @@ class UselessDeclarationsRemover(
private fun IrClassSymbol.collectUsedSuperTypes(): Set<IrClassSymbol> {
return savedTypesCache.getOrPut(this) {
if (owner in usefulDeclarations) {
if (owner in usefulDeclarations || context.keeper.shouldKeep(owner)) {
setOf(this)
} else {
owner.superTypes
@@ -7290,6 +7290,12 @@ public class FirJsTestGenerated extends AbstractFirJsTest {
runTest("js/js.translator/testData/box/keep/keepClass.kt");
}
@Test
@TestMetadata("keepInterface.kt")
public void testKeepInterface() throws Exception {
runTest("js/js.translator/testData/box/keep/keepInterface.kt");
}
@Test
@TestMetadata("keepMethod.kt")
public void testKeepMethod() throws Exception {
@@ -7313,6 +7319,12 @@ public class FirJsTestGenerated extends AbstractFirJsTest {
public void testKeepOverriddenMethod() throws Exception {
runTest("js/js.translator/testData/box/keep/keepOverriddenMethod.kt");
}
@Test
@TestMetadata("keepVarAnonymousClass.kt")
public void testKeepVarAnonymousClass() throws Exception {
runTest("js/js.translator/testData/box/keep/keepVarAnonymousClass.kt");
}
}
@Nested
@@ -7290,6 +7290,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/keep/keepClass.kt");
}
@Test
@TestMetadata("keepInterface.kt")
public void testKeepInterface() throws Exception {
runTest("js/js.translator/testData/box/keep/keepInterface.kt");
}
@Test
@TestMetadata("keepMethod.kt")
public void testKeepMethod() throws Exception {
@@ -7313,6 +7319,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
public void testKeepOverriddenMethod() throws Exception {
runTest("js/js.translator/testData/box/keep/keepOverriddenMethod.kt");
}
@Test
@TestMetadata("keepVarAnonymousClass.kt")
public void testKeepVarAnonymousClass() throws Exception {
runTest("js/js.translator/testData/box/keep/keepVarAnonymousClass.kt");
}
}
@Nested
+34
View File
@@ -0,0 +1,34 @@
// TARGET_BACKEND: JS_IR
// ONLY_IR_DCE
// RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE
// KEEP: DenotedFace
// MODULE: keep_interface
// FILE: lib.kt
interface DenotedFace {
fun keepMeA() = 7
fun keepMeB(): Int
}
class A : DenotedFace {
override fun keepMeB(): Int {
return 8
}
}
@JsExport
fun foo(): A {
return A()
}
// FILE: test.js
function box() {
var a = this["keep_interface"].foo()
if (a.keepMeA_ds0nq4_k$() != 7) return "fail 1"
if (a.keepMeB_ds0nq3_k$() != 8) return "fail 2"
return "OK"
}
@@ -0,0 +1,26 @@
// TARGET_BACKEND: JS_IR
// ONLY_IR_DCE
// RUN_PLAIN_BOX_FUNCTION
// INFER_MAIN_MODULE
// KEEP: DenotedFace
// MODULE: keep_var
// FILE: lib.kt
interface DenotedFace {
fun keepMeA() = 7
fun keepMeB(): Int
}
@JsExport
val denotedFaceTrigger = object : DenotedFace { override fun keepMeB() = 8 }
// FILE: test.js
function box() {
var a = this["keep_var"].denotedFaceTrigger
if (a.keepMeA_ds0nq4_k$() != 7) return "fail 1"
if (a.keepMeB_ds0nq3_k$() != 8) return "fail 2"
return "OK"
}