diff --git a/libraries/kotlinx-metadata/api/kotlinx-metadata.api b/libraries/kotlinx-metadata/api/kotlinx-metadata.api index e352d9dee3c..3930d87e22a 100644 --- a/libraries/kotlinx-metadata/api/kotlinx-metadata.api +++ b/libraries/kotlinx-metadata/api/kotlinx-metadata.api @@ -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 (Lorg/jetbrains/kotlin/metadata/serialization/StringTable;Ljava/util/List;)V public synthetic fun (Lorg/jetbrains/kotlin/metadata/serialization/StringTable;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V diff --git a/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api b/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api index 8d23d0864d8..beecdd25002 100644 --- a/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api +++ b/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api @@ -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 { diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt index 5ea22aff6f8..844b70d585c 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt @@ -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, @@ -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, 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. diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt index e7c33c0bfa8..b9f446ac237 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt @@ -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 = ArrayList(0) + @DeprecatedVisitor override fun visitPackageParts(fqName: String, fileFacades: List, multiFileClassParts: Map) { 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) diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt index cbaf9e9aa25..552e0d5cf95 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt @@ -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 diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt index 91bbbcbb973..34162e29ce5 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt @@ -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 = ArrayList(0) var moduleName: String? = null diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt index 5c33b7a1f35..ba563c616cb 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt @@ -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) diff --git a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt index 039fbbce7c3..3e591fc2576 100644 --- a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt +++ b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt @@ -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 { KotlinClassMetadata.Class.Writer().write(mv) } - assertFailsWith { KotlinClassMetadata.FileFacade.Writer().write(mv) } - assertFailsWith { KotlinClassMetadata.MultiFileClassFacade.Writer().write(listOf("A"), mv) } - assertFailsWith { KotlinClassMetadata.MultiFileClassPart.Writer().write("A", mv) } - assertFailsWith { KotlinClassMetadata.SyntheticClass.Writer().write(mv) } + assertFailsWith { KotlinClassMetadata.writeClass(dummy, mv) } // We can't write empty KmClass() + assertFailsWith { KotlinClassMetadata.writeFileFacade(KmPackage(), mv) } + assertFailsWith { KotlinClassMetadata.writeMultiFileClassFacade(listOf("A"), mv) } + assertFailsWith { KotlinClassMetadata.writeMultiFileClassPart(KmPackage(), "A", mv) } + assertFailsWith { 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) } diff --git a/libraries/kotlinx-metadata/klib/api/kotlinx-metadata-klib.api b/libraries/kotlinx-metadata/klib/api/kotlinx-metadata-klib.api new file mode 100644 index 00000000000..08558698b19 --- /dev/null +++ b/libraries/kotlinx-metadata/klib/api/kotlinx-metadata-klib.api @@ -0,0 +1,264 @@ +public final class kotlinx/metadata/klib/ChunkedKlibModuleFragmentWriteStrategy : kotlinx/metadata/klib/KlibModuleFragmentWriteStrategy { + public fun ()V + public fun (II)V + public synthetic fun (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 ()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 ()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 (Ljava/lang/String;Lkotlinx/metadata/klib/UniqId;Ljava/lang/Integer;Ljava/util/List;)V + public synthetic fun (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 ()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 (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 ()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 (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 ([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 ()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 ()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 (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 ()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 ()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 ()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 ()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 (J)V + public final fun getIndex ()J +} + +public final class kotlinx/metadata/klib/impl/KlibModuleFragmentWriter : kotlinx/metadata/impl/ModuleFragmentWriter { + public fun (Lorg/jetbrains/kotlin/serialization/ApproximatingStringTable;Ljava/util/List;)V + public synthetic fun (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 ()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 (Ljava/util/List;)V + public final fun getSourceFile (I)Lkotlinx/metadata/klib/KlibSourceFile; +} + diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt index b5cd8c4ee3f..ce587cd1427 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt @@ -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 { diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt index d65bd3066b9..90155ca53f2 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt @@ -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 diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt index fa69ba6ed99..c776a4fcf67 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt @@ -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) = diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt index 289e6376446..1ddcaab5690 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt @@ -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 = emptyList() diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/ClassName.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/ClassName.kt index 51cadd79426..0fa7a134903 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/ClassName.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/ClassName.kt @@ -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(".") diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt index 6a8ee598b9b..73f9cde143b 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt @@ -43,17 +43,12 @@ sealed class KmAnnotationArgument { data class DoubleValue(override val value: Double) : LiteralValue() data class BooleanValue(override val value: Boolean) : LiteralValue() - // TODO: remove @ExperimentalUnsignedTypes once bootstrap stdlib has stable unsigned types. - @ExperimentalUnsignedTypes data class UByteValue(override val value: UByte) : LiteralValue() - @ExperimentalUnsignedTypes data class UShortValue(override val value: UShort) : LiteralValue() - @ExperimentalUnsignedTypes data class UIntValue(override val value: UInt) : LiteralValue() - @ExperimentalUnsignedTypes data class ULongValue(override val value: ULong) : LiteralValue() data class StringValue(override val value: String) : LiteralValue() diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt index c26349f9214..50f2628cd79 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt @@ -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) diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt index fb630caf1e7..0cb137442ad 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt @@ -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) { diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt index 05afdc5f529..b2a6bef0c53 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt @@ -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, properties: List, @@ -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, diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt index 6671183431a..d4ccd6b03fb 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt @@ -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) { diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt index 165fea6b672..42c8fd221bb 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt @@ -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 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 = 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 = 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 = 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) diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt index bde301ce7db..b6e5b01ab9d 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt @@ -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) diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt index 7e5bb789f41..fae7ae9508a 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt @@ -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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 { fun 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 = 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 = 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 = 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 = 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) } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/util.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/util.kt index 8433f5ab5f0..82bc32682ea 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/util.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/util.kt @@ -17,7 +17,7 @@ package kotlinx.metadata * klass.functions.assignFrom(...) * */ -fun MutableList.assignFrom(collection: Collection) { +internal fun MutableList.assignFrom(collection: Collection) { clear() addAll(collection) } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt index 4689cbb1e1a..055bc6a19f7 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt @@ -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, diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/Kotlinp.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/Kotlinp.kt index 138f8fb4b9c..0c93b212b88 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/Kotlinp.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/Kotlinp.kt @@ -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) { diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index 512939010ea..cbcc8717771 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -718,6 +718,7 @@ interface AbstractPrinter { fun print(klass: T): String } +@DeprecatedVisitor class ClassPrinter(private val settings: KotlinpSettings) : KmClassVisitor(), AbstractPrinter { 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 { 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 { 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 { @@ -946,6 +950,7 @@ class MultiFileClassFacadePrinter : AbstractPrinter() diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt index 63a250142a0..3355d618eb5 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt @@ -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()) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/utils/MetadataDeclarationsComparator.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/utils/MetadataDeclarationsComparator.kt index 14def4ed598..6313393a849 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/utils/MetadataDeclarationsComparator.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/utils/MetadataDeclarationsComparator.kt @@ -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, @@ -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, diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt index f3ba0823f30..dceb8335d58 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt @@ -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))