Introduce @DeprecatedVisitor; mark up visitor-related declarations with it.

Provide convenient JVM writing API.

Get rid of ExperimentalUnsignedTypes.
This commit is contained in:
Leonid Startsev
2022-10-20 17:23:53 +02:00
committed by Space Team
parent dd985d8209
commit 471882b743
29 changed files with 653 additions and 43 deletions
@@ -1018,10 +1018,6 @@ public abstract class kotlinx/metadata/KmVersionRequirementVisitor {
public fun visitVersion (III)V
}
public final class kotlinx/metadata/UtilKt {
public static final fun assignFrom (Ljava/util/List;Ljava/util/Collection;)V
}
public class kotlinx/metadata/impl/ClassWriter : kotlinx/metadata/KmClassVisitor {
public fun <init> (Lorg/jetbrains/kotlin/metadata/serialization/StringTable;Ljava/util/List;)V
public synthetic fun <init> (Lorg/jetbrains/kotlin/metadata/serialization/StringTable;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -277,6 +277,18 @@ public final class kotlinx/metadata/jvm/KotlinClassMetadata$Class$Writer : kotli
public final class kotlinx/metadata/jvm/KotlinClassMetadata$Companion {
public final fun read (Lkotlinx/metadata/jvm/KotlinClassHeader;)Lkotlinx/metadata/jvm/KotlinClassMetadata;
public final fun writeClass (Lkotlinx/metadata/KmClass;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class;
public static synthetic fun writeClass$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;Lkotlinx/metadata/KmClass;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class;
public final fun writeFileFacade (Lkotlinx/metadata/KmPackage;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade;
public static synthetic fun writeFileFacade$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;Lkotlinx/metadata/KmPackage;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade;
public final fun writeLambda (Lkotlinx/metadata/KmLambda;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass;
public static synthetic fun writeLambda$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;Lkotlinx/metadata/KmLambda;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass;
public final fun writeMultiFileClassFacade (Ljava/util/List;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade;
public static synthetic fun writeMultiFileClassFacade$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;Ljava/util/List;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade;
public final fun writeMultiFileClassPart (Lkotlinx/metadata/KmPackage;Ljava/lang/String;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart;
public static synthetic fun writeMultiFileClassPart$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;Lkotlinx/metadata/KmPackage;Ljava/lang/String;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart;
public final fun writeSyntheticClass ([II)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass;
public static synthetic fun writeSyntheticClass$default (Lkotlinx/metadata/jvm/KotlinClassMetadata$Companion;[IIILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass;
}
public final class kotlinx/metadata/jvm/KotlinClassMetadata$FileFacade : kotlinx/metadata/jvm/KotlinClassMetadata {
@@ -346,6 +358,8 @@ public final class kotlinx/metadata/jvm/KotlinModuleMetadata {
public final class kotlinx/metadata/jvm/KotlinModuleMetadata$Companion {
public final fun read ([B)Lkotlinx/metadata/jvm/KotlinModuleMetadata;
public final fun write (Lkotlinx/metadata/jvm/KmModule;[I)Lkotlinx/metadata/jvm/KotlinModuleMetadata;
public static synthetic fun write$default (Lkotlinx/metadata/jvm/KotlinModuleMetadata$Companion;Lkotlinx/metadata/jvm/KmModule;[IILjava/lang/Object;)Lkotlinx/metadata/jvm/KotlinModuleMetadata;
}
public final class kotlinx/metadata/jvm/KotlinModuleMetadata$Writer : kotlinx/metadata/jvm/KmModuleVisitor {
@@ -36,6 +36,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* Visits metadata of this class with a new [KmClass] instance and returns that instance.
*/
@OptIn(DeprecatedVisitor::class)
fun toKmClass(): KmClass =
KmClass().apply(this::accept)
@@ -44,6 +45,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
*
* @param v the visitor that must visit this class
*/
@DeprecatedVisitor
fun accept(v: KmClassVisitor) {
val (strings, proto) = classData
proto.accept(v, strings)
@@ -52,6 +54,12 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* A [KmClassVisitor] that generates the metadata of a Kotlin class.
*/
// @Suppress("INVISIBLE_REFERENCE") FIXME: maybe make supertype internal?
@OptIn(DeprecatedVisitor::class)
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeClass(kmClass, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
class Writer : ClassWriter(JvmStringTable()) {
/**
* Returns the metadata of the class that was written with this writer.
@@ -62,6 +70,10 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* 0 by default
*/
@JvmOverloads
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeClass(kmClass, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
fun write(
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
@@ -87,6 +99,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* Visits metadata of this file facade with a new [KmPackage] instance and returns that instance.
*/
@OptIn(DeprecatedVisitor::class)
fun toKmPackage(): KmPackage =
KmPackage().apply(this::accept)
@@ -95,6 +108,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
*
* @param v the visitor that must visit this file facade
*/
@DeprecatedVisitor
fun accept(v: KmPackageVisitor) {
val (strings, proto) = packageData
proto.accept(v, strings)
@@ -103,6 +117,11 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* A [KmPackageVisitor] that generates the metadata of a Kotlin file facade.
*/
@OptIn(DeprecatedVisitor::class)
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeFileFacade(kmPackage, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
class Writer : PackageWriter(JvmStringTable()) {
/**
* Returns the metadata of the file facade that was written with this writer.
@@ -113,6 +132,10 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* 0 by default
*/
@JvmOverloads
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeFileFacade(kmPackage, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
fun write(
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
@@ -141,6 +164,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
*
* Returns `null` if this synthetic class does not represent a lambda.
*/
@OptIn(DeprecatedVisitor::class)
fun toKmLambda(): KmLambda? =
if (isLambda) KmLambda().apply(this::accept) else null
@@ -158,6 +182,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
*
* @param v the visitor that must visit this lambda
*/
@DeprecatedVisitor
fun accept(v: KmLambdaVisitor) {
if (!isLambda) throw IllegalStateException(
"accept(KmLambdaVisitor) is only possible for synthetic classes which are lambdas (isLambda = true)"
@@ -172,6 +197,12 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* call [Writer.visitFunction] and [Writer.visitEnd] on a newly created instance of this writer. If these methods are not called,
* the resulting metadata will represent a _non-lambda_ synthetic class.
*/
@OptIn(DeprecatedVisitor::class)
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeLambda(kmLambda, metadataVersion, extraInt) " +
"or KotlinClassMetadata.writeSyntheticClass(metadataVersion, extraInt) for a non-lambda synthetic class",
level = DeprecationLevel.ERROR
)
class Writer : LambdaWriter(JvmStringTable()) {
/**
* Returns the metadata of the synthetic class that was written with this writer.
@@ -181,6 +212,11 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* @param extraInt the value of the class-level flags to be written to the metadata (see [KotlinClassHeader.extraInt]),
* 0 by default
*/
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeLambda(kmLambda, metadataVersion, extraInt) " +
"or KotlinClassMetadata.writeSyntheticClass(metadataVersion, extraInt) for a non-lambda synthetic class",
level = DeprecationLevel.ERROR
)
@JvmOverloads
fun write(
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
@@ -211,6 +247,10 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* A writer that generates the metadata of a multi-file class facade.
*/
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeMultiFileClassFacade(partClassNames, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
class Writer {
/**
* Returns the metadata of the multi-file class facade that was written with this writer.
@@ -221,6 +261,11 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* @param extraInt the value of the class-level flags to be written to the metadata (see [KotlinClassHeader.extraInt]),
* 0 by default
*/
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeMultiFileClassFacade(partClassNames, metadataVersion, extraInt)",
ReplaceWith("KotlinClassMetadata.writeMultiFileClassFacade(partClassNames, metadataVersion, extraInt)"),
level = DeprecationLevel.ERROR
)
@JvmOverloads
fun write(
partClassNames: List<String>,
@@ -259,6 +304,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* Visits metadata of this multi-file class part with a new [KmPackage] instance and returns that instance.
*/
@OptIn(DeprecatedVisitor::class)
fun toKmPackage(): KmPackage =
KmPackage().apply(this::accept)
@@ -267,6 +313,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
*
* @param v the visitor that must visit this multi-file class part
*/
@DeprecatedVisitor
fun accept(v: KmPackageVisitor) {
val (strings, proto) = packageData
proto.accept(v, strings)
@@ -275,6 +322,11 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
/**
* A [KmPackageVisitor] that generates the metadata of a multi-file class part.
*/
@OptIn(DeprecatedVisitor::class)
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeMultiFileClassPart(kmPackage, facadeClassName, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
class Writer : PackageWriter(JvmStringTable()) {
/**
* Returns the metadata of the multi-file class part that was written with this writer.
@@ -285,6 +337,10 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
* @param extraInt the value of the class-level flags to be written to the metadata (see [KotlinClassHeader.extraInt]),
* 0 by default
*/
@Deprecated(
"Writer API is deprecated. Please use KotlinClassMetadata.writeMultiFileClassPart(kmPackage, facadeClassName, metadataVersion, extraInt)",
level = DeprecationLevel.ERROR
)
@JvmOverloads
fun write(
facadeClassName: String,
@@ -308,6 +364,55 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
class Unknown internal constructor(header: KotlinClassHeader) : KotlinClassMetadata(header)
companion object {
// TODO: docs
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun writeClass(
kmClass: KmClass,
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): Class = KotlinClassMetadata.Class.Writer().also { kmClass.accept(it) }.write(metadataVersion, extraInt)
// TODO: docs
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun writeFileFacade(
kmPackage: KmPackage,
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): FileFacade = FileFacade.Writer().also { kmPackage.accept(it) }.write(metadataVersion, extraInt)
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun writeLambda(
kmLambda: KmLambda,
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): SyntheticClass = SyntheticClass.Writer().also { kmLambda.accept(it) }.write(metadataVersion, extraInt)
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun writeSyntheticClass(
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): SyntheticClass = SyntheticClass.Writer().write(metadataVersion, extraInt)
@Suppress("DEPRECATION_ERROR")
fun writeMultiFileClassFacade(
partClassNames: List<String>, metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): MultiFileClassFacade = MultiFileClassFacade.Writer().write(partClassNames, metadataVersion, extraInt)
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun writeMultiFileClassPart(
kmPackage: KmPackage,
facadeClassName: String,
metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION,
extraInt: Int = 0
): MultiFileClassPart = MultiFileClassPart.Writer().also { kmPackage.accept(it) }.write(facadeClassName, metadataVersion, extraInt)
/**
* Reads and parses the given header of a Kotlin JVM class file and returns the correct type of [KotlinClassMetadata] encoded by
* this header, or `null` if this header encodes an unsupported kind of Kotlin classes or has an unsupported metadata version.
@@ -7,10 +7,7 @@
package kotlinx.metadata.jvm
import kotlinx.metadata.InconsistentKotlinMetadataException
import kotlinx.metadata.KmAnnotation
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmClassVisitor
import kotlinx.metadata.*
import kotlinx.metadata.impl.accept
import org.jetbrains.kotlin.metadata.jvm.JvmModuleProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
@@ -25,6 +22,8 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.serializeToByteArray
* and call [KotlinModuleMetadata.read].
*
* @property bytes the byte array representing the contents of a `.kotlin_module` file
*
* TODO: since it is not completed, may be we should just delete it?
*/
class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePrivate") val bytes: ByteArray) {
internal val data: ModuleMapping = ModuleMapping.loadModuleMapping(
@@ -36,12 +35,15 @@ class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePri
/**
* Visits metadata of this module with a new [KmModule] instance and returns that instance.
*/
@OptIn(DeprecatedVisitor::class)
fun toKmModule(): KmModule =
KmModule().apply(this::accept)
/**
* A [KmModuleVisitor] that generates the metadata of a Kotlin JVM module file.
*/
@OptIn(DeprecatedVisitor::class)
@Deprecated("Writer class API is deprecated. Please use KotlinModuleMetadata.write(kmModule, metadataVersion)", level = DeprecationLevel.ERROR)
class Writer : KmModuleVisitor() {
private val b = JvmModuleProtoBuf.Module.newBuilder()
@@ -84,6 +86,7 @@ class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePri
* @param metadataVersion metadata version to be written to the metadata (see [KotlinClassHeader.metadataVersion]),
* [KotlinClassHeader.COMPATIBLE_METADATA_VERSION] by default
*/
@Deprecated("Writer class API is deprecated. Please use KotlinModuleMetadata.write(kmModule, metadataVersion)", level = DeprecationLevel.ERROR)
fun write(metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION): KotlinModuleMetadata =
KotlinModuleMetadata(b.build().serializeToByteArray(JvmMetadataVersion(*metadataVersion), 0))
}
@@ -93,6 +96,7 @@ class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePri
*
* @param v the visitor that must visit this module file
*/
@DeprecatedVisitor
fun accept(v: KmModuleVisitor) {
for ((fqName, parts) in data.packageFqName2Parts) {
val (fileFacades, multiFileClassParts) = parts.parts.partition { parts.getMultifileFacadeName(it) == null }
@@ -137,6 +141,10 @@ class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePri
throw InconsistentKotlinMetadataException("Exception occurred when reading Kotlin metadata", e)
}
}
@OptIn(DeprecatedVisitor::class)
@Suppress("DEPRECATION_ERROR")
fun write(kmModule: KmModule, metadataVersion: IntArray = KotlinClassHeader.COMPATIBLE_METADATA_VERSION): KotlinModuleMetadata = Writer().also { kmModule.accept(it) }.write(metadataVersion)
}
}
@@ -145,6 +153,7 @@ class KotlinModuleMetadata(@Suppress("CanBeParameter", "MemberVisibilityCanBePri
*
* When using this class, [visitEnd] must be called exactly once and after calls to all other visit* methods.
*/
@DeprecatedVisitor
abstract class KmModuleVisitor(private val delegate: KmModuleVisitor? = null) {
/**
* Visits the table of all single- and multi-file facades declared in some package of this module.
@@ -193,6 +202,7 @@ abstract class KmModuleVisitor(private val delegate: KmModuleVisitor? = null) {
/**
* Represents a Kotlin JVM module file.
*/
@OptIn(DeprecatedVisitor::class)
class KmModule : KmModuleVisitor() {
/**
* Table of all single- and multi-file facades declared in some package of this module, where keys are '.'-separated package names.
@@ -214,14 +224,17 @@ class KmModule : KmModuleVisitor() {
*/
val optionalAnnotationClasses: MutableList<KmClass> = ArrayList(0)
@DeprecatedVisitor
override fun visitPackageParts(fqName: String, fileFacades: List<String>, multiFileClassParts: Map<String, String>) {
packageParts[fqName] = KmPackageParts(fileFacades.toMutableList(), multiFileClassParts.toMutableMap())
}
@DeprecatedVisitor
override fun visitAnnotation(annotation: KmAnnotation) {
annotations.add(annotation)
}
@DeprecatedVisitor
override fun visitOptionalAnnotationClass(): KmClass =
KmClass().also(optionalAnnotationClasses::add)
@@ -230,6 +243,7 @@ class KmModule : KmModuleVisitor() {
*
* @param visitor the visitor which will visit data in this module.
*/
@DeprecatedVisitor
fun accept(visitor: KmModuleVisitor) {
for ((fqName, parts) in packageParts) {
visitor.visitPackageParts(fqName, parts.fileFacades, parts.multiFileClassParts)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
@OptIn(DeprecatedVisitor::class)
internal class JvmMetadataExtensions : MetadataExtensions {
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) {
val ext = v.visitExtensions(JvmClassExtensionVisitor.TYPE) as? JvmClassExtensionVisitor ?: return
@@ -9,24 +9,31 @@ import kotlinx.metadata.*
import kotlinx.metadata.impl.extensions.*
import kotlinx.metadata.jvm.*
@OptIn(DeprecatedVisitor::class) // internal so OK
internal val KmClass.jvm: JvmClassExtension
get() = visitExtensions(JvmClassExtensionVisitor.TYPE) as JvmClassExtension
@OptIn(DeprecatedVisitor::class) // internal so OK
internal val KmPackage.jvm: JvmPackageExtension
get() = visitExtensions(JvmPackageExtensionVisitor.TYPE) as JvmPackageExtension
@OptIn(DeprecatedVisitor::class)
internal val KmFunction.jvm: JvmFunctionExtension
get() = visitExtensions(JvmFunctionExtensionVisitor.TYPE) as JvmFunctionExtension
@OptIn(DeprecatedVisitor::class)
internal val KmProperty.jvm: JvmPropertyExtension
get() = visitExtensions(JvmPropertyExtensionVisitor.TYPE) as JvmPropertyExtension
@OptIn(DeprecatedVisitor::class)
internal val KmConstructor.jvm: JvmConstructorExtension
get() = visitExtensions(JvmConstructorExtensionVisitor.TYPE) as JvmConstructorExtension
@OptIn(DeprecatedVisitor::class)
internal val KmTypeParameter.jvm: JvmTypeParameterExtension
get() = visitExtensions(JvmTypeParameterExtensionVisitor.TYPE) as JvmTypeParameterExtension
@OptIn(DeprecatedVisitor::class)
internal val KmType.jvm: JvmTypeExtension
get() = visitExtensions(JvmTypeExtensionVisitor.TYPE) as JvmTypeExtension
@@ -37,6 +44,7 @@ internal class JvmClassExtension : JvmClassExtensionVisitor(), KmClassExtension
var anonymousObjectOriginName: String? = null
var jvmFlags: Flags = 0
@OptIn(DeprecatedVisitor::class) // TODO
override fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).also { localDelegatedProperties.add(it) }
@@ -55,6 +63,7 @@ internal class JvmClassExtension : JvmClassExtensionVisitor(), KmClassExtension
override fun accept(visitor: KmClassExtensionVisitor) {
require(visitor is JvmClassExtensionVisitor)
localDelegatedProperties.forEach {
@OptIn(DeprecatedVisitor::class) // TODO
visitor.visitLocalDelegatedProperty(it.flags, it.name, it.getterFlags, it.setterFlags)?.let(it::accept)
}
moduleName?.let(visitor::visitModuleName)
@@ -64,6 +73,7 @@ internal class JvmClassExtension : JvmClassExtensionVisitor(), KmClassExtension
}
}
@OptIn(DeprecatedVisitor::class) // TODO
internal class JvmPackageExtension : JvmPackageExtensionVisitor(), KmPackageExtension {
val localDelegatedProperties: MutableList<KmProperty> = ArrayList(0)
var moduleName: String? = null
@@ -30,6 +30,7 @@ abstract class JvmDeclarationContainerExtensionVisitor @JvmOverloads constructor
* @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag
* and [Flag.PropertyAccessor] flags
*/
@OptIn(DeprecatedVisitor::class) // TODO
open fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? =
delegate?.visitLocalDelegatedProperty(flags, name, getterFlags, setterFlags)
@@ -15,6 +15,7 @@ import kotlin.coroutines.CoroutineContext
import kotlin.reflect.full.primaryConstructor
import kotlin.test.*
@OptIn(DeprecatedVisitor::class)
class MetadataSmokeTest {
private fun Class<*>.readMetadata(): KotlinClassHeader {
return getAnnotation(Metadata::class.java).run {
@@ -64,7 +65,7 @@ class MetadataSmokeTest {
}
}
val header = KotlinClassMetadata.Class.Writer().apply(klass::accept).write().header
val header = KotlinClassMetadata.writeClass(klass).header
// Then, produce the bytecode of a .class file with ASM
@@ -181,7 +182,7 @@ class MetadataSmokeTest {
classWithStableParameterNames.constructors.forEach { assertFalse(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
classWithStableParameterNames.functions.forEach { assertFalse(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
val newMetadata = KotlinClassMetadata.Class.Writer().let { writer ->
val newMetadata = KotlinClassMetadata.writeClass(
KmClass().apply {
classWithStableParameterNames.accept(
object : KmClassVisitor(this) {
@@ -192,9 +193,8 @@ class MetadataSmokeTest {
super.visitFunction(flags + flagsOf(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES), name)
}
)
}.accept(writer)
writer.write()
}
}
)
val classWithUnstableParameterNames = newMetadata.toKmClass()
@@ -203,15 +203,17 @@ class MetadataSmokeTest {
}
@Test
@Suppress("DEPRECATION_ERROR")
fun metadataVersionEarlierThan1_4() {
val dummy = (KotlinClassMetadata.read(MetadataSmokeTest::class.java.readMetadata()) as KotlinClassMetadata.Class).toKmClass()
val mv = intArrayOf(1, 3)
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.Class.Writer().write(mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.FileFacade.Writer().write(mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.MultiFileClassFacade.Writer().write(listOf("A"), mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.MultiFileClassPart.Writer().write("A", mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.SyntheticClass.Writer().write(mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.writeClass(dummy, mv) } // We can't write empty KmClass()
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.writeFileFacade(KmPackage(), mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.writeMultiFileClassFacade(listOf("A"), mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.writeMultiFileClassPart(KmPackage(), "A", mv) }
assertFailsWith<IllegalArgumentException> { KotlinClassMetadata.writeSyntheticClass(mv) }
KotlinModuleMetadata.Writer().write(mv)
KotlinModuleMetadata.write(KmModule(), mv)
}
@Test
@@ -229,9 +231,8 @@ class MetadataSmokeTest {
val kmClass = (KotlinClassMetadata.read(metadata) as KotlinClassMetadata.Class).toKmClass()
kmClass.jvmFlags = jvmClassFlags
val kmClassCopy = KotlinClassMetadata.Class.Writer()
.also { kmClass.accept(it) }
.write(metadata.metadataVersion, metadata.extraInt)
val kmClassCopy = KotlinClassMetadata
.writeClass(kmClass, metadata.metadataVersion, metadata.extraInt)
.toKmClass()
assertEquals(kmClassCopy.jvmFlags, jvmClassFlags)
}
@@ -0,0 +1,264 @@
public final class kotlinx/metadata/klib/ChunkedKlibModuleFragmentWriteStrategy : kotlinx/metadata/klib/KlibModuleFragmentWriteStrategy {
public fun <init> ()V
public fun <init> (II)V
public synthetic fun <init> (IIILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun processPackageParts (Ljava/util/List;)Ljava/util/List;
}
public abstract class kotlinx/metadata/klib/KlibClassExtensionVisitor : kotlinx/metadata/KmClassExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibClassExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitEnumEntry (Lkotlinx/metadata/klib/KlibEnumEntry;)V
public abstract fun visitFile (Lkotlinx/metadata/klib/KlibSourceFile;)V
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibClassExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract class kotlinx/metadata/klib/KlibConstructorExtensionVisitor : kotlinx/metadata/KmConstructorExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibConstructorExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibConstructorExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public final class kotlinx/metadata/klib/KlibEnumEntry {
public fun <init> (Ljava/lang/String;Lkotlinx/metadata/klib/UniqId;Ljava/lang/Integer;Ljava/util/List;)V
public synthetic fun <init> (Ljava/lang/String;Lkotlinx/metadata/klib/UniqId;Ljava/lang/Integer;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getAnnotations ()Ljava/util/List;
public final fun getName ()Ljava/lang/String;
public final fun getOrdinal ()Ljava/lang/Integer;
public final fun getUniqId ()Lkotlinx/metadata/klib/UniqId;
public final fun setOrdinal (Ljava/lang/Integer;)V
public final fun setUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibExtensionsKt {
public static final fun getAnnotations (Lkotlinx/metadata/KmClass;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmConstructor;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmFunction;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmProperty;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmType;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmTypeParameter;)Ljava/util/List;
public static final fun getAnnotations (Lkotlinx/metadata/KmValueParameter;)Ljava/util/List;
public static final fun getClassName (Lkotlinx/metadata/KmModuleFragment;)Ljava/util/List;
public static final fun getCompileTimeValue (Lkotlinx/metadata/KmProperty;)Lkotlinx/metadata/KmAnnotationArgument;
public static final fun getFile (Lkotlinx/metadata/KmClass;)Lkotlinx/metadata/klib/KlibSourceFile;
public static final fun getFile (Lkotlinx/metadata/KmFunction;)Lkotlinx/metadata/klib/KlibSourceFile;
public static final fun getFile (Lkotlinx/metadata/KmProperty;)Ljava/lang/Integer;
public static final fun getFqName (Lkotlinx/metadata/KmModuleFragment;)Ljava/lang/String;
public static final fun getFqName (Lkotlinx/metadata/KmPackage;)Ljava/lang/String;
public static final fun getGetterAnnotations (Lkotlinx/metadata/KmProperty;)Ljava/util/List;
public static final fun getKlibEnumEntries (Lkotlinx/metadata/KmClass;)Ljava/util/List;
public static final fun getModuleFragmentFiles (Lkotlinx/metadata/KmModuleFragment;)Ljava/util/List;
public static final fun getSetterAnnotations (Lkotlinx/metadata/KmProperty;)Ljava/util/List;
public static final fun getUniqId (Lkotlinx/metadata/KmClass;)Lkotlinx/metadata/klib/UniqId;
public static final fun getUniqId (Lkotlinx/metadata/KmConstructor;)Lkotlinx/metadata/klib/UniqId;
public static final fun getUniqId (Lkotlinx/metadata/KmFunction;)Lkotlinx/metadata/klib/UniqId;
public static final fun getUniqId (Lkotlinx/metadata/KmProperty;)Lkotlinx/metadata/klib/UniqId;
public static final fun getUniqId (Lkotlinx/metadata/KmTypeAlias;)Lkotlinx/metadata/klib/UniqId;
public static final fun getUniqId (Lkotlinx/metadata/KmTypeParameter;)Lkotlinx/metadata/klib/UniqId;
public static final fun setCompileTimeValue (Lkotlinx/metadata/KmProperty;Lkotlinx/metadata/KmAnnotationArgument;)V
public static final fun setFile (Lkotlinx/metadata/KmClass;Lkotlinx/metadata/klib/KlibSourceFile;)V
public static final fun setFile (Lkotlinx/metadata/KmFunction;Lkotlinx/metadata/klib/KlibSourceFile;)V
public static final fun setFile (Lkotlinx/metadata/KmProperty;Ljava/lang/Integer;)V
public static final fun setFqName (Lkotlinx/metadata/KmModuleFragment;Ljava/lang/String;)V
public static final fun setFqName (Lkotlinx/metadata/KmPackage;Ljava/lang/String;)V
public static final fun setUniqId (Lkotlinx/metadata/KmClass;Lkotlinx/metadata/klib/UniqId;)V
public static final fun setUniqId (Lkotlinx/metadata/KmConstructor;Lkotlinx/metadata/klib/UniqId;)V
public static final fun setUniqId (Lkotlinx/metadata/KmFunction;Lkotlinx/metadata/klib/UniqId;)V
public static final fun setUniqId (Lkotlinx/metadata/KmProperty;Lkotlinx/metadata/klib/UniqId;)V
public static final fun setUniqId (Lkotlinx/metadata/KmTypeAlias;Lkotlinx/metadata/klib/UniqId;)V
public static final fun setUniqId (Lkotlinx/metadata/KmTypeParameter;Lkotlinx/metadata/klib/UniqId;)V
}
public abstract class kotlinx/metadata/klib/KlibFunctionExtensionVisitor : kotlinx/metadata/KmFunctionExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibFunctionExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitFile (Lkotlinx/metadata/klib/KlibSourceFile;)V
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibFunctionExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public final class kotlinx/metadata/klib/KlibHeader {
public fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
public final fun getAnnotation ()Ljava/util/List;
public final fun getEmptyPackage ()Ljava/util/List;
public final fun getFile ()Ljava/util/List;
public final fun getModuleName ()Ljava/lang/String;
public final fun getPackageFragmentName ()Ljava/util/List;
}
public abstract class kotlinx/metadata/klib/KlibModuleFragmentExtensionVisitor : kotlinx/metadata/KmModuleFragmentExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibModuleFragmentExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitClassName (Ljava/lang/String;)V
public abstract fun visitFile (Lkotlinx/metadata/klib/KlibSourceFile;)V
public abstract fun visitFqName (Ljava/lang/String;)V
}
public final class kotlinx/metadata/klib/KlibModuleFragmentExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract interface class kotlinx/metadata/klib/KlibModuleFragmentReadStrategy {
public static final field Companion Lkotlinx/metadata/klib/KlibModuleFragmentReadStrategy$Companion;
public abstract fun processModuleParts (Ljava/util/List;)Ljava/util/List;
}
public final class kotlinx/metadata/klib/KlibModuleFragmentReadStrategy$Companion {
public final fun getDEFAULT ()Lkotlinx/metadata/klib/KlibModuleFragmentReadStrategy;
}
public abstract interface class kotlinx/metadata/klib/KlibModuleFragmentWriteStrategy {
public static final field Companion Lkotlinx/metadata/klib/KlibModuleFragmentWriteStrategy$Companion;
public abstract fun processPackageParts (Ljava/util/List;)Ljava/util/List;
}
public final class kotlinx/metadata/klib/KlibModuleFragmentWriteStrategy$Companion {
public final fun getDEFAULT ()Lkotlinx/metadata/klib/KlibModuleFragmentWriteStrategy;
}
public final class kotlinx/metadata/klib/KlibModuleMetadata {
public static final field Companion Lkotlinx/metadata/klib/KlibModuleMetadata$Companion;
public fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
public final fun getAnnotations ()Ljava/util/List;
public final fun getFragments ()Ljava/util/List;
public final fun getName ()Ljava/lang/String;
public final fun write (Lkotlinx/metadata/klib/KlibModuleFragmentWriteStrategy;)Lkotlinx/metadata/klib/KlibModuleMetadata$SerializedKlibMetadata;
public static synthetic fun write$default (Lkotlinx/metadata/klib/KlibModuleMetadata;Lkotlinx/metadata/klib/KlibModuleFragmentWriteStrategy;ILjava/lang/Object;)Lkotlinx/metadata/klib/KlibModuleMetadata$SerializedKlibMetadata;
}
public final class kotlinx/metadata/klib/KlibModuleMetadata$Companion {
public final fun read (Lkotlinx/metadata/klib/KlibModuleMetadata$MetadataLibraryProvider;Lkotlinx/metadata/klib/KlibModuleFragmentReadStrategy;)Lkotlinx/metadata/klib/KlibModuleMetadata;
public static synthetic fun read$default (Lkotlinx/metadata/klib/KlibModuleMetadata$Companion;Lkotlinx/metadata/klib/KlibModuleMetadata$MetadataLibraryProvider;Lkotlinx/metadata/klib/KlibModuleFragmentReadStrategy;ILjava/lang/Object;)Lkotlinx/metadata/klib/KlibModuleMetadata;
}
public abstract interface class kotlinx/metadata/klib/KlibModuleMetadata$MetadataLibraryProvider {
public abstract fun getModuleHeaderData ()[B
public abstract fun packageMetadata (Ljava/lang/String;Ljava/lang/String;)[B
public abstract fun packageMetadataParts (Ljava/lang/String;)Ljava/util/Set;
}
public final class kotlinx/metadata/klib/KlibModuleMetadata$SerializedKlibMetadata {
public fun <init> ([BLjava/util/List;Ljava/util/List;)V
public final fun getFragmentNames ()Ljava/util/List;
public final fun getFragments ()Ljava/util/List;
public final fun getHeader ()[B
}
public abstract class kotlinx/metadata/klib/KlibPackageExtensionVisitor : kotlinx/metadata/KmPackageExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibPackageExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitFqName (Ljava/lang/String;)V
}
public final class kotlinx/metadata/klib/KlibPackageExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract class kotlinx/metadata/klib/KlibPropertyExtensionVisitor : kotlinx/metadata/KmPropertyExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibPropertyExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitCompileTimeValue (Lkotlinx/metadata/KmAnnotationArgument;)V
public abstract fun visitFile (I)V
public abstract fun visitGetterAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitSetterAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibPropertyExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public final class kotlinx/metadata/klib/KlibSourceFile {
public fun <init> (Ljava/lang/String;)V
public final fun getName ()Ljava/lang/String;
}
public abstract class kotlinx/metadata/klib/KlibTypeAliasExtensionVisitor : kotlinx/metadata/KmTypeAliasExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibTypeAliasExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibTypeAliasExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract class kotlinx/metadata/klib/KlibTypeExtensionVisitor : kotlinx/metadata/KmTypeExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibTypeExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
}
public final class kotlinx/metadata/klib/KlibTypeExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract class kotlinx/metadata/klib/KlibTypeParameterExtensionVisitor : kotlinx/metadata/KmTypeParameterExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibTypeParameterExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
public abstract fun visitUniqId (Lkotlinx/metadata/klib/UniqId;)V
}
public final class kotlinx/metadata/klib/KlibTypeParameterExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public abstract class kotlinx/metadata/klib/KlibValueParameterExtensionVisitor : kotlinx/metadata/KmValueParameterExtensionVisitor {
public static final field Companion Lkotlinx/metadata/klib/KlibValueParameterExtensionVisitor$Companion;
public fun <init> ()V
public fun getType ()Lkotlinx/metadata/KmExtensionType;
public abstract fun visitAnnotation (Lkotlinx/metadata/KmAnnotation;)V
}
public final class kotlinx/metadata/klib/KlibValueParameterExtensionVisitor$Companion {
public final fun getTYPE ()Lkotlinx/metadata/KmExtensionType;
}
public final class kotlinx/metadata/klib/UniqId {
public fun <init> (J)V
public final fun getIndex ()J
}
public final class kotlinx/metadata/klib/impl/KlibModuleFragmentWriter : kotlinx/metadata/impl/ModuleFragmentWriter {
public fun <init> (Lorg/jetbrains/kotlin/serialization/ApproximatingStringTable;Ljava/util/List;)V
public synthetic fun <init> (Lorg/jetbrains/kotlin/serialization/ApproximatingStringTable;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun visitEnd ()V
public final fun write ()Lorg/jetbrains/kotlin/metadata/ProtoBuf$PackageFragment;
}
public final class kotlinx/metadata/klib/impl/ReverseSourceFileIndexWriteExtension : kotlinx/metadata/impl/WriteContextExtension {
public fun <init> ()V
public final fun getFileIndex ()Ljava/util/List;
public final fun getIndexOf (Lkotlinx/metadata/klib/KlibSourceFile;)I
}
public final class kotlinx/metadata/klib/impl/SourceFileIndexReadExtension : kotlinx/metadata/impl/ReadContextExtension {
public fun <init> (Ljava/util/List;)V
public final fun getSourceFile (I)Lkotlinx/metadata/klib/KlibSourceFile;
}
@@ -5,6 +5,7 @@
package kotlinx.metadata.klib
import kotlinx.metadata.DeprecatedVisitor
import kotlinx.metadata.KmAnnotation
import kotlinx.metadata.KmModuleFragment
import kotlinx.metadata.impl.WriteContext
@@ -78,6 +79,7 @@ class KlibModuleMetadata(
* Deserializes metadata from the given [library].
* @param readStrategy specifies the way module fragments of a single package are modified (e.g. merged) after deserialization.
*/
@OptIn(DeprecatedVisitor::class)
fun read(
library: MetadataLibraryProvider,
readStrategy: KlibModuleFragmentReadStrategy = KlibModuleFragmentReadStrategy.DEFAULT
@@ -101,6 +103,7 @@ class KlibModuleMetadata(
* Writes metadata back to serialized representation.
* @param writeStrategy specifies the way module fragments are modified (e.g. split) before serialization.
*/
@OptIn(DeprecatedVisitor::class)
fun write(
writeStrategy: KlibModuleFragmentWriteStrategy = KlibModuleFragmentWriteStrategy.DEFAULT
): SerializedKlibMetadata {
@@ -9,33 +9,43 @@ import kotlinx.metadata.*
import kotlinx.metadata.impl.extensions.*
import kotlinx.metadata.klib.*
@OptIn(DeprecatedVisitor::class)
internal val KmFunction.klibExtensions: KlibFunctionExtension
get() = visitExtensions(KlibFunctionExtensionVisitor.TYPE) as KlibFunctionExtension
@OptIn(DeprecatedVisitor::class)
internal val KmClass.klibExtensions: KlibClassExtension
get() = visitExtensions(KlibClassExtensionVisitor.TYPE) as KlibClassExtension
@OptIn(DeprecatedVisitor::class)
internal val KmType.klibExtensions: KlibTypeExtension
get() = visitExtensions(KlibTypeExtensionVisitor.TYPE) as KlibTypeExtension
@OptIn(DeprecatedVisitor::class)
internal val KmProperty.klibExtensions: KlibPropertyExtension
get() = visitExtensions(KlibPropertyExtensionVisitor.TYPE) as KlibPropertyExtension
@OptIn(DeprecatedVisitor::class)
internal val KmConstructor.klibExtensions: KlibConstructorExtension
get() = visitExtensions(KlibConstructorExtensionVisitor.TYPE) as KlibConstructorExtension
@OptIn(DeprecatedVisitor::class)
internal val KmTypeParameter.klibExtensions: KlibTypeParameterExtension
get() = visitExtensions(KlibTypeParameterExtensionVisitor.TYPE) as KlibTypeParameterExtension
@OptIn(DeprecatedVisitor::class)
internal val KmPackage.klibExtensions: KlibPackageExtension
get() = visitExtensions(KlibPackageExtensionVisitor.TYPE) as KlibPackageExtension
@OptIn(DeprecatedVisitor::class)
internal val KmModuleFragment.klibExtensions: KlibModuleFragmentExtension
get() = visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as KlibModuleFragmentExtension
@OptIn(DeprecatedVisitor::class)
internal val KmTypeAlias.klibExtensions: KlibTypeAliasExtension
get() = visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as KlibTypeAliasExtension
@OptIn(DeprecatedVisitor::class)
internal val KmValueParameter.klibExtensions: KlibValueParameterExtension
get() = visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as KlibValueParameterExtension
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.StringTableImpl
@OptIn(DeprecatedVisitor::class) // TODO
internal class KlibMetadataExtensions : MetadataExtensions {
private fun ReadContext.getSourceFile(index: Int) =
@@ -5,6 +5,7 @@
package kotlinx.metadata.klib.impl
import kotlinx.metadata.DeprecatedVisitor
import kotlinx.metadata.impl.*
import kotlinx.metadata.klib.KlibSourceFile
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf
@@ -25,6 +26,7 @@ class ReverseSourceFileIndexWriteExtension : WriteContextExtension {
}
}
@DeprecatedVisitor
class KlibModuleFragmentWriter(
stringTable: ApproximatingStringTable,
contextExtensions: List<WriteContextExtension> = emptyList()
@@ -16,8 +16,7 @@ package kotlinx.metadata
* If this name starts with '.', it represents a local class or an anonymous object. This is used by the Kotlin compiler
* to prevent lookup of this name in the resolution.
*/
// TODO: use inline class in 1.3
typealias ClassName = String
typealias ClassName = String // Not a value class because of Java usages
val ClassName.isLocal: Boolean
get() = this.startsWith(".")
@@ -43,17 +43,12 @@ sealed class KmAnnotationArgument {
data class DoubleValue(override val value: Double) : LiteralValue<Double>()
data class BooleanValue(override val value: Boolean) : LiteralValue<Boolean>()
// TODO: remove @ExperimentalUnsignedTypes once bootstrap stdlib has stable unsigned types.
@ExperimentalUnsignedTypes
data class UByteValue(override val value: UByte) : LiteralValue<UByte>()
@ExperimentalUnsignedTypes
data class UShortValue(override val value: UShort) : LiteralValue<UShort>()
@ExperimentalUnsignedTypes
data class UIntValue(override val value: UInt) : LiteralValue<UInt>()
@ExperimentalUnsignedTypes
data class ULongValue(override val value: ULong) : LiteralValue<ULong>()
data class StringValue(override val value: String) : LiteralValue<String>()
@@ -11,6 +11,7 @@ import kotlinx.metadata.impl.WriteContext
import org.jetbrains.kotlin.metadata.ProtoBuf
import java.util.*
@OptIn(DeprecatedVisitor::class) // TODO: all this should be refactored to entities, not visitors
interface MetadataExtensions {
fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext)
@@ -23,7 +23,6 @@ fun ProtoBuf.Annotation.readAnnotation(strings: NameResolver): KmAnnotation =
}.toMap()
)
@OptIn(ExperimentalUnsignedTypes::class)
fun ProtoBuf.Annotation.Argument.Value.readAnnotationArgument(strings: NameResolver): KmAnnotationArgument? {
if (Flags.IS_UNSIGNED[flags]) {
return when (type) {
@@ -10,6 +10,7 @@ import kotlinx.metadata.Flags // Don't remove this import. See KT-45553
import kotlinx.metadata.impl.extensions.MetadataExtensions
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.*
import kotlin.contracts.ExperimentalContracts
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
/**
@@ -46,7 +47,7 @@ class ReadContext(
}
}
@OptIn(ExperimentalContextReceivers::class)
@OptIn(DeprecatedVisitor::class, ExperimentalContextReceivers::class) // TODO
fun ProtoBuf.Class.accept(
v: KmClassVisitor,
strings: NameResolver,
@@ -128,6 +129,7 @@ private fun ProtoBuf.Class.loadInlineClassUnderlyingType(c: ReadContext): ProtoB
?.returnType(c.types)
}
@OptIn(DeprecatedVisitor::class) // TODO
fun ProtoBuf.Package.accept(
v: KmPackageVisitor,
strings: NameResolver,
@@ -149,6 +151,7 @@ fun ProtoBuf.Package.accept(
v.visitEnd()
}
@OptIn(DeprecatedVisitor::class) // TODO
fun ProtoBuf.PackageFragment.accept(
v: KmModuleFragmentVisitor,
strings: NameResolver,
@@ -174,6 +177,7 @@ fun ProtoBuf.PackageFragment.accept(
v.visitEnd()
}
@OptIn(DeprecatedVisitor::class) // TODO
private fun KmDeclarationContainerVisitor.visitDeclarations(
functions: List<ProtoBuf.Function>,
properties: List<ProtoBuf.Property>,
@@ -195,6 +199,7 @@ private fun KmDeclarationContainerVisitor.visitDeclarations(
}
}
@OptIn(DeprecatedVisitor::class)
fun ProtoBuf.Function.accept(v: KmLambdaVisitor, strings: NameResolver) {
val c = ReadContext(strings, TypeTable(typeTable), VersionRequirementTable.EMPTY)
@@ -203,6 +208,7 @@ fun ProtoBuf.Function.accept(v: KmLambdaVisitor, strings: NameResolver) {
v.visitEnd()
}
@DeprecatedVisitor
private fun ProtoBuf.Constructor.accept(v: KmConstructorVisitor, c: ReadContext) {
for (parameter in valueParameterList) {
v.visitValueParameter(parameter.flags, c[parameter.name])?.let { parameter.accept(it, c) }
@@ -219,7 +225,7 @@ private fun ProtoBuf.Constructor.accept(v: KmConstructorVisitor, c: ReadContext)
v.visitEnd()
}
@OptIn(ExperimentalContextReceivers::class)
@OptIn(DeprecatedVisitor::class, ExperimentalContextReceivers::class)
private fun ProtoBuf.Function.accept(v: KmFunctionVisitor, outer: ReadContext) {
val c = outer.withTypeParameters(typeParameterList)
@@ -244,7 +250,7 @@ private fun ProtoBuf.Function.accept(v: KmFunctionVisitor, outer: ReadContext) {
}
if (hasContract()) {
v.visitContract()?.let { contract.accept(it, c) }
@OptIn(ExperimentalContracts::class) v.visitContract()?.let { contract.accept(it, c) }
}
for (versionRequirement in versionRequirementList) {
@@ -259,6 +265,7 @@ private fun ProtoBuf.Function.accept(v: KmFunctionVisitor, outer: ReadContext) {
}
@OptIn(ExperimentalContextReceivers::class)
@DeprecatedVisitor
fun ProtoBuf.Property.accept(v: KmPropertyVisitor, outer: ReadContext) {
val c = outer.withTypeParameters(typeParameterList)
@@ -294,6 +301,7 @@ fun ProtoBuf.Property.accept(v: KmPropertyVisitor, outer: ReadContext) {
v.visitEnd()
}
@DeprecatedVisitor
private fun ProtoBuf.TypeAlias.accept(v: KmTypeAliasVisitor, outer: ReadContext) {
val c = outer.withTypeParameters(typeParameterList)
@@ -324,6 +332,7 @@ private fun ProtoBuf.TypeAlias.accept(v: KmTypeAliasVisitor, outer: ReadContext)
v.visitEnd()
}
@DeprecatedVisitor
private fun ProtoBuf.ValueParameter.accept(v: KmValueParameterVisitor, c: ReadContext) {
type(c.types).let { type ->
v.visitType(type.typeFlags)?.let { type.accept(it, c) }
@@ -339,7 +348,7 @@ private fun ProtoBuf.ValueParameter.accept(v: KmValueParameterVisitor, c: ReadCo
v.visitEnd()
}
@DeprecatedVisitor
private inline fun ProtoBuf.TypeParameter.accept(
visit: (flags: Flags, name: String, id: Int, variance: KmVariance) -> KmTypeParameterVisitor?,
c: ReadContext
@@ -353,6 +362,7 @@ private inline fun ProtoBuf.TypeParameter.accept(
visit(typeParameterFlags, c[name], id, variance)?.let { accept(it, c) }
}
@DeprecatedVisitor
private fun ProtoBuf.TypeParameter.accept(v: KmTypeParameterVisitor, c: ReadContext) {
for (upperBound in upperBounds(c.types)) {
v.visitUpperBound(upperBound.typeFlags)?.let { upperBound.accept(it, c) }
@@ -365,6 +375,7 @@ private fun ProtoBuf.TypeParameter.accept(v: KmTypeParameterVisitor, c: ReadCont
v.visitEnd()
}
@DeprecatedVisitor
private fun ProtoBuf.Type.accept(v: KmTypeVisitor, c: ReadContext) {
when {
hasClassName() -> v.visitClass(c.className(className))
@@ -419,6 +430,7 @@ private fun ProtoBuf.Type.accept(v: KmTypeVisitor, c: ReadContext) {
v.visitEnd()
}
@DeprecatedVisitor
private fun acceptVersionRequirementVisitor(id: Int, v: KmVersionRequirementVisitor, c: ReadContext) {
val message = VersionRequirement.create(id, c.strings, c.versionRequirements)
?: throw InconsistentKotlinMetadataException("No VersionRequirement with the given id in the table")
@@ -443,6 +455,8 @@ private fun acceptVersionRequirementVisitor(id: Int, v: KmVersionRequirementVisi
v.visitEnd()
}
@DeprecatedVisitor
@ExperimentalContracts
private fun ProtoBuf.Contract.accept(v: KmContractVisitor, c: ReadContext) {
for (effect in effectList) {
if (!effect.hasEffectType()) continue
@@ -465,6 +479,8 @@ private fun ProtoBuf.Contract.accept(v: KmContractVisitor, c: ReadContext) {
v.visitEnd()
}
@DeprecatedVisitor
@ExperimentalContracts
private fun ProtoBuf.Effect.accept(v: KmEffectVisitor, c: ReadContext) {
for (constructorArgument in effectConstructorArgumentList) {
v.visitConstructorArgument()?.let { constructorArgument.accept(it, c) }
@@ -477,6 +493,8 @@ private fun ProtoBuf.Effect.accept(v: KmEffectVisitor, c: ReadContext) {
v.visitEnd()
}
@DeprecatedVisitor
@ExperimentalContracts
private fun ProtoBuf.Expression.accept(v: KmEffectExpressionVisitor, c: ReadContext) {
v.visit(
flags,
@@ -24,7 +24,6 @@ fun KmAnnotation.writeAnnotation(strings: StringTable): ProtoBuf.Annotation.Buil
}
}
@OptIn(ExperimentalUnsignedTypes::class)
fun KmAnnotationArgument.writeAnnotationArgument(strings: StringTable): ProtoBuf.Annotation.Argument.Value.Builder =
ProtoBuf.Annotation.Argument.Value.newBuilder().apply {
when (this@writeAnnotationArgument) {
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
import org.jetbrains.kotlin.metadata.serialization.StringTable
import kotlin.contracts.ExperimentalContracts
/**
* Allows to populate [WriteContext] with additional data
@@ -29,6 +30,7 @@ open class WriteContext(val strings: StringTable, val contextExtensions: List<Wr
strings.getClassNameIndex(name)
}
@DeprecatedVisitor
private fun writeTypeParameter(
c: WriteContext, flags: Flags, name: String, id: Int, variance: KmVariance,
output: (ProtoBuf.TypeParameter.Builder) -> Unit
@@ -60,6 +62,7 @@ private fun writeTypeParameter(
}
}
@DeprecatedVisitor
private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Builder) -> Unit): KmTypeVisitor =
object : KmTypeVisitor() {
private val t = ProtoBuf.Type.newBuilder()
@@ -125,6 +128,7 @@ private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Buil
}
}
@DeprecatedVisitor
private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Constructor.Builder) -> Unit): KmConstructorVisitor =
object : KmConstructorVisitor() {
val t = ProtoBuf.Constructor.newBuilder()
@@ -148,6 +152,7 @@ private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Co
}
}
@DeprecatedVisitor
private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (ProtoBuf.Function.Builder) -> Unit): KmFunctionVisitor =
object : KmFunctionVisitor() {
val t = ProtoBuf.Function.newBuilder()
@@ -171,6 +176,7 @@ private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (
override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
writeVersionRequirement(c) { t.addVersionRequirement(it) }
@OptIn(ExperimentalContracts::class)
override fun visitContract(): KmContractVisitor? =
writeContract(c) { t.contract = it.build() }
@@ -188,6 +194,7 @@ private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (
}
}
@DeprecatedVisitor
fun writeProperty(
c: WriteContext, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags, output: (ProtoBuf.Property.Builder) -> Unit
): KmPropertyVisitor = object : KmPropertyVisitor() {
@@ -229,6 +236,7 @@ fun writeProperty(
}
}
@DeprecatedVisitor
private fun writeValueParameter(
c: WriteContext, flags: Flags, name: String,
output: (ProtoBuf.ValueParameter.Builder) -> Unit
@@ -255,6 +263,7 @@ private fun writeValueParameter(
}
}
@DeprecatedVisitor
private fun writeTypeAlias(
c: WriteContext, flags: Flags, name: String,
output: (ProtoBuf.TypeAlias.Builder) -> Unit
@@ -291,6 +300,7 @@ private fun writeTypeAlias(
}
}
@DeprecatedVisitor
private fun writeVersionRequirement(
c: WriteContext, output: (Int) -> Unit
): KmVersionRequirementVisitor = object : KmVersionRequirementVisitor() {
@@ -341,6 +351,8 @@ private fun writeVersionRequirement(
}
}
@DeprecatedVisitor
@ExperimentalContracts
private fun writeContract(c: WriteContext, output: (ProtoBuf.Contract.Builder) -> Unit): KmContractVisitor =
object : KmContractVisitor() {
val t = ProtoBuf.Contract.newBuilder()
@@ -353,6 +365,8 @@ private fun writeContract(c: WriteContext, output: (ProtoBuf.Contract.Builder) -
}
}
@DeprecatedVisitor
@ExperimentalContracts
private fun writeEffect(
c: WriteContext, type: KmEffectType, invocationKind: KmEffectInvocationKind?,
output: (ProtoBuf.Effect.Builder) -> Unit
@@ -382,6 +396,8 @@ private fun writeEffect(
}
}
@DeprecatedVisitor
@ExperimentalContracts
private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression.Builder) -> Unit): KmEffectExpressionVisitor =
object : KmEffectExpressionVisitor() {
val t = ProtoBuf.Expression.newBuilder()
@@ -418,6 +434,7 @@ private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression.
}
}
@DeprecatedVisitor // TODO: this likely need to be rewritten directly or deprecated completely
open class ClassWriter(stringTable: StringTable, contextExtensions: List<WriteContextExtension> = emptyList()) : KmClassVisitor() {
protected val t = ProtoBuf.Class.newBuilder()!!
protected val c: WriteContext = WriteContext(stringTable, contextExtensions)
@@ -491,6 +508,7 @@ open class ClassWriter(stringTable: StringTable, contextExtensions: List<WriteCo
}
}
@DeprecatedVisitor // TODO: this likely need to be rewritten directly
open class PackageWriter(stringTable: StringTable, contextExtensions: List<WriteContextExtension> = emptyList()) : KmPackageVisitor() {
protected val t = ProtoBuf.Package.newBuilder()!!
protected val c: WriteContext = WriteContext(stringTable, contextExtensions)
@@ -516,6 +534,7 @@ open class PackageWriter(stringTable: StringTable, contextExtensions: List<Write
}
}
@DeprecatedVisitor // TODO: this likely need to be rewritten directly
open class ModuleFragmentWriter(stringTable: StringTable, contextExtensions: List<WriteContextExtension> = emptyList()) :
KmModuleFragmentVisitor() {
protected val t = ProtoBuf.PackageFragment.newBuilder()!!
@@ -541,6 +560,7 @@ open class ModuleFragmentWriter(stringTable: StringTable, contextExtensions: Lis
}
}
@DeprecatedVisitor
open class LambdaWriter(stringTable: StringTable) : KmLambdaVisitor() {
protected var t: ProtoBuf.Function.Builder? = null
protected val c = WriteContext(stringTable)
@@ -5,6 +5,7 @@
package kotlinx.metadata.internal.common
import kotlinx.metadata.DeprecatedVisitor
import kotlinx.metadata.KmModuleFragment
import kotlinx.metadata.KmModuleFragmentVisitor
import kotlinx.metadata.impl.accept
@@ -13,6 +14,7 @@ import org.jetbrains.kotlin.metadata.builtins.readBuiltinsPackageFragment
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
import java.io.ByteArrayInputStream
@DeprecatedVisitor
class KotlinCommonMetadata private constructor(private val proto: ProtoBuf.PackageFragment) {
fun toKmModuleFragment(): KmModuleFragment =
KmModuleFragment().apply(this::accept)
@@ -8,6 +8,7 @@
package kotlinx.metadata
import kotlinx.metadata.impl.extensions.*
import kotlin.contracts.ExperimentalContracts
/**
* Represents a Kotlin declaration container, such as a class or a package fragment.
@@ -32,6 +33,7 @@ interface KmDeclarationContainer {
/**
* Represents a Kotlin class.
*/
@OptIn(DeprecatedVisitor::class)
class KmClass : KmClassVisitor(), KmDeclarationContainer {
/**
* Class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags.
@@ -117,59 +119,75 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
private val extensions: List<KmClassExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createClassExtension)
@DeprecatedVisitor
override fun visit(flags: Flags, name: ClassName) {
this.flags = flags
this.name = name
}
@DeprecatedVisitor
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@DeprecatedVisitor
override fun visitSupertype(flags: Flags): KmTypeVisitor =
KmType(flags).addTo(supertypes)
@DeprecatedVisitor
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor =
KmFunction(flags, name).addTo(functions)
@DeprecatedVisitor
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).addTo(properties)
@DeprecatedVisitor
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor =
KmTypeAlias(flags, name).addTo(typeAliases)
@DeprecatedVisitor
override fun visitConstructor(flags: Flags): KmConstructorVisitor =
KmConstructor(flags).addTo(constructors)
@DeprecatedVisitor
override fun visitCompanionObject(name: String) {
this.companionObject = name
}
@DeprecatedVisitor
override fun visitNestedClass(name: String) {
nestedClasses.add(name)
}
@DeprecatedVisitor
override fun visitEnumEntry(name: String) {
enumEntries.add(name)
}
@DeprecatedVisitor
override fun visitSealedSubclass(name: ClassName) {
sealedSubclasses.add(name)
}
@DeprecatedVisitor
override fun visitInlineClassUnderlyingPropertyName(name: String) {
inlineClassUnderlyingPropertyName = name
}
@DeprecatedVisitor
override fun visitInlineClassUnderlyingType(flags: Flags): KmTypeVisitor =
KmType(flags).also { inlineClassUnderlyingType = it }
@DeprecatedVisitor
@ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes)
@DeprecatedVisitor
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmClassExtensionVisitor =
extensions.singleOfType(type)
@@ -178,6 +196,7 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
*
* @param visitor the visitor which will visit data in this class
*/
@DeprecatedVisitor
@OptIn(ExperimentalContextReceivers::class)
fun accept(visitor: KmClassVisitor) {
visitor.visit(flags, name)
@@ -203,6 +222,7 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
/**
* Represents a Kotlin package fragment, including single file facades and multi-file class parts.
*/
@OptIn(DeprecatedVisitor::class) // TODO
class KmPackage : KmPackageVisitor(), KmDeclarationContainer {
/**
* Functions in the package fragment.
@@ -222,15 +242,19 @@ class KmPackage : KmPackageVisitor(), KmDeclarationContainer {
private val extensions: List<KmPackageExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createPackageExtension)
@DeprecatedVisitor
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor =
KmFunction(flags, name).addTo(functions)
@DeprecatedVisitor
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).addTo(properties)
@DeprecatedVisitor
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor =
KmTypeAlias(flags, name).addTo(typeAliases)
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmPackageExtensionVisitor =
extensions.singleOfType(type)
@@ -239,6 +263,7 @@ class KmPackage : KmPackageVisitor(), KmDeclarationContainer {
*
* @param visitor the visitor which will visit data in this package fragment
*/
@DeprecatedVisitor
fun accept(visitor: KmPackageVisitor) {
functions.forEach { visitor.visitFunction(it.flags, it.name)?.let(it::accept) }
properties.forEach { visitor.visitProperty(it.flags, it.name, it.getterFlags, it.setterFlags)?.let(it::accept) }
@@ -251,6 +276,7 @@ class KmPackage : KmPackageVisitor(), KmDeclarationContainer {
/**
* Represents a Kotlin module fragment. This is used to represent metadata of a part of a module on platforms other than JVM.
*/
@OptIn(DeprecatedVisitor::class) // TODO
class KmModuleFragment : KmModuleFragmentVisitor() {
/**
@@ -266,12 +292,15 @@ class KmModuleFragment : KmModuleFragmentVisitor() {
private val extensions: List<KmModuleFragmentExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createModuleFragmentExtensions)
@DeprecatedVisitor
override fun visitPackage(): KmPackageVisitor? =
KmPackage().also { pkg = it }
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmModuleFragmentExtensionVisitor? =
extensions.singleOfType(type)
@DeprecatedVisitor
override fun visitClass(): KmClassVisitor? =
KmClass().addTo(classes)
@@ -280,6 +309,7 @@ class KmModuleFragment : KmModuleFragmentVisitor() {
*
* @param visitor the visitor which will visit data in the module fragment.
*/
@DeprecatedVisitor
fun accept(visitor: KmModuleFragmentVisitor) {
pkg?.let { visitor.visitPackage()?.let(it::accept) }
classes.forEach { visitor.visitClass()?.let(it::accept) }
@@ -291,12 +321,14 @@ class KmModuleFragment : KmModuleFragmentVisitor() {
/**
* Represents a synthetic class generated for a Kotlin lambda.
*/
@OptIn(DeprecatedVisitor::class)
class KmLambda : KmLambdaVisitor() {
/**
* Signature of the synthetic anonymous function, representing the lambda.
*/
lateinit var function: KmFunction
@DeprecatedVisitor
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor =
KmFunction(flags, name).also { function = it }
@@ -305,6 +337,7 @@ class KmLambda : KmLambdaVisitor() {
*
* @param visitor the visitor which will visit data in this lambda
*/
@DeprecatedVisitor
fun accept(visitor: KmLambdaVisitor) {
visitor.visitFunction(function.flags, function.name)?.let(function::accept)
visitor.visitEnd()
@@ -316,6 +349,7 @@ class KmLambda : KmLambdaVisitor() {
*
* @property flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag and [Flag.Constructor] flags
*/
@OptIn(DeprecatedVisitor::class)
class KmConstructor(var flags: Flags) : KmConstructorVisitor() {
/**
* Value parameters of the constructor.
@@ -330,12 +364,15 @@ class KmConstructor(var flags: Flags) : KmConstructorVisitor() {
private val extensions: List<KmConstructorExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createConstructorExtension)
@DeprecatedVisitor
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).addTo(valueParameters)
@DeprecatedVisitor
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor =
extensions.singleOfType(type)
@@ -344,6 +381,7 @@ class KmConstructor(var flags: Flags) : KmConstructorVisitor() {
*
* @param visitor the visitor which will visit data in this class
*/
@DeprecatedVisitor
fun accept(visitor: KmConstructorVisitor) {
valueParameters.forEach { visitor.visitValueParameter(it.flags, it.name)?.let(it::accept) }
versionRequirements.forEach { visitor.visitVersionRequirement()?.let(it::accept) }
@@ -358,6 +396,7 @@ class KmConstructor(var flags: Flags) : KmConstructorVisitor() {
* @property flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags
* @property name the name of the function
*/
@OptIn(DeprecatedVisitor::class)
class KmFunction(
var flags: Flags,
var name: String
@@ -396,33 +435,43 @@ class KmFunction(
/**
* Contract of the function.
*/
@ExperimentalContracts
var contract: KmContract? = null
private val extensions: List<KmFunctionExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createFunctionExtension)
@DeprecatedVisitor
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@DeprecatedVisitor
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor =
KmType(flags).also { receiverParameterType = it }
@DeprecatedVisitor
@ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes)
@DeprecatedVisitor
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).addTo(valueParameters)
@DeprecatedVisitor
override fun visitReturnType(flags: Flags): KmTypeVisitor =
KmType(flags).also { returnType = it }
@DeprecatedVisitor
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@DeprecatedVisitor
@ExperimentalContracts
override fun visitContract(): KmContractVisitor =
KmContract().also { contract = it }
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor =
extensions.singleOfType(type)
@@ -432,6 +481,7 @@ class KmFunction(
* @param visitor the visitor which will visit data in this function
*/
@OptIn(ExperimentalContextReceivers::class)
@DeprecatedVisitor
fun accept(visitor: KmFunctionVisitor) {
typeParameters.forEach { visitor.visitTypeParameter(it.flags, it.name, it.id, it.variance)?.let(it::accept) }
receiverParameterType?.let { visitor.visitReceiverParameterType(it.flags)?.let(it::accept) }
@@ -439,7 +489,7 @@ class KmFunction(
valueParameters.forEach { visitor.visitValueParameter(it.flags, it.name)?.let(it::accept) }
visitor.visitReturnType(returnType.flags)?.let(returnType::accept)
versionRequirements.forEach { visitor.visitVersionRequirement()?.let(it::accept) }
contract?.let { visitor.visitContract()?.let(it::accept) }
@OptIn(ExperimentalContracts::class) contract?.let { visitor.visitContract()?.let(it::accept) }
extensions.forEach { visitor.visitExtensions(it.type)?.let(it::accept) }
visitor.visitEnd()
}
@@ -455,6 +505,7 @@ class KmFunction(
* @property setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag
* and [Flag.PropertyAccessor] flags
*/
@OptIn(DeprecatedVisitor::class)
class KmProperty(
var flags: Flags,
var name: String,
@@ -495,25 +546,32 @@ class KmProperty(
private val extensions: List<KmPropertyExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createPropertyExtension)
@DeprecatedVisitor
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@DeprecatedVisitor
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor =
KmType(flags).also { receiverParameterType = it }
@DeprecatedVisitor
@ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes)
@DeprecatedVisitor
override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).also { setterParameter = it }
@DeprecatedVisitor
override fun visitReturnType(flags: Flags): KmTypeVisitor =
KmType(flags).also { returnType = it }
@DeprecatedVisitor
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor =
extensions.singleOfType(type)
@@ -523,6 +581,7 @@ class KmProperty(
* @param visitor the visitor which will visit data in this property
*/
@OptIn(ExperimentalContextReceivers::class)
@DeprecatedVisitor
fun accept(visitor: KmPropertyVisitor) {
typeParameters.forEach { visitor.visitTypeParameter(it.flags, it.name, it.id, it.variance)?.let(it::accept) }
receiverParameterType?.let { visitor.visitReceiverParameterType(it.flags)?.let(it::accept) }
@@ -541,6 +600,7 @@ class KmProperty(
* @property flags type alias flags, consisting of [Flag.HAS_ANNOTATIONS] and visibility flag
* @property name the name of the type alias
*/
@OptIn(DeprecatedVisitor::class)
class KmTypeAlias(
var flags: Flags,
var name: String
@@ -574,22 +634,28 @@ class KmTypeAlias(
private val extensions: List<KmTypeAliasExtension> =
MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createTypeAliasExtension)
@DeprecatedVisitor
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@DeprecatedVisitor
override fun visitUnderlyingType(flags: Flags): KmTypeVisitor =
KmType(flags).also { underlyingType = it }
@DeprecatedVisitor
override fun visitExpandedType(flags: Flags): KmTypeVisitor =
KmType(flags).also { expandedType = it }
@DeprecatedVisitor
override fun visitAnnotation(annotation: KmAnnotation) {
annotations.add(annotation)
}
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? =
extensions.singleOfType(type)
@DeprecatedVisitor
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@@ -598,6 +664,7 @@ class KmTypeAlias(
*
* @param visitor the visitor which will visit data in this type alias
*/
@DeprecatedVisitor
fun accept(visitor: KmTypeAliasVisitor) {
typeParameters.forEach { visitor.visitTypeParameter(it.flags, it.name, it.id, it.variance)?.let(it::accept) }
visitor.visitUnderlyingType(underlyingType.flags)?.let(underlyingType::accept)
@@ -615,6 +682,7 @@ class KmTypeAlias(
* @property flags value parameter flags, consisting of [Flag.ValueParameter] flags
* @property name the name of the value parameter
*/
@OptIn(DeprecatedVisitor::class)
class KmValueParameter(
var flags: Flags,
var name: String
@@ -633,12 +701,15 @@ class KmValueParameter(
private val extensions: List<KmValueParameterExtension> =
MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createValueParameterExtension)
@DeprecatedVisitor
override fun visitType(flags: Flags): KmTypeVisitor =
KmType(flags).also { type = it }
@DeprecatedVisitor
override fun visitVarargElementType(flags: Flags): KmTypeVisitor =
KmType(flags).also { varargElementType = it }
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmValueParameterExtensionVisitor? =
extensions.singleOfType(type)
@@ -647,6 +718,7 @@ class KmValueParameter(
*
* @param visitor the visitor which will visit data in this value parameter
*/
@DeprecatedVisitor
fun accept(visitor: KmValueParameterVisitor) {
visitor.visitType(type.flags)?.let(type::accept)
varargElementType?.let { visitor.visitVarargElementType(it.flags)?.let(it::accept) }
@@ -664,6 +736,7 @@ class KmValueParameter(
* the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`)
* @property variance the declaration-site variance of the type parameter
*/
@OptIn(DeprecatedVisitor::class)
class KmTypeParameter(
var flags: Flags,
var name: String,
@@ -678,9 +751,11 @@ class KmTypeParameter(
private val extensions: List<KmTypeParameterExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeParameterExtension)
@DeprecatedVisitor
override fun visitUpperBound(flags: Flags): KmTypeVisitor =
KmType(flags).addTo(upperBounds)
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? =
extensions.singleOfType(type)
@@ -689,6 +764,7 @@ class KmTypeParameter(
*
* @param visitor the visitor which will visit data in this type parameter
*/
@DeprecatedVisitor
fun accept(visitor: KmTypeParameterVisitor) {
upperBounds.forEach { visitor.visitUpperBound(it.flags)?.let(it::accept) }
extensions.forEach { visitor.visitExtensions(it.type)?.let(it::accept) }
@@ -701,6 +777,7 @@ class KmTypeParameter(
*
* @property flags type flags, consisting of [Flag.Type] flags
*/
@OptIn(DeprecatedVisitor::class)
class KmType(var flags: Flags) : KmTypeVisitor() {
/**
* Classifier of the type.
@@ -745,34 +822,43 @@ class KmType(var flags: Flags) : KmTypeVisitor() {
private val extensions: List<KmTypeExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeExtension)
@DeprecatedVisitor
override fun visitClass(name: ClassName) {
classifier = KmClassifier.Class(name)
}
@DeprecatedVisitor
override fun visitTypeAlias(name: ClassName) {
classifier = KmClassifier.TypeAlias(name)
}
@DeprecatedVisitor
override fun visitTypeParameter(id: Int) {
classifier = KmClassifier.TypeParameter(id)
}
@DeprecatedVisitor
override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor =
KmType(flags).also { arguments.add(KmTypeProjection(variance, it)) }
@DeprecatedVisitor
override fun visitStarProjection() {
arguments.add(KmTypeProjection.STAR)
}
@DeprecatedVisitor
override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor =
KmType(flags).also { abbreviatedType = it }
@DeprecatedVisitor
override fun visitOuterType(flags: Flags): KmTypeVisitor =
KmType(flags).also { outerType = it }
@DeprecatedVisitor
override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor =
KmType(flags).also { flexibleTypeUpperBound = KmFlexibleTypeUpperBound(it, typeFlexibilityId) }
@DeprecatedVisitor
override fun visitExtensions(type: KmExtensionType): KmTypeExtension =
extensions.singleOfType(type)
@@ -781,6 +867,7 @@ class KmType(var flags: Flags) : KmTypeVisitor() {
*
* @param visitor the visitor which will visit data in this type
*/
@DeprecatedVisitor
fun accept(visitor: KmTypeVisitor) {
when (val classifier = classifier) {
is KmClassifier.Class -> visitor.visitClass(classifier.name)
@@ -810,6 +897,7 @@ class KmType(var flags: Flags) : KmTypeVisitor() {
* Version requirement is an internal feature of the Kotlin compiler and the standard Kotlin library,
* enabled for example with the internal [kotlin.internal.RequireKotlin] annotation.
*/
@OptIn(DeprecatedVisitor::class)
class KmVersionRequirement : KmVersionRequirementVisitor() {
/**
* Kind of the version that this declaration requires.
@@ -836,6 +924,7 @@ class KmVersionRequirement : KmVersionRequirementVisitor() {
*/
lateinit var version: KmVersion
@DeprecatedVisitor
override fun visit(kind: KmVersionRequirementVersionKind, level: KmVersionRequirementLevel, errorCode: Int?, message: String?) {
this.kind = kind
this.level = level
@@ -843,6 +932,7 @@ class KmVersionRequirement : KmVersionRequirementVisitor() {
this.message = message
}
@DeprecatedVisitor
override fun visitVersion(major: Int, minor: Int, patch: Int) {
this.version = KmVersion(major, minor, patch)
}
@@ -852,6 +942,7 @@ class KmVersionRequirement : KmVersionRequirementVisitor() {
*
* @param visitor the visitor which will visit data in this version requirement
*/
@DeprecatedVisitor
fun accept(visitor: KmVersionRequirementVisitor) {
visitor.visit(kind, level, errorCode, message)
visitor.visitVersion(version.major, version.minor, version.patch)
@@ -865,12 +956,15 @@ class KmVersionRequirement : KmVersionRequirementVisitor() {
* Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format
* may change in a subsequent release.
*/
@ExperimentalContracts
@OptIn(DeprecatedVisitor::class)
class KmContract : KmContractVisitor() {
/**
* Effects of this contract.
*/
val effects: MutableList<KmEffect> = ArrayList(1)
@DeprecatedVisitor
override fun visitEffect(type: KmEffectType, invocationKind: KmEffectInvocationKind?): KmEffectVisitor =
KmEffect(type, invocationKind).addTo(effects)
@@ -879,6 +973,7 @@ class KmContract : KmContractVisitor() {
*
* @param visitor the visitor which will visit data in this contract
*/
@DeprecatedVisitor
fun accept(visitor: KmContractVisitor) {
effects.forEach { visitor.visitEffect(it.type, it.invocationKind)?.let(it::accept) }
visitor.visitEnd()
@@ -895,6 +990,8 @@ class KmContract : KmContractVisitor() {
* @property invocationKind optional number of invocations of the lambda parameter of this function,
* specified further in the effect expression
*/
@ExperimentalContracts
@OptIn(DeprecatedVisitor::class)
class KmEffect(
var type: KmEffectType,
var invocationKind: KmEffectInvocationKind?
@@ -910,9 +1007,11 @@ class KmEffect(
*/
var conclusion: KmEffectExpression? = null
@DeprecatedVisitor
override fun visitConstructorArgument(): KmEffectExpressionVisitor =
KmEffectExpression().addTo(constructorArguments)
@DeprecatedVisitor
override fun visitConclusionOfConditionalEffect(): KmEffectExpressionVisitor =
KmEffectExpression().also { conclusion = it }
@@ -921,6 +1020,7 @@ class KmEffect(
*
* @param visitor the visitor which will visit data in this effect
*/
@DeprecatedVisitor
fun accept(visitor: KmEffectVisitor) {
constructorArguments.forEach { visitor.visitConstructorArgument()?.let(it::accept) }
conclusion?.let { visitor.visitConclusionOfConditionalEffect()?.let(it::accept) }
@@ -934,6 +1034,8 @@ class KmEffect(
* Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format
* may change in a subsequent release.
*/
@ExperimentalContracts
@OptIn(DeprecatedVisitor::class)
class KmEffectExpression : KmEffectExpressionVisitor() {
/**
* Effect expression flags, consisting of [Flag.EffectExpression] flags.
@@ -968,21 +1070,26 @@ class KmEffectExpression : KmEffectExpressionVisitor() {
*/
val orArguments: MutableList<KmEffectExpression> = ArrayList(0)
@DeprecatedVisitor
override fun visit(flags: Flags, parameterIndex: Int?) {
this.flags = flags
this.parameterIndex = parameterIndex
}
@DeprecatedVisitor
override fun visitConstantValue(value: Any?) {
constantValue = KmConstantValue(value)
}
@DeprecatedVisitor
override fun visitIsInstanceType(flags: Flags): KmTypeVisitor =
KmType(flags).also { isInstanceType = it }
@DeprecatedVisitor
override fun visitAndArgument(): KmEffectExpressionVisitor =
KmEffectExpression().addTo(andArguments)
@DeprecatedVisitor
override fun visitOrArgument(): KmEffectExpressionVisitor =
KmEffectExpression().addTo(orArguments)
@@ -991,6 +1098,7 @@ class KmEffectExpression : KmEffectExpressionVisitor() {
*
* @param visitor the visitor which will visit data in this effect expression
*/
@DeprecatedVisitor
fun accept(visitor: KmEffectExpressionVisitor) {
visitor.visit(flags, parameterIndex)
constantValue?.let { visitor.visitConstantValue(it.value) }
@@ -17,7 +17,7 @@ package kotlinx.metadata
* klass.functions.assignFrom(...)
*
*/
fun <T> MutableList<T>.assignFrom(collection: Collection<T>) {
internal fun <T> MutableList<T>.assignFrom(collection: Collection<T>) {
clear()
addAll(collection)
}
@@ -5,9 +5,15 @@
package kotlinx.metadata
import kotlin.contracts.ExperimentalContracts
@RequiresOptIn("Visitor API is deprecated. Please do not use", RequiresOptIn.Level.ERROR)
annotation class DeprecatedVisitor
/**
* A visitor containing the common code to visit Kotlin declaration containers, such as classes and package fragments.
*/
@DeprecatedVisitor
abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected open val delegate: KmDeclarationContainerVisitor? = null) {
/**
* Visits a function in the container.
@@ -54,6 +60,7 @@ abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected
* When using this class, [visit] must be called first, followed by zero or more [visitTypeParameter] calls, followed by zero or more calls
* to other visit* methods, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor? = null) : KmDeclarationContainerVisitor(delegate) {
override val delegate: KmClassVisitor?
get() = super.delegate as KmClassVisitor?
@@ -185,6 +192,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
*
* When using this class, [visitEnd] must be called exactly once and after calls to all other visit* methods.
*/
@DeprecatedVisitor
abstract class KmPackageVisitor @JvmOverloads constructor(delegate: KmPackageVisitor? = null) : KmDeclarationContainerVisitor(delegate) {
override val delegate: KmPackageVisitor?
get() = super.delegate as KmPackageVisitor?
@@ -211,6 +219,7 @@ abstract class KmPackageVisitor @JvmOverloads constructor(delegate: KmPackageVis
*
* When using this class, [visitEnd] must be called exactly once and after calls to all other visit* methods.
*/
@DeprecatedVisitor
abstract class KmModuleFragmentVisitor @JvmOverloads constructor(private val delegate: KmModuleFragmentVisitor? = null) {
/**
@@ -246,6 +255,7 @@ abstract class KmModuleFragmentVisitor @JvmOverloads constructor(private val del
*
* When using this class, [visitFunction] must be called first, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmLambdaVisitor @JvmOverloads constructor(private val delegate: KmLambdaVisitor? = null) {
/**
* Visits the signature of a synthetic anonymous function, representing the lambda.
@@ -269,6 +279,7 @@ abstract class KmLambdaVisitor @JvmOverloads constructor(private val delegate: K
*
* When using this class, [visitEnd] must be called exactly once and after calls to all other visit* methods.
*/
@DeprecatedVisitor
abstract class KmConstructorVisitor @JvmOverloads constructor(private val delegate: KmConstructorVisitor? = null) {
/**
* Visits a value parameter of the constructor.
@@ -307,6 +318,7 @@ abstract class KmConstructorVisitor @JvmOverloads constructor(private val delega
* When using this class, zero or more calls to [visitTypeParameter] must be done first, followed by zero or more calls
* to other visit* methods, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate: KmFunctionVisitor? = null) {
/**
* Visits a type parameter of the function.
@@ -363,6 +375,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
/**
* Visits the contract of the function.
*/
@ExperimentalContracts
open fun visitContract(): KmContractVisitor? =
delegate?.visitContract()
@@ -388,6 +401,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* When using this class, zero or more calls to [visitTypeParameter] must be done first, followed by zero or more calls
* to other visit* methods, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate: KmPropertyVisitor? = null) {
/**
* Visits a type parameter of the property.
@@ -463,6 +477,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* When using this class, zero or more calls to [visitTypeParameter] must be done first, followed by zero or more calls
* to other visit* methods, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate: KmTypeAliasVisitor? = null) {
/**
* Visits a type parameter of the type alias.
@@ -530,6 +545,7 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
* When using this class, either [visitType] or [visitVarargElementType] must be called first (depending on whether the value parameter
* is `vararg` or not), followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmValueParameterVisitor @JvmOverloads constructor(private val delegate: KmValueParameterVisitor? = null) {
/**
* Visits the type of the value parameter, if this is **not** a `vararg` parameter.
@@ -568,6 +584,7 @@ abstract class KmValueParameterVisitor @JvmOverloads constructor(private val del
*
* When using this class, zero or more [visitUpperBound] calls must be done first, followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmTypeParameterVisitor @JvmOverloads constructor(private val delegate: KmTypeParameterVisitor? = null) {
/**
* Visits the upper bound of the type parameter.
@@ -604,6 +621,7 @@ abstract class KmTypeParameterVisitor @JvmOverloads constructor(private val dele
*
* When using this class, [visitEnd] must be called exactly once and after calls to all other visit* methods.
*/
@DeprecatedVisitor
abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmTypeVisitor? = null) {
/**
* Visits the name of the class, if this type's classifier is a class.
@@ -715,6 +733,7 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT
*
* When using this class, [visit] must be called first, followed by [visitVersion], followed by [visitEnd].
*/
@DeprecatedVisitor
abstract class KmVersionRequirementVisitor @JvmOverloads constructor(private val delegate: KmVersionRequirementVisitor? = null) {
/**
* Visits the description of this version requirement.
@@ -756,6 +775,8 @@ abstract class KmVersionRequirementVisitor @JvmOverloads constructor(private val
*
* When using this class, zero or more calls to [visitEffect] must be done first, followed by [visitEnd].
*/
@DeprecatedVisitor
@ExperimentalContracts
abstract class KmContractVisitor @JvmOverloads constructor(private val delegate: KmContractVisitor? = null) {
/**
* Visits an effect of this contract.
@@ -784,6 +805,8 @@ abstract class KmContractVisitor @JvmOverloads constructor(private val delegate:
* When using this class, zero or more calls to [visitConstructorArgument] or [visitConclusionOfConditionalEffect] must be done first,
* followed by [visitEnd].
*/
@DeprecatedVisitor
@ExperimentalContracts
abstract class KmEffectVisitor @JvmOverloads constructor(private val delegate: KmEffectVisitor? = null) {
/**
* Visits the optional argument of the effect constructor, i.e. the constant value for the [KmEffectType.RETURNS_CONSTANT] effect,
@@ -815,6 +838,8 @@ abstract class KmEffectVisitor @JvmOverloads constructor(private val delegate: K
*
* When using this class, [visit] must be called first, followed by zero or more calls to other visit* methods, followed by [visitEnd].
*/
@DeprecatedVisitor
@ExperimentalContracts
abstract class KmEffectExpressionVisitor @JvmOverloads constructor(private val delegate: KmEffectExpressionVisitor? = null) {
/**
* Visits the basic information of the effect expression.
@@ -893,6 +918,7 @@ enum class KmVariance {
* Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format
* may change in a subsequent release.
*/
@ExperimentalContracts
enum class KmEffectType {
RETURNS_CONSTANT,
CALLS,
@@ -905,6 +931,7 @@ enum class KmEffectType {
* Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format
* may change in a subsequent release.
*/
@ExperimentalContracts
enum class KmEffectInvocationKind {
AT_MOST_ONCE,
EXACTLY_ONCE,
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.kotlinp
import kotlinx.metadata.DeprecatedVisitor
import kotlinx.metadata.InconsistentKotlinMetadataException
import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.KotlinModuleMetadata
import java.io.File
@OptIn(DeprecatedVisitor::class)
class Kotlinp(private val settings: KotlinpSettings) {
internal fun renderClassFile(classFile: KotlinClassMetadata?): String =
when (classFile) {
@@ -718,6 +718,7 @@ interface AbstractPrinter<in T : KotlinClassMetadata> {
fun print(klass: T): String
}
@DeprecatedVisitor
class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), AbstractPrinter<KotlinClassMetadata.Class> {
private val sb = StringBuilder()
internal val result = StringBuilder()
@@ -863,6 +864,7 @@ class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), Ab
}
}
@DeprecatedVisitor
abstract class PackagePrinter(private val settings: KotlinpSettings) : KmPackageVisitor() {
internal val sb = StringBuilder().apply {
appendLine("package {")
@@ -899,7 +901,7 @@ abstract class PackagePrinter(private val settings: KotlinpSettings) : KmPackage
}
}
}
@DeprecatedVisitor
class FileFacadePrinter(settings: KotlinpSettings) : PackagePrinter(settings), AbstractPrinter<KotlinClassMetadata.FileFacade> {
override fun print(klass: KotlinClassMetadata.FileFacade): String {
klass.accept(this)
@@ -907,6 +909,7 @@ class FileFacadePrinter(settings: KotlinpSettings) : PackagePrinter(settings), A
}
}
@DeprecatedVisitor
class LambdaPrinter(private val settings: KotlinpSettings) : KmLambdaVisitor(), AbstractPrinter<KotlinClassMetadata.SyntheticClass> {
private val sb = StringBuilder().apply {
appendLine("lambda {")
@@ -925,6 +928,7 @@ class LambdaPrinter(private val settings: KotlinpSettings) : KmLambdaVisitor(),
}
}
@DeprecatedVisitor
class MultiFileClassPartPrinter(
settings: KotlinpSettings
) : PackagePrinter(settings), AbstractPrinter<KotlinClassMetadata.MultiFileClassPart> {
@@ -946,6 +950,7 @@ class MultiFileClassFacadePrinter : AbstractPrinter<KotlinClassMetadata.MultiFil
}
}
@DeprecatedVisitor
class ModuleFilePrinter(private val settings: KotlinpSettings) : KmModuleVisitor() {
private val optionalAnnotations = mutableListOf<ClassPrinter>()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.kotlinp.test
import com.intellij.openapi.Disposable
import junit.framework.TestCase.assertEquals
import kotlinx.metadata.DeprecatedVisitor
import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.KotlinModuleMetadata
import org.jetbrains.kotlin.checkers.setupLanguageVersionSettingsForCompilerTests
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.test.util.KtTestUtil
import java.io.File
import kotlin.test.fail
@OptIn(DeprecatedVisitor::class)
fun compileAndPrintAllFiles(file: File, disposable: Disposable, tmpdir: File, compareWithTxt: Boolean, readWriteAndCompare: Boolean) {
val main = StringBuilder()
val afterVisitors = StringBuilder()
@@ -97,6 +99,8 @@ private fun StringBuilder.appendFileName(file: File) {
// Reads the class file and writes it back with *Writer visitors.
// The resulting class file should be the same from the point of view of any metadata reader, including kotlinp
// (the exact bytes may differ though, because there are multiple ways to encode the same metadata)
@Suppress("DEPRECATION_ERROR")
@DeprecatedVisitor // TODO: not sure this test is needed at all now
private fun transformClassFileWithReadWriteVisitors(classFile: KotlinClassMetadata): KotlinClassMetadata =
when (classFile) {
is KotlinClassMetadata.Class -> KotlinClassMetadata.Class.Writer().apply(classFile::accept).write()
@@ -118,18 +122,20 @@ private fun transformClassFileWithReadWriteVisitors(classFile: KotlinClassMetada
private fun transformClassFileWithNodes(classFile: KotlinClassMetadata): KotlinClassMetadata =
when (classFile) {
is KotlinClassMetadata.Class ->
KotlinClassMetadata.Class.Writer().apply(classFile.toKmClass()::accept).write()
KotlinClassMetadata.writeClass(classFile.toKmClass())
is KotlinClassMetadata.FileFacade ->
KotlinClassMetadata.FileFacade.Writer().apply(classFile.toKmPackage()::accept).write()
KotlinClassMetadata.writeFileFacade(classFile.toKmPackage())
is KotlinClassMetadata.SyntheticClass ->
KotlinClassMetadata.SyntheticClass.Writer().apply { classFile.toKmLambda()?.accept(this) }.write()
classFile.toKmLambda()?.let { KotlinClassMetadata.writeLambda(it) } ?: KotlinClassMetadata.writeSyntheticClass()
is KotlinClassMetadata.MultiFileClassPart ->
KotlinClassMetadata.MultiFileClassPart.Writer().apply(classFile.toKmPackage()::accept).write(classFile.facadeClassName)
KotlinClassMetadata.writeMultiFileClassPart(classFile.toKmPackage(), classFile.facadeClassName)
else -> classFile
}
@Suppress("DEPRECATION_ERROR")
@DeprecatedVisitor
private fun transformModuleFileWithReadWriteVisitors(moduleFile: KotlinModuleMetadata): KotlinModuleMetadata =
KotlinModuleMetadata.Writer().apply(moduleFile::accept).write()
private fun transformModuleFileWithNodes(moduleFile: KotlinModuleMetadata): KotlinModuleMetadata =
KotlinModuleMetadata.Writer().apply(moduleFile.toKmModule()::accept).write()
KotlinModuleMetadata.write(moduleFile.toKmModule())
@@ -23,6 +23,7 @@ import kotlin.Unit
import kotlin.apply
import kotlin.arrayOf
import kotlin.check
import kotlin.contracts.ExperimentalContracts
import kotlin.error
import kotlin.let
import kotlin.reflect.KProperty
@@ -493,6 +494,7 @@ class MetadataDeclarationsComparator private constructor(private val config: Con
)
}
@OptIn(ExperimentalContracts::class)
private fun compareEffectExpressionLists(
containerContext: Context,
effectExpressionListA: List<KmEffectExpression>,
@@ -611,6 +613,7 @@ class MetadataDeclarationsComparator private constructor(private val config: Con
compareNullableValues(propertyContext, propertyA.compileTimeValue, propertyB.compileTimeValue, EntityKind.CompileTimeValue)
}
@OptIn(ExperimentalContracts::class)
@Suppress("DuplicatedCode")
private fun compareFunctions(
functionContext: Context,
@@ -791,6 +794,7 @@ class MetadataDeclarationsComparator private constructor(private val config: Con
compareTypeLists(typeParameterContext, typeParameterA.upperBounds, typeParameterB.upperBounds, TypeKind.UPPER_BOUND)
}
@OptIn(ExperimentalContracts::class)
private fun compareEffectExpressions(
effectExpressionContext: Context,
effectExpressionA: KmEffectExpression,
@@ -18,6 +18,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes
* Wrap the visitor for a Kotlin Metadata annotation to strip out private and local
* functions, properties, and type aliases as well as local delegated properties.
*/
@OptIn(DeprecatedVisitor::class)
fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisitor =
kotlinClassHeaderVisitor { header ->
// kotlinx-metadata only supports writing Kotlin metadata of version >= 1.4, so we need to
@@ -136,6 +137,7 @@ private fun AnnotationVisitor.visitKotlinMetadata(header: KotlinClassHeader) {
* Class metadata adapter which removes private functions, properties, type aliases,
* and local delegated properties.
*/
@DeprecatedVisitor
private class AbiKmClassVisitor(delegate: KmClassVisitor) : KmClassVisitor(delegate) {
override fun visitConstructor(flags: Flags): KmConstructorVisitor? {
if (!isPrivateDeclaration(flags))
@@ -172,6 +174,7 @@ private class AbiKmClassVisitor(delegate: KmClassVisitor) : KmClassVisitor(deleg
* Class metadata adapter which removes private functions, properties, type aliases,
* and local delegated properties.
*/
@DeprecatedVisitor
private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) {
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
if (!isPrivateDeclaration(flags))