Jvm-abi-gen: do not treat KmProperty.hasConstant as part of ABI

... for non-const properties.

The meaning of this flag for non-const properties is in reality not
well-established, and it can vary from one release to another. In
particular, it's different in K2.

This commit has two parts:
1) The test (added in 5891617674) about clinit is changed. Original
   motivation was to check that presence or absence of `<clinit>` is not
   a part of the ABI. However, in addition to that, the test also
   involuntarily checked that the aforementioned "hasConstant" flag for
   the property y/Object.y is the same in both cases (which I believe
   was not the intention) because these tests check that Kotlin metadata
   is _exactly the same_ after applying jvm-abi-gen. So I've changed it
   to be more straightforward: one version declares an obvious constant,
   while another declares an obvious non-constant. After this change,
   the test started to fail (even on K1) because the value of the
   "hasConstant" flag was different between two versions.
2) Remove "hasConstant" flag for non-const properties when transforming
   metadata via jvm-abi-gen. This fixes the test and assures it won't
   fail when the project is migrated to LV 2.0.

 #KT-60849 Fixed
This commit is contained in:
Alexander Udalov
2023-08-10 00:38:58 +02:00
committed by Space Team
parent d4d30dcfcf
commit 7f5bc94117
5 changed files with 23 additions and 16 deletions
@@ -5,13 +5,10 @@
package org.jetbrains.kotlin.jvm.abi
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmPackage
import kotlinx.metadata.Visibility
import kotlinx.metadata.*
import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.Metadata
import kotlinx.metadata.jvm.localDelegatedProperties
import kotlinx.metadata.visibility
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.org.objectweb.asm.AnnotationVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
@@ -162,18 +159,28 @@ private fun AnnotationVisitor.visitKotlinMetadata(header: Metadata) {
private fun KmClass.removePrivateDeclarations() {
constructors.removeIf { it.visibility.isPrivate }
functions.removeIf { it.visibility.isPrivate }
properties.removeIf { it.visibility.isPrivate }
(this as KmDeclarationContainer).removePrivateDeclarations()
localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed.
}
private fun KmPackage.removePrivateDeclarations() {
functions.removeIf { it.visibility.isPrivate }
properties.removeIf { it.visibility.isPrivate }
(this as KmDeclarationContainer).removePrivateDeclarations()
localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed.
}
private fun KmDeclarationContainer.removePrivateDeclarations() {
functions.removeIf { it.visibility.isPrivate }
properties.removeIf { it.visibility.isPrivate }
for (property in properties) {
// Whether or not the *non-const* property is initialized by a compile-time constant is not a part of the ABI.
if (!property.isConst) {
property.hasConstant = false
}
}
}
private val Visibility.isPrivate: Boolean
get() = this == Visibility.PRIVATE || this == Visibility.PRIVATE_TO_THIS || this == Visibility.LOCAL
+1 -2
View File
@@ -2,5 +2,4 @@ package test
object Object {
val x = 0
val y = x
}
}
@@ -1,4 +1,3 @@
package test
val x = 0
val y = x
@@ -1,6 +1,7 @@
package test
object Object {
val x = 0
val y = 0
}
val x = foo()
private fun foo(): Int = 0
}
@@ -1,4 +1,5 @@
package test
val x = 0
val y = 0
val x = foo()
private fun foo(): Int = 0