Use sorted method backing when ensuring fixed class

Bug: 190567248
Change-Id: I60e3b13176c8c7473d6524ec87bb43f5e9eb05c7
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index 35e0541..635132f 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -7,6 +7,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Consumer;
@@ -137,7 +138,7 @@
   public List<DexEncodedMethod> allMethodsSorted() {
     List<DexEncodedMethod> sorted = new ArrayList<>(size());
     forEachMethod(sorted::add);
-    sorted.sort((a, b) -> a.getReference().compareTo(b.getReference()));
+    sorted.sort(Comparator.comparing(DexEncodedMember::getReference));
     return sorted;
   }
 
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
index 65c510c..737ffa6 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticClassBuilder.java
@@ -43,6 +43,7 @@
   private DexType superType;
   private DexTypeList interfaces = DexTypeList.empty();
   private DexString sourceFile = null;
+  private boolean useSortedMethodBacking = false;
   private List<DexEncodedField> staticFields = new ArrayList<>();
   private List<DexEncodedField> instanceFields = new ArrayList<>();
   private List<DexEncodedMethod> directMethods = new ArrayList<>();
@@ -143,6 +144,11 @@
     return self();
   }
 
+  public B setUseSortedMethodBacking(boolean useSortedMethodBacking) {
+    this.useSortedMethodBacking = useSortedMethodBacking;
+    return self();
+  }
+
   public C build() {
     int flag = isAbstract ? Constants.ACC_ABSTRACT : Constants.ACC_FINAL;
     int itfFlag = isInterface ? Constants.ACC_INTERFACE : 0;
@@ -167,27 +173,34 @@
             + 11 * (long) virtualMethods.hashCode()
             + 13 * (long) staticFields.hashCode()
             + 17 * (long) instanceFields.hashCode();
-    return getClassKind()
-        .create(
-            type,
-            originKind,
-            origin,
-            accessFlags,
-            superType,
-            interfaces,
-            sourceFile,
-            nestHost,
-            nestMembers,
-            enclosingMembers,
-            innerClasses,
-            signature,
-            DexAnnotationSet.empty(),
-            staticFields.toArray(DexEncodedField.EMPTY_ARRAY),
-            instanceFields.toArray(DexEncodedField.EMPTY_ARRAY),
-            directMethods.toArray(DexEncodedMethod.EMPTY_ARRAY),
-            virtualMethods.toArray(DexEncodedMethod.EMPTY_ARRAY),
-            factory.getSkipNameValidationForTesting(),
-            c -> checksum,
-            null);
+    C clazz =
+        getClassKind()
+            .create(
+                type,
+                originKind,
+                origin,
+                accessFlags,
+                superType,
+                interfaces,
+                sourceFile,
+                nestHost,
+                nestMembers,
+                enclosingMembers,
+                innerClasses,
+                signature,
+                DexAnnotationSet.empty(),
+                staticFields.toArray(DexEncodedField.EMPTY_ARRAY),
+                instanceFields.toArray(DexEncodedField.EMPTY_ARRAY),
+                DexEncodedMethod.EMPTY_ARRAY,
+                DexEncodedMethod.EMPTY_ARRAY,
+                factory.getSkipNameValidationForTesting(),
+                c -> checksum,
+                null);
+    if (useSortedMethodBacking) {
+      clazz.getMethodCollection().useSortedBacking();
+    }
+    clazz.setDirectMethods(directMethods.toArray(DexEncodedMethod.EMPTY_ARRAY));
+    clazz.setVirtualMethods(virtualMethods.toArray(DexEncodedMethod.EMPTY_ARRAY));
+    return clazz;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 2d0970f..3bd99a2 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -541,7 +541,15 @@
       }
       assert !isSyntheticClass(type);
       DexProgramClass dexProgramClass =
-          internalCreateClass(kind, fn, outerContext, type, appView.dexItemFactory());
+          internalCreateClass(
+              kind,
+              syntheticProgramClassBuilder -> {
+                syntheticProgramClassBuilder.setUseSortedMethodBacking(true);
+                fn.accept(syntheticProgramClassBuilder);
+              },
+              outerContext,
+              type,
+              appView.dexItemFactory());
       onCreationConsumer.accept(dexProgramClass);
       return dexProgramClass;
     }