diff --git a/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api b/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api index 5566f508861..49673eb18d8 100644 --- a/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api +++ b/libraries/kotlinx-metadata/jvm/api/kotlinx-metadata-jvm.api @@ -1279,6 +1279,24 @@ public abstract class kotlinx/metadata/jvm/KotlinClassMetadata { public synthetic fun (Lkotlin/Metadata;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAnnotationData ()Lkotlin/Metadata; public static final fun read (Lkotlin/Metadata;)Lkotlinx/metadata/jvm/KotlinClassMetadata; + public static final fun writeClass (Lkotlinx/metadata/KmClass;)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class; + public static final fun writeClass (Lkotlinx/metadata/KmClass;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class; + public static final fun writeClass (Lkotlinx/metadata/KmClass;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class; + public static final fun writeFileFacade (Lkotlinx/metadata/KmPackage;)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade; + public static final fun writeFileFacade (Lkotlinx/metadata/KmPackage;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade; + public static final fun writeFileFacade (Lkotlinx/metadata/KmPackage;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade; + public static final fun writeLambda (Lkotlinx/metadata/KmLambda;)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public static final fun writeLambda (Lkotlinx/metadata/KmLambda;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public static final fun writeLambda (Lkotlinx/metadata/KmLambda;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public static final fun writeMultiFileClassFacade (Ljava/util/List;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade; + public static final fun writeMultiFileClassFacade (Ljava/util/List;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade; + public static final fun writeMultiFileClassFacade (Ljava/util/List;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade; + public static final fun writeMultiFileClassPart (Lkotlinx/metadata/KmPackage;Ljava/lang/String;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart; + public static final fun writeMultiFileClassPart (Lkotlinx/metadata/KmPackage;Ljava/lang/String;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart; + public static final fun writeMultiFileClassPart (Lkotlinx/metadata/KmPackage;Ljava/lang/String;[II)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart; + public static final fun writeSyntheticClass ()Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public static final fun writeSyntheticClass ([I)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public static final fun writeSyntheticClass ([II)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; } public final class kotlinx/metadata/jvm/KotlinClassMetadata$Class : kotlinx/metadata/jvm/KotlinClassMetadata { @@ -1296,16 +1314,28 @@ public final class kotlinx/metadata/jvm/KotlinClassMetadata$Class$Writer : kotli public final class kotlinx/metadata/jvm/KotlinClassMetadata$Companion { public final fun read (Lkotlin/Metadata;)Lkotlinx/metadata/jvm/KotlinClassMetadata; + public final fun writeClass (Lkotlinx/metadata/KmClass;)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class; + public final fun writeClass (Lkotlinx/metadata/KmClass;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$Class; 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;)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade; + public final fun writeFileFacade (Lkotlinx/metadata/KmPackage;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$FileFacade; 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;)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public final fun writeLambda (Lkotlinx/metadata/KmLambda;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; 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;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade; + public final fun writeMultiFileClassFacade (Ljava/util/List;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassFacade; 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;)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart; + public final fun writeMultiFileClassPart (Lkotlinx/metadata/KmPackage;Ljava/lang/String;[I)Lkotlinx/metadata/jvm/KotlinClassMetadata$MultiFileClassPart; 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 ()Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; + public final fun writeSyntheticClass ([I)Lkotlinx/metadata/jvm/KotlinClassMetadata$SyntheticClass; 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; } @@ -1373,10 +1403,13 @@ public final class kotlinx/metadata/jvm/KotlinModuleMetadata { public final fun getBytes ()[B public static final fun read ([B)Lkotlinx/metadata/jvm/KotlinModuleMetadata; public final fun toKmModule ()Lkotlinx/metadata/jvm/KmModule; + public static final fun write (Lkotlinx/metadata/jvm/KmModule;)Lkotlinx/metadata/jvm/KotlinModuleMetadata; + public static final fun write (Lkotlinx/metadata/jvm/KmModule;[I)Lkotlinx/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;)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; } 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 c42c477f7ea..7a241581b48 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt @@ -409,6 +409,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [kmClass] is not correct and cannot be written or if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeClass( kmClass: KmClass, metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION, @@ -427,6 +429,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [kmPackage] is not correct and cannot be written or if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeFileFacade( kmPackage: KmPackage, metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION, @@ -445,6 +449,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [kmLambda] is not correct and cannot be written or if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeLambda( kmLambda: KmLambda, metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION, @@ -463,6 +469,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeSyntheticClass( metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION, extraInt: Int = 0 @@ -479,6 +487,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeMultiFileClassFacade( partClassNames: List, metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION, extraInt: Int = 0 @@ -495,6 +505,8 @@ sealed class KotlinClassMetadata(val annotationData: Metadata) { * * @throws IllegalArgumentException if [kmPackage] is not correct and cannot be written or if [metadataVersion] is not supported for writing. */ + @JvmStatic + @JvmOverloads fun writeMultiFileClassPart( kmPackage: KmPackage, facadeClassName: String, @@ -594,4 +606,4 @@ internal const val VISITOR_API_MESSAGE = "Visitor API is deprecated as excessive and cumbersome. Please use nodes (such as KmClass) and their properties." internal const val WRITER_API_MESSAGE = - "Visitor Writer API is deprecated as excessive and cumbersome. Please use member functions of KotlinClassMetadata.Companion" \ No newline at end of file + "Visitor Writer API is deprecated as excessive and cumbersome. Please use member functions of KotlinClassMetadata.Companion" 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 56958c9dbf8..9d9541e1194 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt @@ -156,6 +156,8 @@ class KotlinModuleMetadata(@Suppress("MemberVisibilityCanBePrivate") val bytes: * @throws IllegalArgumentException if [kmModule] is not correct and cannot be written or if [metadataVersion] is not supported for writing. */ @UnstableMetadataApi + @JvmStatic + @JvmOverloads fun write(kmModule: KmModule, metadataVersion: IntArray = COMPATIBLE_METADATA_VERSION): KotlinModuleMetadata = wrapWriteIntoIAE { Writer().also { kmModule.accept(it) }.write(metadataVersion) } diff --git a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/JavaUsageTest.java b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/JavaUsageTest.java index 653f8d7e2db..b23c9c7a5a1 100644 --- a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/JavaUsageTest.java +++ b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/JavaUsageTest.java @@ -11,16 +11,28 @@ import kotlinx.metadata.jvm.KotlinClassHeader; import kotlinx.metadata.jvm.KotlinClassMetadata; import org.junit.Test; -import static org.junit.Assert.assertEquals; +import java.util.Arrays; +import java.util.Objects; + +import static org.junit.Assert.*; public class JavaUsageTest { - @SuppressWarnings("ConstantConditions") + @Test public void testKotlinClassHeader() { Metadata m = MetadataSmokeTest.class.getAnnotation(Metadata.class); - KmClass clazz1 = ((KotlinClassMetadata.Class) KotlinClassMetadata.read(m)).toKmClass(); - KotlinClassHeader kh = new KotlinClassHeader(m.k(), m.mv(),m.d1(),m.d2(), m.xs(), m.pn(), m.xi()); - KmClass clazz2 = ((KotlinClassMetadata.Class) KotlinClassMetadata.read(kh)).toKmClass(); + KmClass clazz1 = ((KotlinClassMetadata.Class) Objects.requireNonNull(KotlinClassMetadata.read(m))).toKmClass(); + KotlinClassHeader kh = new KotlinClassHeader(m.k(), m.mv(), m.d1(), m.d2(), m.xs(), m.pn(), m.xi()); + KmClass clazz2 = ((KotlinClassMetadata.Class) Objects.requireNonNull(KotlinClassMetadata.read(kh))).toKmClass(); assertEquals(clazz1.getName(), clazz2.getName()); } + + @Test + public void testWritingBackWithDefaults() { + Metadata m = MetadataSmokeTest.class.getAnnotation(Metadata.class); + KmClass clazz1 = ((KotlinClassMetadata.Class) Objects.requireNonNull(KotlinClassMetadata.read(m))).toKmClass(); + Metadata written = KotlinClassMetadata.writeClass(clazz1).getAnnotationData(); + assertArrayEquals(written.mv(), KotlinClassMetadata.COMPATIBLE_METADATA_VERSION); + assertEquals(0, written.xi()); + } }