[JS] Keep interfaces
^KT-54173 fixed
This commit is contained in:
committed by
Space Team
parent
41c9ffb060
commit
7d8636aac4
+2
-1
@@ -127,7 +127,8 @@ internal class JsUsefulDeclarationProcessor(
|
|||||||
|
|
||||||
override fun processSuperTypes(irClass: IrClass) {
|
override fun processSuperTypes(irClass: IrClass) {
|
||||||
irClass.superTypes.forEach {
|
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")
|
(it.classifierOrNull as? IrClassSymbol)?.owner?.enqueue(irClass, "superTypes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -63,7 +63,7 @@ class UselessDeclarationsRemover(
|
|||||||
|
|
||||||
private fun IrClassSymbol.collectUsedSuperTypes(): Set<IrClassSymbol> {
|
private fun IrClassSymbol.collectUsedSuperTypes(): Set<IrClassSymbol> {
|
||||||
return savedTypesCache.getOrPut(this) {
|
return savedTypesCache.getOrPut(this) {
|
||||||
if (owner in usefulDeclarations) {
|
if (owner in usefulDeclarations || context.keeper.shouldKeep(owner)) {
|
||||||
setOf(this)
|
setOf(this)
|
||||||
} else {
|
} else {
|
||||||
owner.superTypes
|
owner.superTypes
|
||||||
|
|||||||
+12
@@ -7290,6 +7290,12 @@ public class FirJsTestGenerated extends AbstractFirJsTest {
|
|||||||
runTest("js/js.translator/testData/box/keep/keepClass.kt");
|
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
|
@Test
|
||||||
@TestMetadata("keepMethod.kt")
|
@TestMetadata("keepMethod.kt")
|
||||||
public void testKeepMethod() throws Exception {
|
public void testKeepMethod() throws Exception {
|
||||||
@@ -7313,6 +7319,12 @@ public class FirJsTestGenerated extends AbstractFirJsTest {
|
|||||||
public void testKeepOverriddenMethod() throws Exception {
|
public void testKeepOverriddenMethod() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/keep/keepOverriddenMethod.kt");
|
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
|
@Nested
|
||||||
|
|||||||
+12
@@ -7290,6 +7290,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/keep/keepClass.kt");
|
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
|
@Test
|
||||||
@TestMetadata("keepMethod.kt")
|
@TestMetadata("keepMethod.kt")
|
||||||
public void testKeepMethod() throws Exception {
|
public void testKeepMethod() throws Exception {
|
||||||
@@ -7313,6 +7319,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
public void testKeepOverriddenMethod() throws Exception {
|
public void testKeepOverriddenMethod() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/keep/keepOverriddenMethod.kt");
|
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
|
@Nested
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user