jvm-abi-gen: Remove effectively private classes from ABI

#KT-64590 Fixed
This commit is contained in:
Vladimir Tagakov
2023-12-26 18:11:39 -07:00
committed by Space Team
parent 7cf793f308
commit 11d3ead975
50 changed files with 511 additions and 56 deletions
@@ -0,0 +1,5 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package test
fun f() {}
@@ -0,0 +1,5 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package test
// Removal of function from a multi-file class should result in a different ABI even though the multi-file part class is package-private.
@@ -0,0 +1,9 @@
package test
class Class {
private companion object {}
private class PrivateClass {
companion object {}
class NestedClass
}
}
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,3 @@
package test
class Class
@@ -0,0 +1,7 @@
package test
class SomeClass {
private interface PrivateInterface {
fun d() = "Default implementation of removed interface should not affect abi."
}
}
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,7 @@
package test
class SomeClass {
private interface PrivateInterface {
fun d(): String
}
}
@@ -0,0 +1,9 @@
package test
class Outer {
class Public : NestedClass.I
private class NestedClass {
interface I
}
}
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,11 @@
package test
class Outer {
class Public : NestedClass.I
private class NestedClass {
interface I
fun someFun() = Unit
}
}
@@ -0,0 +1,5 @@
package test
class Class
private class PrivateClass
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,3 @@
package test
class Class
@@ -0,0 +1,5 @@
package test
class Class
private class PrivateClass
@@ -0,0 +1,3 @@
package test
class Class
@@ -0,0 +1,5 @@
package app
//UnexpectedInnerClass although declared in a separate module
//appear to be an inner class of the class generated from this file
fun runAppAndReturnOk() = AppKt.UnexpectedInnerClass.result()
@@ -0,0 +1,7 @@
package app
class AppKt {
object UnexpectedInnerClass {
fun result() = "OK"
}
}
@@ -0,0 +1,12 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
f1()
if (v1 != "OK") return "Fail 1"
f2()
if (v2 != "OK") return "Fail 2"
return "OK"
}
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T1 = String
fun f1() {}
val v1: T1 = "OK"
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T2 = String
fun f2() {}
val v2: T2 = "OK"
@@ -0,0 +1,12 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
f1()
if (v1 != "OK") return "Fail 1"
f2()
if (v2 != "OK") return "Fail 2"
return "OK"
}
@@ -0,0 +1 @@
// INHERIT_MULTIFILE_PARTS
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T1 = String
fun f1() {}
val v1: T1 = "OK"
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T2 = String
fun f2() {}
val v2: T2 = "OK"
@@ -0,0 +1,12 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
f1()
if (v1 != "OK") return "Fail 1"
f2()
if (v2 != "OK") return "Fail 2"
return "OK"
}
@@ -0,0 +1,2 @@
// INHERIT_MULTIFILE_PARTS
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T1 = String
fun f1() {}
val v1: T1 = "OK"
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T2 = String
fun f2() {}
val v2: T2 = "OK"
@@ -0,0 +1,12 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
f1()
if (v1 != "OK") return "Fail 1"
f2()
if (v2 != "OK") return "Fail 2"
return "OK"
}
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T1 = String
fun f1() {}
val v1: T1 = "OK"
@@ -0,0 +1,7 @@
@file:JvmMultifileClass
@file:JvmName("Multifile")
package lib
typealias T2 = String
fun f2() {}
val v2: T2 = "OK"
@@ -0,0 +1,7 @@
package app
import lib.*
fun runAppAndReturnOk(): String {
return Outer.Public.result()
}
@@ -0,0 +1 @@
// REMOVE_PRIVATE_CLASSES
@@ -0,0 +1,13 @@
package lib
class Outer {
object Public : Private
private interface Private: Secret.EffectivelyPrivate
private object Secret {
interface EffectivelyPrivate {
fun result(): String = "OK"
}
}
}
@@ -0,0 +1,7 @@
package test
class Outer {
private object Annotations {
annotation class EffectivelyPrivateAnnotation
}
}
@@ -0,0 +1,20 @@
@java.lang.annotation.Retention(value=RUNTIME)
@kotlin.Metadata
public annotation class test/Outer$Annotations$EffectivelyPrivateAnnotation {
// source: 'annotation.kt'
private final inner class test/Outer$Annotations
public inner class test/Outer$Annotations$EffectivelyPrivateAnnotation
}
@kotlin.Metadata
final class test/Outer$Annotations {
// source: 'annotation.kt'
private final inner class test/Outer$Annotations
public inner class test/Outer$Annotations$EffectivelyPrivateAnnotation
public final static @org.jetbrains.annotations.NotNull field INSTANCE: test.Outer$Annotations
}
@kotlin.Metadata
public final class test/Outer {
// source: 'annotation.kt'
private final inner class test/Outer$Annotations
public method <init>(): void
}