jvm-abi-gen: Remove WhenMapping classes from ABI if possible

This commit is contained in:
Steven Schäfer
2021-08-18 15:25:41 +02:00
committed by Alexander Udalov
parent ec4d7b2bb6
commit 19660f11a7
15 changed files with 124 additions and 1 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.codegen.ClassBuilder
import org.jetbrains.kotlin.codegen.ClassBuilderFactory
import org.jetbrains.kotlin.codegen.DelegatingClassBuilder
import org.jetbrains.kotlin.codegen.DelegatingClassBuilderFactory
import org.jetbrains.kotlin.codegen.`when`.WhenByEnumsMapping
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX
import org.jetbrains.kotlin.descriptors.ClassDescriptor
@@ -156,7 +157,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
when {
publicAbi ->
abiClassInfo[internalName] = AbiClassInfo.Public
!localOrAnonymousClass -> {
!localOrAnonymousClass && !isWhenMappingClass -> {
for (method in maskedMethods) {
methodInfos.replace(method, AbiMethodInfo.STRIP)
}
@@ -165,5 +166,8 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
}
super.done()
}
private val isWhenMappingClass: Boolean
get() = internalName.endsWith(WhenByEnumsMapping.MAPPINGS_CLASS_NAME_POSTFIX)
}
}
@@ -65,6 +65,11 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
}
@TestMetadata("inlineWhenMappings")
public void testInlineWhenMappings() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/inlineWhenMappings/");
}
@TestMetadata("innerObjectRegeneration")
public void testInnerObjectRegeneration() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/innerObjectRegeneration/");
@@ -65,6 +65,11 @@ public class IrCompileAgainstJvmAbiTestGenerated extends AbstractIrCompileAgains
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
}
@TestMetadata("inlineWhenMappings")
public void testInlineWhenMappings() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/inlineWhenMappings/");
}
@TestMetadata("innerObjectRegeneration")
public void testInnerObjectRegeneration() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/innerObjectRegeneration/");
@@ -35,8 +35,18 @@ public class IrJvmAbiContentTestGenerated extends AbstractIrJvmAbiContentTest {
runTest("plugins/jvm-abi-gen/testData/content/annotation/");
}
@TestMetadata("anonymousWhenMapping")
public void testAnonymousWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/");
}
@TestMetadata("class")
public void testClass() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/class/");
}
@TestMetadata("whenMapping")
public void testWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
}
}
@@ -35,8 +35,18 @@ public class JvmAbiContentTestGenerated extends AbstractJvmAbiContentTest {
runTest("plugins/jvm-abi-gen/testData/content/annotation/");
}
@TestMetadata("anonymousWhenMapping")
public void testAnonymousWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/");
}
@TestMetadata("class")
public void testClass() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/class/");
}
@TestMetadata("whenMapping")
public void testWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
}
}
@@ -65,6 +65,11 @@ public class LegacyCompileAgainstJvmAbiTestGenerated extends AbstractLegacyCompi
runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/");
}
@TestMetadata("inlineWhenMappings")
public void testInlineWhenMappings() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/inlineWhenMappings/");
}
@TestMetadata("innerObjectRegeneration")
public void testInnerObjectRegeneration() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/innerObjectRegeneration/");
@@ -35,8 +35,18 @@ public class LegacyJvmAbiContentTestGenerated extends AbstractLegacyJvmAbiConten
runTest("plugins/jvm-abi-gen/testData/content/annotation/");
}
@TestMetadata("anonymousWhenMapping")
public void testAnonymousWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/anonymousWhenMapping/");
}
@TestMetadata("class")
public void testClass() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/class/");
}
@TestMetadata("whenMapping")
public void testWhenMapping() throws Exception {
runTest("plugins/jvm-abi-gen/testData/content/whenMapping/");
}
}
@@ -0,0 +1,5 @@
package app
import lib.*
fun runAppAndReturnOk(): String = value(E.A)
@@ -0,0 +1 @@
// IGNORE_BACKEND_LEGACY: JVM
@@ -0,0 +1,10 @@
package lib
enum class E {
A, B
}
inline fun value(x: E) = when (x) {
E.A -> "OK"
E.B -> "Fail"
}
@@ -0,0 +1,14 @@
@kotlin.Metadata
public final enum class test/E {
// source: 'test.kt'
public final enum static field A: test.E
public final enum static field B: test.E
public static method valueOf(p0: java.lang.String): test.E
public static method values(): test.E[]
}
@kotlin.Metadata
public final class test/Test {
// source: 'test.kt'
public method <init>(): void
public final @org.jetbrains.annotations.NotNull method anonymousWhenMapping(@org.jetbrains.annotations.NotNull p0: test.E): java.lang.String
}
@@ -0,0 +1,10 @@
package test
enum class E { A, B }
class Test {
fun anonymousWhenMapping(e: E) = when (e) {
E.A -> "OK"
else -> "Fail"
}
}
@@ -0,0 +1,2 @@
// IGNORE_BACKEND_LEGACY: JVM
// IGNORE_BACKEND: JVM
@@ -0,0 +1,22 @@
@kotlin.Metadata
public final enum class test/E {
// source: 'test.kt'
public final enum static field A: test.E
public final enum static field B: test.E
public static method valueOf(p0: java.lang.String): test.E
public static method values(): test.E[]
}
@kotlin.Metadata
public synthetic final class test/Test$WhenMappings {
// source: 'test.kt'
public synthetic final static field $EnumSwitchMapping$0: int[]
static method <clinit>(): void
public synthetic inner class test/Test$WhenMappings
}
@kotlin.Metadata
public final class test/Test {
// source: 'test.kt'
public method <init>(): void
public final @org.jetbrains.annotations.NotNull method visibleWhenMapping(@org.jetbrains.annotations.NotNull p0: test.E): java.lang.String
public synthetic inner class test/Test$WhenMappings
}
@@ -0,0 +1,10 @@
package test
enum class E { A, B }
class Test {
inline fun visibleWhenMapping(e: E) = when (e) {
E.A -> "OK"
else -> "Fail"
}
}