Reestablish ids for synthetics.

Bug: b/226978292
Change-Id: Ieb9c2bf51d260ca97dfa2cd23a2228c6516d41e6
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index e2a6f66..edc591e 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -12,6 +12,8 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.structural.Equatable;
 import com.android.tools.r8.utils.structural.Ordered;
+import it.unimi.dsi.fastutil.ints.IntArraySet;
+import it.unimi.dsi.fastutil.ints.IntSet;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -23,64 +25,67 @@
   private KindGenerator generator = new KindGenerator();
 
   // Global synthetics.
-  public final SyntheticKind RECORD_TAG = generator.forGlobalClass();
-  public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
+  public final SyntheticKind RECORD_TAG = generator.forGlobalClass(1);
+  public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass(33);
 
   // Classpath only synthetics in the global type namespace.
-  public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass();
-  public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
+  public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass(36);
+  public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS =
+      generator.forGlobalClasspathClass(29);
 
   // Fixed suffix synthetics. Each has a hygienic prefix type.
   public final SyntheticKind ENUM_UNBOXING_LOCAL_UTILITY_CLASS =
-      generator.forFixedClass("$EnumUnboxingLocalUtility");
+      generator.forFixedClass(24, "$EnumUnboxingLocalUtility");
   public final SyntheticKind ENUM_UNBOXING_SHARED_UTILITY_CLASS =
-      generator.forFixedClass("$EnumUnboxingSharedUtility");
-  public final SyntheticKind COMPANION_CLASS = generator.forFixedClass("$-CC");
+      generator.forFixedClass(25, "$EnumUnboxingSharedUtility");
+  public final SyntheticKind COMPANION_CLASS = generator.forFixedClass(2, "$-CC");
   public final SyntheticKind EMULATED_INTERFACE_CLASS =
-      generator.forFixedClass(InterfaceDesugaringForTesting.EMULATED_INTERFACE_CLASS_SUFFIX);
-  public final SyntheticKind RETARGET_CLASS = generator.forFixedClass("RetargetClass");
-  public final SyntheticKind RETARGET_INTERFACE = generator.forFixedClass("RetargetInterface");
-  public final SyntheticKind WRAPPER = generator.forFixedClass("$Wrapper");
-  public final SyntheticKind VIVIFIED_WRAPPER = generator.forFixedClass("$VivifiedWrapper");
-  public final SyntheticKind INIT_TYPE_ARGUMENT = generator.forFixedClass("-IA");
+      generator.forFixedClass(3, InterfaceDesugaringForTesting.EMULATED_INTERFACE_CLASS_SUFFIX);
+  public final SyntheticKind RETARGET_CLASS = generator.forFixedClass(20, "RetargetClass");
+  public final SyntheticKind RETARGET_INTERFACE = generator.forFixedClass(21, "RetargetInterface");
+  public final SyntheticKind WRAPPER = generator.forFixedClass(22, "$Wrapper");
+  public final SyntheticKind VIVIFIED_WRAPPER = generator.forFixedClass(23, "$VivifiedWrapper");
+  public final SyntheticKind INIT_TYPE_ARGUMENT = generator.forFixedClass(5, "-IA");
   public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_1 =
-      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$1");
+      generator.forFixedClass(6, SYNTHETIC_CLASS_SEPARATOR + "IA$1");
   public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_2 =
-      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$2");
+      generator.forFixedClass(7, SYNTHETIC_CLASS_SEPARATOR + "IA$2");
   public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_3 =
-      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$3");
-  public final SyntheticKind ENUM_CONVERSION = generator.forFixedClass("$EnumConversion");
+      generator.forFixedClass(8, SYNTHETIC_CLASS_SEPARATOR + "IA$3");
+  public final SyntheticKind ENUM_CONVERSION = generator.forFixedClass(31, "$EnumConversion");
 
   // Locally generated synthetic classes.
-  public final SyntheticKind LAMBDA = generator.forInstanceClass("Lambda");
+  public final SyntheticKind LAMBDA = generator.forInstanceClass(4, "Lambda");
 
   // TODO(b/214901256): Sharing of synthetic classes may lead to duplicate method errors.
   public final SyntheticKind NON_FIXED_INIT_TYPE_ARGUMENT =
-      generator.forNonSharableInstanceClass("$IA");
-  public final SyntheticKind CONST_DYNAMIC = generator.forInstanceClass("$Condy");
+      generator.forNonSharableInstanceClass(35, "$IA");
+  public final SyntheticKind CONST_DYNAMIC = generator.forInstanceClass(30, "$Condy");
 
   // Method synthetics.
   public final SyntheticKind ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD =
-      generator.forSingleMethod("CheckNotZero");
-  public final SyntheticKind RECORD_HELPER = generator.forSingleMethod("Record");
-  public final SyntheticKind BACKPORT = generator.forSingleMethod("Backport");
+      generator.forSingleMethod(27, "CheckNotZero");
+  public final SyntheticKind RECORD_HELPER = generator.forSingleMethod(9, "Record");
+  public final SyntheticKind BACKPORT = generator.forSingleMethod(10, "Backport");
   public final SyntheticKind BACKPORT_WITH_FORWARDING =
-      generator.forSingleMethod("BackportWithForwarding");
+      generator.forSingleMethod(34, "BackportWithForwarding");
   public final SyntheticKind STATIC_INTERFACE_CALL =
-      generator.forSingleMethod("StaticInterfaceCall");
-  public final SyntheticKind TO_STRING_IF_NOT_NULL = generator.forSingleMethod("ToStringIfNotNull");
-  public final SyntheticKind THROW_CCE_IF_NOT_NULL = generator.forSingleMethod("ThrowCCEIfNotNull");
-  public final SyntheticKind THROW_IAE = generator.forSingleMethod("ThrowIAE");
-  public final SyntheticKind THROW_ICCE = generator.forSingleMethod("ThrowICCE");
-  public final SyntheticKind THROW_NSME = generator.forSingleMethod("ThrowNSME");
-  public final SyntheticKind TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource");
-  public final SyntheticKind SERVICE_LOADER = generator.forSingleMethod("ServiceLoad");
-  public final SyntheticKind OUTLINE = generator.forSingleMethod("Outline");
-  public final SyntheticKind API_CONVERSION = generator.forSingleMethod("APIConversion");
+      generator.forSingleMethod(11, "StaticInterfaceCall");
+  public final SyntheticKind TO_STRING_IF_NOT_NULL =
+      generator.forSingleMethod(12, "ToStringIfNotNull");
+  public final SyntheticKind THROW_CCE_IF_NOT_NULL =
+      generator.forSingleMethod(13, "ThrowCCEIfNotNull");
+  public final SyntheticKind THROW_IAE = generator.forSingleMethod(14, "ThrowIAE");
+  public final SyntheticKind THROW_ICCE = generator.forSingleMethod(15, "ThrowICCE");
+  public final SyntheticKind THROW_NSME = generator.forSingleMethod(16, "ThrowNSME");
+  public final SyntheticKind TWR_CLOSE_RESOURCE = generator.forSingleMethod(17, "TwrCloseResource");
+  public final SyntheticKind SERVICE_LOADER = generator.forSingleMethod(18, "ServiceLoad");
+  public final SyntheticKind OUTLINE = generator.forSingleMethod(19, "Outline");
+  public final SyntheticKind API_CONVERSION = generator.forSingleMethod(26, "APIConversion");
   public final SyntheticKind API_CONVERSION_PARAMETERS =
-      generator.forSingleMethod("APIConversionParameters");
-  public final SyntheticKind ARRAY_CONVERSION = generator.forSingleMethod("$ArrayConversion");
-  public final SyntheticKind API_MODEL_OUTLINE = generator.forSingleMethod("ApiModelOutline");
+      generator.forSingleMethod(28, "APIConversionParameters");
+  public final SyntheticKind ARRAY_CONVERSION = generator.forSingleMethod(37, "$ArrayConversion");
+  public final SyntheticKind API_MODEL_OUTLINE = generator.forSingleMethod(32, "ApiModelOutline");
 
   private final List<SyntheticKind> ALL_KINDS = generator.getAllKinds();
 
@@ -89,48 +94,49 @@
   }
 
   public SyntheticKind fromId(int id) {
-    if (0 < id && id <= ALL_KINDS.size()) {
-      return ALL_KINDS.get(id - 1);
+    for (SyntheticKind kind : ALL_KINDS) {
+      if (kind.getId() == id) {
+        return kind;
+      }
     }
     return null;
   }
 
   private static class KindGenerator {
-    private int nextId = 1;
     private List<SyntheticKind> kinds = new ArrayList<>();
-
-    private int getNextId() {
-      return nextId++;
-    }
+    private IntSet usedIds = new IntArraySet();
 
     private SyntheticKind register(SyntheticKind kind) {
+      if (!usedIds.add(kind.getId())) {
+        throw new Unreachable("Invalid reuse of synthetic kind id: " + kind.getId());
+      }
       kinds.add(kind);
       return kind;
     }
 
-    SyntheticKind forSingleMethod(String descriptor) {
-      return register(new SyntheticMethodKind(getNextId(), descriptor));
+    SyntheticKind forSingleMethod(int id, String descriptor) {
+      return register(new SyntheticMethodKind(id, descriptor));
     }
 
     // TODO(b/214901256): Remove once fixed.
-    SyntheticKind forNonSharableInstanceClass(String descriptor) {
-      return register(new SyntheticClassKind(getNextId(), descriptor, false));
+    SyntheticKind forNonSharableInstanceClass(int id, String descriptor) {
+      return register(new SyntheticClassKind(id, descriptor, false));
     }
 
-    SyntheticKind forInstanceClass(String descriptor) {
-      return register(new SyntheticClassKind(getNextId(), descriptor, true));
+    SyntheticKind forInstanceClass(int id, String descriptor) {
+      return register(new SyntheticClassKind(id, descriptor, true));
     }
 
-    SyntheticKind forFixedClass(String descriptor) {
-      return register(new SyntheticFixedClassKind(getNextId(), descriptor, false));
+    SyntheticKind forFixedClass(int id, String descriptor) {
+      return register(new SyntheticFixedClassKind(id, descriptor, false));
     }
 
-    SyntheticKind forGlobalClass() {
-      return register(new SyntheticFixedClassKind(getNextId(), "", true));
+    SyntheticKind forGlobalClass(int id) {
+      return register(new SyntheticFixedClassKind(id, "", true));
     }
 
-    SyntheticKind forGlobalClasspathClass() {
-      return register(new SyntheticFixedClassKind(getNextId(), "", false));
+    SyntheticKind forGlobalClasspathClass(int id) {
+      return register(new SyntheticFixedClassKind(id, "", false));
     }
 
     List<SyntheticKind> getAllKinds() {