Use JvmMetadataVersion instead of int[] when possible

Change-Id: I1a4999e3c025995d8d47d784cd8c336542f2eaf2
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 1b00d0c..023937c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -35,6 +35,7 @@
 import kotlin.metadata.KmConstructor;
 import kotlin.metadata.KmType;
 import kotlin.metadata.jvm.JvmExtensionsKt;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 import kotlin.metadata.jvm.JvmMethodSignature;
 import kotlin.metadata.jvm.KotlinClassMetadata;
 
@@ -452,8 +453,8 @@
   }
 
   @Override
-  public int[] getMetadataVersion() {
-    return KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion());
+  public JvmMetadataVersion getMetadataVersion() {
+    return classMetadata.getVersion();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
index d634e88..d9f4e16 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Pair;
 import kotlin.Metadata;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 
 public interface KotlinClassLevelInfo extends EnqueuerMetadataTraceable {
 
@@ -60,5 +61,5 @@
 
   String getPackageName();
 
-  int[] getMetadataVersion();
+  JvmMetadataVersion getMetadataVersion();
 }
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 07d4faa..c845cea 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -14,6 +14,7 @@
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmPackage;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 import kotlin.metadata.jvm.KotlinClassMetadata.FileFacade;
 
 // Holds information about Metadata.FileFacade
@@ -72,8 +73,8 @@
   }
 
   @Override
-  public int[] getMetadataVersion() {
-    return KotlinJvmMetadataVersionUtils.toIntArray(kmFileFacade.getVersion());
+  public JvmMetadataVersion getMetadataVersion() {
+    return kmFileFacade.getVersion();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index eb55ca1..5e5ed92 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.kotlin;
 
 import static com.android.tools.r8.kotlin.KotlinClassMetadataReader.toKotlinClassMetadata;
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.VERSION_1_4_0;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getInvalidKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataWriter.kotlinMetadataToString;
@@ -29,14 +30,10 @@
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 
 public class KotlinMetadataRewriter {
 
-  @SuppressWarnings("UnusedVariable")
-  // Due to a bug with nested classes and the lookup of RequirementVersion, we bump all metadata
-  // versions to 1.4 if compiled with kotlin 1.3 (1.1.16). For more information, see b/161885097.
-  private static final int[] METADATA_VERSION_1_4 = new int[] {1, 4, 0};
-
   private static final class WriteMetadataFieldInfo {
     final boolean writeKind;
     final boolean writeMetadataVersion;
@@ -181,7 +178,7 @@
                     createKotlinMetadataAnnotation(
                         kotlinMetadata.getFirst(),
                         kotlinInfo.getPackageName(),
-                        getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()),
+                        computeMetadataVersion(kotlinInfo.getMetadataVersion()),
                         writeMetadataFieldInfo)));
         return;
       }
@@ -189,7 +186,7 @@
           createKotlinMetadataAnnotation(
               kotlinMetadata.getFirst(),
               kotlinInfo.getPackageName(),
-              getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()),
+              computeMetadataVersion(kotlinInfo.getMetadataVersion()),
               writeMetadataFieldInfo);
       clazz.setAnnotations(clazz.annotations().rewrite(anno -> anno == oldMeta ? newMeta : anno));
     } catch (Throwable t) {
@@ -240,13 +237,14 @@
   private DexAnnotation createKotlinMetadataAnnotation(
       kotlin.Metadata metadata,
       String packageName,
-      int[] metadataVersion,
+      JvmMetadataVersion metadataVersion,
       WriteMetadataFieldInfo writeMetadataFieldInfo) {
     List<DexAnnotationElement> elements = new ArrayList<>();
     if (writeMetadataFieldInfo.writeMetadataVersion) {
       elements.add(
           new DexAnnotationElement(
-              kotlin.metadata.metadataVersion, createIntArray(metadataVersion)));
+              kotlin.metadata.metadataVersion,
+              createIntArray(KotlinJvmMetadataVersionUtils.toIntArray(metadataVersion))));
     }
     if (writeMetadataFieldInfo.writeKind) {
       elements.add(
@@ -297,22 +295,12 @@
     return new DexValueArray(values);
   }
 
-  // We are not sure that the format is <Major>-<Minor>-<Patch>, the format can be: <Major>-<Minor>.
-  private int[] getMaxVersion(int[] one, int[] other) {
-    assert one.length == 2 || one.length == 3;
-    assert other.length == 2 || other.length == 3;
-    if (one[0] != other[0]) {
-      return one[0] > other[0] ? one : other;
+  // Due to a bug with nested classes and the lookup of RequirementVersion, we bump all metadata
+  // versions to 1.4 if compiled with kotlin 1.3 (1.1.16). For more information, see b/161885097.
+  private JvmMetadataVersion computeMetadataVersion(JvmMetadataVersion other) {
+    if (VERSION_1_4_0.compareTo(other) >= 0) {
+      return VERSION_1_4_0;
     }
-    if (one[1] != other[1]) {
-      return one[1] > other[1] ? one : other;
-    }
-    int patchOne = one.length >= 3 ? one[2] : 0;
-    int patchOther = other.length >= 3 ? other[2] : 0;
-    if (patchOne != patchOther) {
-      return patchOne > patchOther ? one : other;
-    }
-    // They are equal up to patch, just return one.
-    return one;
+    return other;
   }
 }
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 9516e45..a4c7ec6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -33,7 +33,7 @@
 
 public class KotlinMetadataUtils {
 
-  private static final JvmMetadataVersion VERSION_1_4_0 = new JvmMetadataVersion(1, 4, 0);
+  public static final JvmMetadataVersion VERSION_1_4_0 = new JvmMetadataVersion(1, 4, 0);
   private static final NoKotlinInfo NO_KOTLIN_INFO = new NoKotlinInfo("NO_KOTLIN_INFO");
   private static final NoKotlinInfo INVALID_KOTLIN_INFO = new NoKotlinInfo("INVALID_KOTLIN_INFO");
 
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public int[] getMetadataVersion() {
+    public JvmMetadataVersion getMetadataVersion() {
       throw new Unreachable("Should never be called");
     }
 
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 b5a7771..f29f38b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -16,6 +16,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import kotlin.Metadata;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 import kotlin.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
 
 // Holds information about Metadata.MultiFileClassFace
@@ -83,8 +84,8 @@
   }
 
   @Override
-  public int[] getMetadataVersion() {
-    return KotlinJvmMetadataVersionUtils.toIntArray(kmMultiFileClassFacade.getVersion());
+  public JvmMetadataVersion getMetadataVersion() {
+    return 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 e18afb0..2f8381b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -14,6 +14,7 @@
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmPackage;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 import kotlin.metadata.jvm.KotlinClassMetadata.MultiFileClassPart;
 
 // Holds information about Metadata.MultiFileClassPartInfo
@@ -70,8 +71,8 @@
   }
 
   @Override
-  public int[] getMetadataVersion() {
-    return KotlinJvmMetadataVersionUtils.toIntArray(classPart.getVersion());
+  public JvmMetadataVersion getMetadataVersion() {
+    return classPart.getVersion();
   }
 
   @Override
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 6b3c485..c45373e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.utils.Pair;
 import kotlin.Metadata;
 import kotlin.metadata.KmLambda;
+import kotlin.metadata.jvm.JvmMetadataVersion;
 import kotlin.metadata.jvm.KotlinClassMetadata.SyntheticClass;
 
 // Holds information about a Metadata.SyntheticClass object.
@@ -96,8 +97,8 @@
   }
 
   @Override
-  public int[] getMetadataVersion() {
-    return KotlinJvmMetadataVersionUtils.toIntArray(syntheticClass.getVersion());
+  public JvmMetadataVersion getMetadataVersion() {
+    return syntheticClass.getVersion();
   }
 
   @SuppressWarnings("ReferenceEquality")
diff --git a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
index cbaf559..10e4601 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -110,7 +110,7 @@
     private final Map<String, List<Pair<String, String>>> multiClassFacadeOriginalToRenamed =
         new LinkedHashMap<>();
     private final Map<String, List<String>> multiClassPartToOriginal = new HashMap<>();
-    private final Box<int[]> metadataVersion = new Box<>();
+    private final Box<JvmMetadataVersion> metadataVersion = new Box<>();
 
     private KotlinModuleInfoBuilder(String moduleName, AppView<?> appView) {
       this.moduleName = moduleName;
@@ -183,8 +183,7 @@
       }
       return Optional.of(
           DataEntryResource.fromBytes(
-              new KotlinModuleMetadata(kmModule, new JvmMetadataVersion(metadataVersion.get()))
-                  .write(),
+              new KotlinModuleMetadata(kmModule, metadataVersion.get()).write(),
               "META-INF/" + moduleName + ".kotlin_module",
               Origin.unknown()));
     }