Remove deprecated write in kotlin class model

Bug: b/341991457
Change-Id: Icbce569be402e97435f8d4b004af0abb452c5264
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index 594eb68..d0f39cb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -4,12 +4,10 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteList;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmFieldSignature;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmMethodSignature;
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
@@ -41,7 +39,7 @@
 
 public class KotlinClassInfo implements KotlinClassLevelInfo {
 
-  private final KmClass kmClass;
+  private final KotlinClassMetadata.Class classMetadata;
   private final boolean nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin;
   private final String moduleName;
   private final List<KotlinConstructorInfo> constructorsWithNoBacking;
@@ -56,7 +54,6 @@
   private final KotlinTypeReference anonymousObjectOrigin;
   private final String packageName;
   private final KotlinLocalDelegatedPropertyInfo localDelegatedProperties;
-  private final int[] metadataVersion;
   private final String inlineClassUnderlyingPropertyName;
   private final KotlinTypeInfo inlineClassUnderlyingType;
   private final String companionObjectName;
@@ -67,7 +64,7 @@
   private final KotlinMetadataMembersTracker originalMembersWithKotlinInfo;
 
   private KotlinClassInfo(
-      KmClass kmClass,
+      KotlinClassMetadata.Class classMetadata,
       boolean nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin,
       String moduleName,
       KotlinDeclarationContainerInfo declarationContainerInfo,
@@ -80,13 +77,12 @@
       KotlinTypeReference anonymousObjectOrigin,
       String packageName,
       KotlinLocalDelegatedPropertyInfo localDelegatedProperties,
-      int[] metadataVersion,
       String inlineClassUnderlyingPropertyName,
       KotlinTypeInfo inlineClassUnderlyingType,
       KotlinMetadataMembersTracker originalMembersWithKotlinInfo,
       String companionObjectName,
       List<KotlinTypeInfo> contextReceiverTypes) {
-    this.kmClass = kmClass;
+    this.classMetadata = classMetadata;
     this.nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin =
         nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin;
     this.moduleName = moduleName;
@@ -100,7 +96,6 @@
     this.anonymousObjectOrigin = anonymousObjectOrigin;
     this.packageName = packageName;
     this.localDelegatedProperties = localDelegatedProperties;
-    this.metadataVersion = metadataVersion;
     this.inlineClassUnderlyingPropertyName = inlineClassUnderlyingPropertyName;
     this.inlineClassUnderlyingType = inlineClassUnderlyingType;
     this.originalMembersWithKotlinInfo = originalMembersWithKotlinInfo;
@@ -111,7 +106,6 @@
   public static KotlinClassInfo create(
       KotlinClassMetadata.Class metadata,
       String packageName,
-      int[] metadataVersion,
       DexClass hostClass,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
@@ -161,7 +155,7 @@
             || (anonymousObjectOrigin != null
                 && kmClass.name.equals(anonymousObjectOrigin.toKotlinClassifier(true)));
     return new KotlinClassInfo(
-        kmClass,
+        metadata,
         nameCanBeDeducedFromClassOrOrigin,
         JvmExtensionsKt.getModuleName(kmClass),
         container,
@@ -175,7 +169,6 @@
         packageName,
         KotlinLocalDelegatedPropertyInfo.create(
             JvmExtensionsKt.getLocalDelegatedProperties(kmClass), factory, reporter),
-        metadataVersion,
         kmClass.getInlineClassUnderlyingPropertyName(),
         KotlinTypeInfo.create(kmClass.getInlineClassUnderlyingType(), factory, reporter),
         originalMembersWithKotlinInfo,
@@ -279,6 +272,7 @@
   @Override
   @SuppressWarnings("ReferenceEquality")
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
+    KmClass kmClass = classMetadata.getKmClass();
     KmClass rewrittenKmClass = new KmClass();
     KotlinFlagUtils.copyAllFlags(kmClass, rewrittenKmClass);
     // Set potentially renamed class name.
@@ -444,8 +438,9 @@
     rewritten |=
         localDelegatedProperties.rewrite(
             JvmExtensionsKt.getLocalDelegatedProperties(rewrittenKmClass)::add, appView);
+    classMetadata.setKmClass(rewrittenKmClass);
     return Pair.create(
-        Companion.writeClass(rewrittenKmClass, getCompatibleKotlinInfo(), 0),
+        classMetadata.write(),
         rewritten || !originalMembersWithKotlinInfo.isEqual(rewrittenReferences, appView));
   }
 
@@ -456,7 +451,7 @@
 
   @Override
   public int[] getMetadataVersion() {
-    return metadataVersion;
+    return KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
index 4a66565..715d376 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -218,29 +218,26 @@
       Consumer<DexEncodedMethod> keepByteCode) {
     Metadata metadata = extractMetadataWithPossiblyUnsupportedMetadataVersion(kMetadata);
     String packageName = metadata.pn();
-    int[] metadataVersion = KotlinJvmMetadataVersionUtils.toIntArray(kMetadata.getVersion());
     if (kMetadata instanceof KotlinClassMetadata.Class) {
       return KotlinClassInfo.create(
           (KotlinClassMetadata.Class) kMetadata,
           packageName,
-          metadataVersion,
           clazz,
           appView,
           keepByteCode);
     } else if (kMetadata instanceof KotlinClassMetadata.FileFacade) {
       // e.g., B.kt becomes class `BKt`
       return KotlinFileFacadeInfo.create(
-          (FileFacade) kMetadata, packageName, metadataVersion, clazz, appView, keepByteCode);
+          (FileFacade) kMetadata, packageName, clazz, appView, keepByteCode);
     } else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassFacade) {
       // multi-file class with the same @JvmName.
       return KotlinMultiFileClassFacadeInfo.create(
-          (MultiFileClassFacade) kMetadata, packageName, metadataVersion, appView.dexItemFactory());
+          (MultiFileClassFacade) kMetadata, packageName, appView.dexItemFactory());
     } else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassPart) {
       // A single file, which is part of multi-file class.
       return KotlinMultiFileClassPartInfo.create(
           (MultiFileClassPart) kMetadata,
           packageName,
-          metadataVersion,
           clazz,
           appView,
           keepByteCode);
@@ -248,7 +245,6 @@
       return KotlinSyntheticClassInfo.create(
           (KotlinClassMetadata.SyntheticClass) kMetadata,
           packageName,
-          metadataVersion,
           clazz,
           kotlin,
           appView);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
index 2c46b82..4f66ccd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -4,9 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -20,29 +17,28 @@
 // Holds information about Metadata.FileFacade
 public class KotlinFileFacadeInfo implements KotlinClassLevelInfo {
 
+  private final FileFacade kmFileFacade;
   private final KotlinPackageInfo packageInfo;
   private final String packageName;
-  private final int[] metadataVersion;
 
   private KotlinFileFacadeInfo(
-      KotlinPackageInfo packageInfo, String packageName, int[] metadataVersion) {
+      FileFacade kmFileFacade, KotlinPackageInfo packageInfo, String packageName) {
+    this.kmFileFacade = kmFileFacade;
     this.packageInfo = packageInfo;
     this.packageName = packageName;
-    this.metadataVersion = metadataVersion;
   }
 
   public static KotlinFileFacadeInfo create(
       FileFacade kmFileFacade,
       String packageName,
-      int[] metadataVersion,
       DexClass clazz,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
     KmPackage kmPackage = kmFileFacade.getKmPackage();
     return new KotlinFileFacadeInfo(
+        kmFileFacade,
         KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
-        packageName,
-        metadataVersion);
+        packageName);
   }
 
   @Override
@@ -59,8 +55,8 @@
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
     KmPackage kmPackage = new KmPackage();
     boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
-    return Pair.create(
-        Companion.writeFileFacade(kmPackage, getCompatibleKotlinInfo(), 0), rewritten);
+    kmFileFacade.setKmPackage(kmPackage);
+    return Pair.create(kmFileFacade.write(), rewritten);
   }
 
   @Override
@@ -74,7 +70,7 @@
 
   @Override
   public int[] getMetadataVersion() {
-    return metadataVersion;
+    return KotlinJvmMetadataVersionUtils.toIntArray(kmFileFacade.getVersion());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index c2f31ef..170a7a2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -220,20 +220,6 @@
     return DescriptorUtils.descriptorToKotlinClassifier(descriptor);
   }
 
-  static int[] getCompatibleKotlinInfo() {
-    // The kotlin metadata changelog recommends:
-    // "Main migration path here is to replace KotlinClassMetadata.COMPATIBLE_METADATA_VERSION
-    // with new value with the same meaning: JvmMetadataVersion.LATEST_STABLE_SUPPORTED."
-    // The inspection error "Usage of Kotlin internal declaration from different module" does not
-    // prevent the code to work correctly.
-    return JvmMetadataVersion.LATEST_STABLE_SUPPORTED.toIntArray();
-  }
-
-  static <TKm> TKm consume(TKm tKm, Consumer<TKm> consumer) {
-    consumer.accept(tKm);
-    return tKm;
-  }
-
   static <TInfo, TKm> boolean rewriteIfNotNull(
       AppView<?> appView,
       TInfo info,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
index db4ab66..bcb8c9b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -4,9 +4,7 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
 import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
@@ -22,21 +20,22 @@
 // Holds information about Metadata.MultiFileClassFace
 public class KotlinMultiFileClassFacadeInfo implements KotlinClassLevelInfo {
 
+  private final MultiFileClassFacade kmMultiFileClassFacade;
   private final List<KotlinTypeReference> partClassNames;
   private final String packageName;
-  private final int[] metadataVersion;
 
   private KotlinMultiFileClassFacadeInfo(
-      List<KotlinTypeReference> partClassNames, String packageName, int[] metadataVersion) {
+      MultiFileClassFacade kmMultiFileClassFacade,
+      List<KotlinTypeReference> partClassNames,
+      String packageName) {
+    this.kmMultiFileClassFacade = kmMultiFileClassFacade;
     this.partClassNames = partClassNames;
     this.packageName = packageName;
-    this.metadataVersion = metadataVersion;
   }
 
   static KotlinMultiFileClassFacadeInfo create(
       MultiFileClassFacade kmMultiFileClassFacade,
       String packageName,
-      int[] metadataVersion,
       DexItemFactory factory) {
     ImmutableList.Builder<KotlinTypeReference> builder = ImmutableList.builder();
     for (String partClassName : kmMultiFileClassFacade.getPartClassNames()) {
@@ -44,7 +43,7 @@
           KotlinTypeReference.fromBinaryNameOrKotlinClassifier(
               partClassName, factory, partClassName));
     }
-    return new KotlinMultiFileClassFacadeInfo(builder.build(), packageName, metadataVersion);
+    return new KotlinMultiFileClassFacadeInfo(kmMultiFileClassFacade, builder.build(), packageName);
   }
 
   @Override
@@ -72,9 +71,8 @@
               appView,
               null);
     }
-    return Pair.create(
-        Companion.writeMultiFileClassFacade(partClassNameStrings, getCompatibleKotlinInfo(), 0),
-        rewritten);
+    kmMultiFileClassFacade.setPartClassNames(partClassNameStrings);
+    return Pair.create(kmMultiFileClassFacade.write(), rewritten);
   }
 
   @Override
@@ -84,7 +82,7 @@
 
   @Override
   public int[] getMetadataVersion() {
-    return metadataVersion;
+    return KotlinJvmMetadataVersionUtils.toIntArray(kmMultiFileClassFacade.getVersion());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
index 6c00f88..d780c13 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -4,9 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -20,35 +17,26 @@
 // Holds information about Metadata.MultiFileClassPartInfo
 public class KotlinMultiFileClassPartInfo implements KotlinClassLevelInfo {
 
-  private final String facadeClassName;
+  private final MultiFileClassPart classPart;
   private final KotlinPackageInfo packageInfo;
   private final String packageName;
-  private final int[] metadataVersion;
 
   private KotlinMultiFileClassPartInfo(
-      String facadeClassName,
-      KotlinPackageInfo packageInfo,
-      String packageName,
-      int[] metadataVersion) {
-    this.facadeClassName = facadeClassName;
+      MultiFileClassPart classPart, KotlinPackageInfo packageInfo, String packageName) {
+    this.classPart = classPart;
     this.packageInfo = packageInfo;
     this.packageName = packageName;
-    this.metadataVersion = metadataVersion;
   }
 
   static KotlinMultiFileClassPartInfo create(
       MultiFileClassPart classPart,
       String packageName,
-      int[] metadataVersion,
       DexClass clazz,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
     KmPackage kmPackage = classPart.getKmPackage();
     return new KotlinMultiFileClassPartInfo(
-        classPart.getFacadeClassName(),
-        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
-        packageName,
-        metadataVersion);
+        classPart, KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode), packageName);
   }
 
   @Override
@@ -65,9 +53,8 @@
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
     KmPackage kmPackage = new KmPackage();
     boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
-    return Pair.create(
-        Companion.writeMultiFileClassPart(kmPackage, facadeClassName, getCompatibleKotlinInfo(), 0),
-        rewritten);
+    classPart.setKmPackage(kmPackage);
+    return Pair.create(classPart.write(), rewritten);
   }
 
   @Override
@@ -81,7 +68,7 @@
 
   @Override
   public int[] getMetadataVersion() {
-    return metadataVersion;
+    return KotlinJvmMetadataVersionUtils.toIntArray(classPart.getVersion());
   }
 
   @Override
@@ -90,6 +77,6 @@
   }
 
   public String getFacadeClassName() {
-    return facadeClassName;
+    return classPart.getFacadeClassName();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index 5e31efb..068c60c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -4,9 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -19,9 +16,9 @@
 // Holds information about a Metadata.SyntheticClass object.
 public class KotlinSyntheticClassInfo implements KotlinClassLevelInfo {
 
+  private final SyntheticClass syntheticClass;
   private final KotlinLambdaInfo lambda;
   private final String packageName;
-  private final int[] metadataVersion;
 
   public enum Flavour {
     KotlinStyleLambda,
@@ -32,29 +29,28 @@
   private final Flavour flavour;
 
   private KotlinSyntheticClassInfo(
-      KotlinLambdaInfo lambda, Flavour flavour, String packageName, int[] metadataVersion) {
+      SyntheticClass syntheticClass, KotlinLambdaInfo lambda, Flavour flavour, String packageName) {
+    this.syntheticClass = syntheticClass;
     this.lambda = lambda;
     this.flavour = flavour;
     this.packageName = packageName;
-    this.metadataVersion = metadataVersion;
   }
 
   static KotlinSyntheticClassInfo create(
       SyntheticClass syntheticClass,
       String packageName,
-      int[] metadataVersion,
       DexClass clazz,
       Kotlin kotlin,
       AppView<?> appView) {
     KmLambda lambda = syntheticClass.getKmLambda();
     assert lambda == null || syntheticClass.isLambda();
     return new KotlinSyntheticClassInfo(
+        syntheticClass,
         lambda != null
             ? KotlinLambdaInfo.create(clazz, lambda, appView.dexItemFactory(), appView.reporter())
             : null,
         getFlavour(clazz, kotlin),
-        packageName,
-        metadataVersion);
+        packageName);
   }
 
   public boolean isLambda() {
@@ -74,13 +70,14 @@
   @Override
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
     if (lambda == null) {
-      return Pair.create(Companion.writeSyntheticClass(getCompatibleKotlinInfo(), 0), false);
+      return Pair.create(syntheticClass.write(), false);
     }
     Box<KmLambda> newLambda = new Box<>();
     boolean rewritten = lambda.rewrite(newLambda::set, clazz, appView);
     assert newLambda.isSet();
-    return Pair.create(
-        Companion.writeLambda(newLambda.get(), getCompatibleKotlinInfo(), 0), rewritten);
+    syntheticClass.setKmLambda(newLambda.get());
+    syntheticClass.setFlags(0);
+    return Pair.create(syntheticClass.write(), rewritten);
   }
 
   @Override
@@ -97,7 +94,7 @@
 
   @Override
   public int[] getMetadataVersion() {
-    return metadataVersion;
+    return KotlinJvmMetadataVersionUtils.toIntArray(syntheticClass.getVersion());
   }
 
   @SuppressWarnings("ReferenceEquality")