Unify handling of fields and methods in class constructors

Change-Id: I457905e4dfd7e08e226d2f4d01b3a49e6afd353a
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
index 9871104..c51a753 100644
--- a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.DexAnnotationSet;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexLibraryClass;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -28,6 +27,7 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
 import com.android.tools.r8.graph.NestHostClassAttribute;
@@ -233,8 +233,7 @@
         Collections.emptyList(),
         ClassSignature.noSignature(),
         DexAnnotationSet.empty(),
-        DexEncodedField.EMPTY_ARRAY,
-        DexEncodedField.EMPTY_ARRAY,
+        FieldCollectionFactory.empty(),
         MethodCollectionFactory.empty(),
         factory.getSkipNameValidationForTesting(),
         DexProgramClass::invalidChecksumRequest,
diff --git a/src/main/java/com/android/tools/r8/graph/ClassKind.java b/src/main/java/com/android/tools/r8/graph/ClassKind.java
index 9d6df7a..0e69cc3 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassKind.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassKind.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.graph.DexProgramClass.ChecksumSupplier;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
 import com.android.tools.r8.origin.Origin;
@@ -57,8 +58,7 @@
                   innerClasses,
                   classSignature,
                   classAnnotations,
-                  staticFields,
-                  instanceFields,
+                  FieldCollectionFactory.fromFields(instanceFields, staticFields),
                   MethodCollectionFactory.fromMethods(directMethods, virtualMethods),
                   skipNameValidationForTesting,
                   checksumSupplier,
@@ -106,8 +106,7 @@
                   innerClasses,
                   classSignature,
                   annotations,
-                  staticFields,
-                  instanceFields,
+                  FieldCollectionFactory.fromFields(instanceFields, staticFields),
                   MethodCollectionFactory.fromMethods(directMethods, virtualMethods),
                   skipNameValidationForTesting),
           DexClass::isClasspathClass);
@@ -152,8 +151,7 @@
                   innerClasses,
                   classSignature,
                   annotations,
-                  staticFields,
-                  instanceFields,
+                  FieldCollectionFactory.fromFields(instanceFields, staticFields),
                   MethodCollectionFactory.fromMethods(directMethods, virtualMethods),
                   skipNameValidationForTesting),
           DexClass::isLibraryClass);
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 0d13e20..14c4684 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
@@ -87,15 +88,13 @@
   /** Generic signature information if the attribute is present in the input */
   protected ClassSignature classSignature;
 
-  @SuppressWarnings("ReferenceEquality")
   public DexClass(
       DexString sourceFile,
       DexTypeList interfaces,
       ClassAccessFlags accessFlags,
       DexType superType,
       DexType type,
-      DexEncodedField[] staticFields,
-      DexEncodedField[] instanceFields,
+      FieldCollectionFactory fieldCollectionFactory,
       MethodCollectionFactory methodCollectionFactory,
       NestHostClassAttribute nestHost,
       List<NestMemberClassAttribute> nestMembers,
@@ -115,7 +114,7 @@
     this.accessFlags = accessFlags;
     this.superType = superType;
     this.type = type;
-    this.fieldCollection = FieldCollection.create(this, staticFields, instanceFields);
+    this.fieldCollection = fieldCollectionFactory.create(this);
     this.methodCollection = methodCollectionFactory.create(this);
     this.nestHost = nestHost;
     this.nestMembers = nestMembers;
@@ -128,19 +127,17 @@
     assert classSignature != null;
     this.classSignature = classSignature;
     assert GenericSignatureUtils.verifyNoDuplicateGenericDefinitions(classSignature, annotations);
-    if (type == superType) {
-      throw new CompilationError("Class " + type.toString() + " cannot extend itself");
+    if (type.isIdenticalTo(superType)) {
+      throw new CompilationError("Class " + type + " cannot extend itself");
     }
-    for (DexType interfaceType : interfaces.values) {
-      if (type == interfaceType) {
-        throw new CompilationError("Interface " + type.toString() + " cannot implement itself");
+    for (DexType interfaceType : interfaces) {
+      if (type.isIdenticalTo(interfaceType)) {
+        throw new CompilationError("Interface " + type + " cannot implement itself");
       }
     }
     if (!skipNameValidationForTesting && !type.descriptor.isValidClassDescriptor()) {
       throw new CompilationError(
-          "Class descriptor '"
-              + type.descriptor.toString()
-              + "' cannot be represented in dex format.");
+          "Class descriptor '" + type.descriptor + "' cannot be represented in dex format.");
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java b/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
index 9c11896..25248cb 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClasspathClass.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
 import com.android.tools.r8.kotlin.KotlinClassLevelInfo;
@@ -41,8 +42,7 @@
       List<InnerClassAttribute> innerClasses,
       ClassSignature classSignature,
       DexAnnotationSet annotations,
-      DexEncodedField[] staticFields,
-      DexEncodedField[] instanceFields,
+      FieldCollectionFactory fieldCollectionFactory,
       MethodCollectionFactory methodCollectionFactory,
       boolean skipNameValidationForTesting) {
     super(
@@ -51,8 +51,7 @@
         accessFlags,
         superType,
         type,
-        staticFields,
-        instanceFields,
+        fieldCollectionFactory,
         methodCollectionFactory,
         nestHost,
         nestMembers,
diff --git a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
index 7dc2241..d537562 100644
--- a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
@@ -7,12 +7,12 @@
 import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
 import com.android.tools.r8.kotlin.KotlinClassLevelInfo;
 import com.android.tools.r8.origin.Origin;
 import com.google.common.collect.Streams;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -39,8 +39,7 @@
       List<InnerClassAttribute> innerClasses,
       ClassSignature classSignature,
       DexAnnotationSet annotations,
-      DexEncodedField[] staticFields,
-      DexEncodedField[] instanceFields,
+      FieldCollectionFactory fieldCollectionFactory,
       MethodCollectionFactory methodCollectionFactory,
       boolean skipNameValidationForTesting) {
     super(
@@ -49,8 +48,7 @@
         accessFlags,
         superType,
         type,
-        staticFields,
-        instanceFields,
+        fieldCollectionFactory,
         methodCollectionFactory,
         nestHost,
         nestMembers,
@@ -62,12 +60,11 @@
         annotations,
         origin,
         skipNameValidationForTesting);
+    assert Streams.stream(fields()).allMatch(DexLibraryClass::verifyLibraryField);
     assert Streams.stream(methods()).allMatch(DexLibraryClass::verifyLibraryMethod);
-    assert Arrays.stream(staticFields).allMatch(DexLibraryClass::verifyLibraryField);
-    assert Arrays.stream(instanceFields).allMatch(DexLibraryClass::verifyLibraryField);
     // Set all static field values to unknown. We don't want to use the value from the library
     // at compile time, as it can be different at runtime.
-    for (DexEncodedField staticField : staticFields) {
+    for (DexEncodedField staticField : staticFields()) {
       staticField.clearStaticValue();
     }
     assert kind == Kind.CF : "Invalid kind " + kind + " for library-path class " + type;
@@ -230,8 +227,7 @@
           innerClasses,
           classSignature,
           annotations,
-          staticFields,
-          instanceFields,
+          FieldCollectionFactory.fromFields(instanceFields, staticFields),
           MethodCollectionFactory.fromMethods(directMethods, virtualMethods),
           skipNameValidationForTesting);
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index c9ca7e4..b5f8a5c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -76,8 +77,7 @@
       List<InnerClassAttribute> innerClasses,
       ClassSignature classSignature,
       DexAnnotationSet classAnnotations,
-      DexEncodedField[] staticFields,
-      DexEncodedField[] instanceFields,
+      FieldCollectionFactory fieldCollectionFactory,
       MethodCollectionFactory methodCollectionFactory,
       boolean skipNameValidationForTesting,
       ChecksumSupplier checksumSupplier,
@@ -89,8 +89,7 @@
         accessFlags,
         superType,
         type,
-        staticFields,
-        instanceFields,
+        fieldCollectionFactory,
         methodCollectionFactory,
         nestHost,
         nestMembers,
@@ -126,8 +125,7 @@
       List<InnerClassAttribute> innerClasses,
       ClassSignature classSignature,
       DexAnnotationSet classAnnotations,
-      DexEncodedField[] staticFields,
-      DexEncodedField[] instanceFields,
+      FieldCollectionFactory fieldCollectionFactory,
       MethodCollectionFactory methodCollectionFactory,
       boolean skipNameValidationForTesting,
       ChecksumSupplier checksumSupplier,
@@ -148,8 +146,7 @@
         innerClasses,
         classSignature,
         classAnnotations,
-        staticFields,
-        instanceFields,
+        fieldCollectionFactory,
         methodCollectionFactory,
         skipNameValidationForTesting,
         checksumSupplier,
@@ -174,8 +171,7 @@
         Collections.emptyList(),
         ClassSignature.noSignature(),
         DexAnnotationSet.empty(),
-        DexEncodedField.EMPTY_ARRAY,
-        DexEncodedField.EMPTY_ARRAY,
+        FieldCollectionFactory.empty(),
         MethodCollectionFactory.empty(),
         false,
         DexProgramClass::invalidChecksumRequest,
diff --git a/src/main/java/com/android/tools/r8/graph/FieldCollection.java b/src/main/java/com/android/tools/r8/graph/FieldCollection.java
index 2c4b920..b9ad6df 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldCollection.java
@@ -15,6 +15,25 @@
 
 public class FieldCollection {
 
+  @FunctionalInterface
+  public interface FieldCollectionFactory {
+
+    FieldCollection create(DexClass holder);
+
+    static FieldCollectionFactory empty() {
+      return fromFields(DexEncodedField.EMPTY_ARRAY, DexEncodedField.EMPTY_ARRAY);
+    }
+
+    static FieldCollectionFactory fromFields(
+        DexEncodedField[] instanceFields, DexEncodedField[] staticFields) {
+      return holder -> FieldCollection.create(holder, staticFields, instanceFields);
+    }
+
+    static FieldCollectionFactory fromFieldCollection(FieldCollection collection) {
+      return holder -> new FieldCollection(holder, collection.backing);
+    }
+  }
+
   // Threshold between using an array and a map for the backing store.
   // The choice of 30 is just a copy from the method backing threshold.
   private static final int ARRAY_BACKING_THRESHOLD = 30;
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
index 9f40e9f..78a001b 100644
--- a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.NestHostClassAttribute;
 import com.android.tools.r8.graph.NestMemberClassAttribute;
@@ -132,8 +133,7 @@
             fixupInnerClassAttributes(clazz.getInnerClasses()),
             clazz.getClassSignature(),
             clazz.annotations(),
-            DexEncodedField.EMPTY_ARRAY,
-            DexEncodedField.EMPTY_ARRAY,
+            FieldCollectionFactory.empty(),
             newHolder -> clazz.getMethodCollection().fixup(newHolder, this::fixupMethod),
             dexItemFactory.getSkipNameValidationForTesting(),
             clazz.getChecksumSupplier(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
index 604299b..936089f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
@@ -5,11 +5,11 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexTypeList;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -86,8 +86,7 @@
             Collections.emptyList(),
             emulatedInterface.getClassSignature(),
             emulatedInterface.annotations(),
-            DexEncodedField.EMPTY_ARRAY,
-            DexEncodedField.EMPTY_ARRAY,
+            FieldCollectionFactory.empty(),
             MethodCollectionFactory.fromMethods(newDirectMethods, newVirtualMethods),
             false,
             emulatedInterface.getChecksumSupplier(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
index 2084f67..68a0775 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
@@ -45,6 +45,7 @@
     factory.createSynthesizedType("[Ljava/lang/Object;");
     factory.createSynthesizedType("[Ljava/lang/String;");
   }
+
   public static CfCode RecordMethods_toString(DexItemFactory factory, DexMethod method) {
     CfLabel label0 = new CfLabel();
     CfLabel label1 = new CfLabel();
diff --git a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
index 3354e65..10ff74a 100644
--- a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
+++ b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerFactory.java
@@ -26,6 +26,7 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -54,8 +55,7 @@
         Collections.emptyList(),
         ClassSignature.noSignature(),
         DexAnnotationSet.empty(),
-        createStaticFields(),
-        createInstanceFields(),
+        FieldCollectionFactory.fromFields(createInstanceFields(), createStaticFields()),
         MethodCollectionFactory.fromMethods(
             createDirectMethods(dexItemFactory), createVirtualMethods(dexItemFactory)),
         dexItemFactory.getSkipNameValidationForTesting(),
diff --git a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
index a70f457..27e1ed6 100644
--- a/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
+++ b/src/main/java/com/android/tools/r8/startup/generated/InstrumentationServerImplFactory.java
@@ -43,6 +43,7 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
 import com.android.tools.r8.graph.FieldAccessFlags;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -76,8 +77,8 @@
         Collections.emptyList(),
         ClassSignature.noSignature(),
         DexAnnotationSet.empty(),
-        createStaticFields(dexItemFactory),
-        createInstanceFields(dexItemFactory),
+        FieldCollectionFactory.fromFields(
+            createInstanceFields(dexItemFactory), createStaticFields(dexItemFactory)),
         MethodCollectionFactory.fromMethods(
             createDirectMethods(dexItemFactory), createVirtualMethods(dexItemFactory)),
         dexItemFactory.getSkipNameValidationForTesting(),
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
index 45c756e..3b84f5e 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfClassGenerator.java
@@ -131,17 +131,19 @@
 
     builder.startLine().append(imports.getDexAnnotationSet()).appendLine(".empty(),");
 
-    if (clazz.hasStaticFields()) {
-      builder.startLine().appendLine("createStaticFields(dexItemFactory),");
-    } else {
-      builder.startLine().appendLine("createStaticFields(),");
-    }
-
+    builder.startLine().append(imports.getFieldCollectionFactory()).appendLine(".fromFields(");
     if (clazz.hasInstanceFields()) {
-      builder.startLine().appendLine("createInstanceFields(dexItemFactory),");
+      builder.append("createInstanceFields(dexItemFactory)");
     } else {
-      builder.startLine().appendLine("createInstanceFields(),");
+      builder.append("createInstanceFields()");
     }
+    builder.append(", ");
+    if (clazz.hasStaticFields()) {
+      builder.append("createStaticFields(dexItemFactory)");
+    } else {
+      builder.append("createStaticFields()");
+    }
+    builder.append("),");
 
     builder
         .startLine()
@@ -152,7 +154,9 @@
 
     builder.startLine().appendLine("dexItemFactory.getSkipNameValidationForTesting(),");
 
-    builder.startLine().append(imports.getDexProgramClass()).append("::invalidChecksumRequest");
+    builder.startLine().append(imports.getDexProgramClass()).append("::invalidChecksumRequest,");
+
+    builder.startLine().append(imports.getReachabilitySensitiveValue()).append(".DISABLED");
 
     builder.appendClosingMultiLineParenthesis().appendLine(';');
     builder.appendClosingBrace();
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfCodeGeneratorImportCollection.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfCodeGeneratorImportCollection.java
index 12be5f6..c1015a8 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/CfCodeGeneratorImportCollection.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/CfCodeGeneratorImportCollection.java
@@ -67,6 +67,10 @@
     return getR8ClassName("graph", "FieldAccessFlags");
   }
 
+  String getFieldCollectionFactory() {
+    return getR8ClassName("graph.FieldCollection", "FieldCollectionFactory");
+  }
+
   String getFieldTypeSignature() {
     return getR8ClassName("graph.GenericSignature", "FieldTypeSignature");
   }
@@ -96,6 +100,10 @@
     return getR8ClassName("ProgramResource", "Kind");
   }
 
+  String getReachabilitySensitiveValue() {
+    return getR8ClassName("utils", "ReachabilitySensitiveValue");
+  }
+
   private String getR8ClassName(String context, String name) {
     String canonicalName =
         "com.android.tools.r8." + (context != null ? (context + ".") : "") + name;
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/GenerateTypeSwitchMethods.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/GenerateTypeSwitchMethods.java
index 5c5ec95..82e6888 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/GenerateTypeSwitchMethods.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/GenerateTypeSwitchMethods.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.FileUtils;
@@ -32,7 +31,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateTypeSwitchMethods(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/generation/GenerateDesugaredLibraryBridge.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/generation/GenerateDesugaredLibraryBridge.java
index 6c83010..631d3ee 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/generation/GenerateDesugaredLibraryBridge.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/generation/GenerateDesugaredLibraryBridge.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cfmethodgeneration.InstructionTypeMapper;
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
@@ -43,7 +42,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateDesugaredLibraryBridge(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/desugar/records/GenerateRecordMethods.java b/src/test/java/com/android/tools/r8/desugar/records/GenerateRecordMethods.java
index 9e491b3..1f01b2c 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/GenerateRecordMethods.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/GenerateRecordMethods.java
@@ -7,7 +7,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
 import com.android.tools.r8.graph.DexType;
@@ -32,7 +31,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateRecordMethods(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java b/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
index 11a7512..cfce913 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/GenerateEnumUnboxingMethods.java
@@ -7,7 +7,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
 import com.android.tools.r8.graph.DexType;
@@ -34,7 +33,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateEnumUnboxingMethods(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
index 6499f3d..c6b50ca 100644
--- a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
@@ -6,12 +6,12 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.graph.ClassAccessFlags;
 import com.android.tools.r8.graph.DexAnnotationSet;
-import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexTypeList;
+import com.android.tools.r8.graph.FieldCollection.FieldCollectionFactory;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -41,8 +41,7 @@
           Collections.emptyList(),
           ClassSignature.noSignature(),
           DexAnnotationSet.empty(),
-          DexEncodedField.EMPTY_ARRAY,
-          DexEncodedField.EMPTY_ARRAY,
+          FieldCollectionFactory.empty(),
           MethodCollectionFactory.empty(),
           false,
           DexProgramClass::invalidChecksumRequest,
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java b/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
index 5d9103c..96dd2e3 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/backports/GenerateBackportMethods.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
@@ -70,7 +69,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateBackportMethods(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/varhandle/GenerateVarHandleMethods.java b/src/test/java/com/android/tools/r8/ir/desugar/varhandle/GenerateVarHandleMethods.java
index 08281ff..718d3b3 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/varhandle/GenerateVarHandleMethods.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/varhandle/GenerateVarHandleMethods.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cfmethodgeneration.InstructionTypeMapper;
 import com.android.tools.r8.cfmethodgeneration.MethodGenerationBase;
@@ -45,7 +44,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   public GenerateVarHandleMethods(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/startup/GenerateInstrumentationServerClassesTest.java b/src/test/java/com/android/tools/r8/startup/GenerateInstrumentationServerClassesTest.java
index 5e7c7c5..8238492 100644
--- a/src/test/java/com/android/tools/r8/startup/GenerateInstrumentationServerClassesTest.java
+++ b/src/test/java/com/android/tools/r8/startup/GenerateInstrumentationServerClassesTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.cfmethodgeneration.CfClassGenerator;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.FileUtils;
@@ -31,7 +30,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withNoneRuntime().build();
   }
 
   @Test