Move test helpers for creating app views to TestBase.

Change-Id: I2f5fd61932adcc31d4af5f0a24d4c6f8cfbdb67a
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index b90b40c..94e0237 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -19,13 +19,32 @@
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.AppServices;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexCode;
 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.DexProto;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.SmaliWriter;
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.TypeReference;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.shaking.EnqueuerFactory;
+import com.android.tools.r8.shaking.ProguardClassFilter;
+import com.android.tools.r8.shaking.ProguardClassNameList;
+import com.android.tools.r8.shaking.ProguardConfigurationRule;
+import com.android.tools.r8.shaking.ProguardKeepRule;
+import com.android.tools.r8.shaking.ProguardKeepRule.Builder;
+import com.android.tools.r8.shaking.ProguardKeepRuleType;
+import com.android.tools.r8.shaking.ProguardTypeMatcher;
+import com.android.tools.r8.shaking.RootSetBuilder;
+import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
 import com.android.tools.r8.shaking.serviceloader.ServiceLoaderMultipleTest.Greeter;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -34,6 +53,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.PreloadedClassFileProvider;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
@@ -66,6 +86,8 @@
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -387,6 +409,11 @@
     return buildClasses(programClasses, libraryClasses).build();
   }
 
+  protected static AndroidApp.Builder buildClasses(Collection<Class<?>> programClasses)
+      throws IOException {
+    return buildClasses(programClasses, Collections.emptyList());
+  }
+
   protected static AndroidApp.Builder buildClasses(
       Collection<Class<?>> programClasses, Collection<Class<?>> libraryClasses) throws IOException {
     AndroidApp.Builder builder = AndroidApp.builder();
@@ -527,6 +554,65 @@
     }
   }
 
+  protected static AppView<AppInfoWithSubtyping> computeAppViewWithSubtyping(AndroidApp app)
+      throws Exception {
+    Timing timing = new Timing();
+    InternalOptions options = new InternalOptions();
+    DexApplication application = new ApplicationReader(app, options, timing).read().toDirect();
+    AppView<AppInfoWithSubtyping> appView =
+        AppView.createForR8(new AppInfoWithSubtyping(application), options);
+    appView.setAppServices(AppServices.builder(appView).build());
+    return appView;
+  }
+
+  protected static AppView<AppInfoWithLiveness> computeAppViewWithLiveness(
+      AndroidApp app, Class<?> mainClass) throws Exception {
+    AppView<AppInfoWithSubtyping> appView = computeAppViewWithSubtyping(app);
+    // Run the tree shaker to compute an instance of AppInfoWithLiveness.
+    ExecutorService executor = Executors.newSingleThreadExecutor();
+    DexApplication application = appView.appInfo().app();
+    RootSet rootSet =
+        new RootSetBuilder(
+                appView, application, buildKeepRuleForClass(mainClass, application.dexItemFactory))
+            .run(executor);
+    AppInfoWithLiveness appInfoWithLiveness =
+        EnqueuerFactory.createForInitialTreeShaking(appView)
+            .traceApplication(rootSet, ProguardClassFilter.empty(), executor, application.timing);
+    // We do not run the tree pruner to ensure that the hierarchy is as designed and not modified
+    // due to liveness.
+    return appView.setAppInfo(appInfoWithLiveness);
+  }
+
+  protected static DexType buildType(TypeReference type, DexItemFactory factory) {
+    return factory.createType(type.getDescriptor());
+  }
+
+  protected static DexMethod buildMethod(MethodReference method, DexItemFactory factory) {
+    return factory.createMethod(
+        buildType(method.getHolderClass(), factory),
+        buildProto(method.getReturnType(), method.getFormalTypes(), factory),
+        method.getMethodName());
+  }
+
+  protected static DexProto buildProto(
+      TypeReference returnType, List<TypeReference> formalTypes, DexItemFactory factory) {
+    return factory.createProto(
+        returnType == null ? factory.voidType : buildType(returnType, factory),
+        ListUtils.map(formalTypes, type -> buildType(type, factory)));
+  }
+
+  private static List<ProguardConfigurationRule> buildKeepRuleForClass(
+      Class clazz, DexItemFactory factory) {
+    Builder keepRuleBuilder = ProguardKeepRule.builder();
+    keepRuleBuilder.setSource("buildKeepRuleForClass " + clazz.getTypeName());
+    keepRuleBuilder.setType(ProguardKeepRuleType.KEEP);
+    keepRuleBuilder.setClassNames(
+        ProguardClassNameList.singletonList(
+            ProguardTypeMatcher.create(
+                factory.createType(DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName())))));
+    return Collections.singletonList(keepRuleBuilder.build());
+  }
+
   /** Returns a list containing all the data resources in the given app. */
   public static List<DataEntryResource> getDataResources(AndroidApp app) throws ResourceException {
     List<DataEntryResource> dataResources = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index ec01f62..f52db8b 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -6,17 +6,12 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.AsmTestBase;
-import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.graph.AppInfo;
-import com.android.tools.r8.graph.AppInfoWithSubtyping;
-import com.android.tools.r8.graph.AppServices;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexApplication;
 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.DexType;
 import com.android.tools.r8.graph.ResolutionResult;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.resolution.singletarget.Main;
 import com.android.tools.r8.resolution.singletarget.one.AbstractSubClass;
 import com.android.tools.r8.resolution.singletarget.one.AbstractTopClass;
@@ -34,26 +29,10 @@
 import com.android.tools.r8.resolution.singletarget.two.OtherSubSubClassOne;
 import com.android.tools.r8.resolution.singletarget.two.OtherSubSubClassTwo;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.shaking.EnqueuerFactory;
-import com.android.tools.r8.shaking.ProguardClassFilter;
-import com.android.tools.r8.shaking.ProguardClassNameList;
-import com.android.tools.r8.shaking.ProguardConfigurationRule;
-import com.android.tools.r8.shaking.ProguardKeepRule;
-import com.android.tools.r8.shaking.ProguardKeepRule.Builder;
-import com.android.tools.r8.shaking.ProguardKeepRuleType;
-import com.android.tools.r8.shaking.ProguardTypeMatcher;
-import com.android.tools.r8.shaking.RootSetBuilder;
-import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.Timing;
 import com.google.common.collect.ImmutableList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -103,42 +82,11 @@
     this.allTargetHolders = allTargetHolders;
   }
 
-  public static AppInfoWithLiveness createAppInfoWithLiveness(AndroidApp app, Class<?> mainClass)
-      throws Exception {
-    // Run the tree shaker to compute an instance of AppInfoWithLiveness.
-    Timing timing = new Timing();
-    InternalOptions options = new InternalOptions();
-    DexApplication application = new ApplicationReader(app, options, timing).read().toDirect();
-    AppView<? extends AppInfoWithSubtyping> appView =
-        AppView.createForR8(new AppInfoWithSubtyping(application), options);
-    appView.setAppServices(AppServices.builder(appView).build());
-
-    ExecutorService executor = Executors.newSingleThreadExecutor();
-    RootSet rootSet =
-        new RootSetBuilder(
-                appView, application, buildKeepRuleForClass(mainClass, application.dexItemFactory))
-            .run(executor);
-    return EnqueuerFactory.createForInitialTreeShaking(appView)
-        .traceApplication(rootSet, ProguardClassFilter.empty(), executor, timing);
-    // We do not run the tree pruner to ensure that the hierarchy is as designed and not modified
-    // due to liveness.
-  }
-
   @BeforeClass
   public static void computeAppInfo() throws Exception {
-    appInfo = createAppInfoWithLiveness(readClassesAndAsmDump(CLASSES, ASM_CLASSES), Main.class);
-  }
-
-  private static List<ProguardConfigurationRule> buildKeepRuleForClass(Class clazz,
-      DexItemFactory factory) {
-    Builder keepRuleBuilder = ProguardKeepRule.builder();
-    keepRuleBuilder.setSource("buildKeepRuleForClass " + clazz.getTypeName());
-    keepRuleBuilder.setType(ProguardKeepRuleType.KEEP);
-    keepRuleBuilder.setClassNames(
-        ProguardClassNameList.singletonList(
-            ProguardTypeMatcher.create(
-                factory.createType(DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName())))));
-    return Collections.singletonList(keepRuleBuilder.build());
+    appInfo =
+        computeAppViewWithLiveness(readClassesAndAsmDump(CLASSES, ASM_CLASSES), Main.class)
+            .appInfo();
   }
 
   private static Object[] singleTarget(String name, Class<?> receiverAndTarget) {
@@ -244,19 +192,14 @@
         });
   }
 
-  public static DexMethod buildMethod(Class clazz, String name, AppInfo appInfo) {
-    return appInfo
-        .dexItemFactory()
-        .createMethod(
-            toType(clazz, appInfo),
-            appInfo.dexItemFactory().createProto(appInfo.dexItemFactory().voidType),
-            name);
+  public static DexMethod buildNullaryVoidMethod(Class clazz, String name, AppInfo appInfo) {
+    return buildMethod(
+        Reference.method(Reference.classFromClass(clazz), name, Collections.emptyList(), null),
+        appInfo.dexItemFactory());
   }
 
-  public static DexType toType(Class clazz, AppInfo appInfo) {
-    return appInfo
-        .dexItemFactory()
-        .createType(DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName()));
+  private static DexType toType(Class clazz, AppInfo appInfo) {
+    return buildType(Reference.classFromClass(clazz), appInfo.dexItemFactory());
   }
 
   private final String methodName;
@@ -266,7 +209,7 @@
 
   @Test
   public void lookupSingleTarget() {
-    DexMethod method = buildMethod(invokeReceiver, methodName, appInfo);
+    DexMethod method = buildNullaryVoidMethod(invokeReceiver, methodName, appInfo);
     Assert.assertNotNull(
         appInfo.resolveMethod(toType(invokeReceiver, appInfo), method).getSingleTarget());
     DexEncodedMethod singleVirtualTarget = appInfo.lookupSingleVirtualTarget(method, method.holder);
@@ -281,7 +224,7 @@
 
   @Test
   public void lookupVirtualTargets() {
-    DexMethod method = buildMethod(invokeReceiver, methodName, appInfo);
+    DexMethod method = buildNullaryVoidMethod(invokeReceiver, methodName, appInfo);
     Assert.assertNotNull(
         appInfo.resolveMethod(toType(invokeReceiver, appInfo), method).getSingleTarget());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
index ccdb49b..5fe17d5 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodTest.java
@@ -59,11 +59,11 @@
 
   @BeforeClass
   public static void computeAppInfo() throws Exception {
-    appInfo = SingleTargetLookupTest.createAppInfoWithLiveness(readClasses(CLASSES), Main.class);
+    appInfo = computeAppViewWithLiveness(readClasses(CLASSES), Main.class).appInfo();
   }
 
   private static DexMethod buildMethod(Class clazz, String name) {
-    return SingleTargetLookupTest.buildMethod(clazz, name, appInfo);
+    return SingleTargetLookupTest.buildNullaryVoidMethod(clazz, name, appInfo);
   }
 
   @Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodWithVirtualParentTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodWithVirtualParentTest.java
index f3191ac..22445e6 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodWithVirtualParentTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfPrivateStaticMethodWithVirtualParentTest.java
@@ -108,12 +108,11 @@
   @BeforeClass
   public static void computeAppInfo() throws Exception {
     appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            readClassesAndAsmDump(CLASSES, DUMPS), Main.class);
+        computeAppViewWithLiveness(readClassesAndAsmDump(CLASSES, DUMPS), Main.class).appInfo();
   }
 
   private static DexMethod buildMethod(Class clazz, String name) {
-    return SingleTargetLookupTest.buildMethod(clazz, name, appInfo);
+    return SingleTargetLookupTest.buildNullaryVoidMethod(clazz, name, appInfo);
   }
 
   @Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
index 7c435d3..63aa76f 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
@@ -95,12 +95,11 @@
   @BeforeClass
   public static void computeAppInfo() throws Exception {
     appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            readClassesAndAsmDump(CLASSES, DUMPS), Main.class);
+        computeAppViewWithLiveness(readClassesAndAsmDump(CLASSES, DUMPS), Main.class).appInfo();
   }
 
   private static DexMethod buildMethod(Class clazz, String name) {
-    return SingleTargetLookupTest.buildMethod(clazz, name, appInfo);
+    return SingleTargetLookupTest.buildNullaryVoidMethod(clazz, name, appInfo);
   }
 
   @Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
index e876ce0..22a12f2 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
@@ -142,12 +142,11 @@
   @BeforeClass
   public static void computeAppInfo() throws Exception {
     appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            readClassesAndAsmDump(CLASSES, DUMPS), Main.class);
+        computeAppViewWithLiveness(readClassesAndAsmDump(CLASSES, DUMPS), Main.class).appInfo();
   }
 
   private static DexMethod buildMethod(Class clazz, String name) {
-    return SingleTargetLookupTest.buildMethod(clazz, name, appInfo);
+    return SingleTargetLookupTest.buildNullaryVoidMethod(clazz, name, appInfo);
   }
 
   @Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
index c9a1c5e..2117ed6 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
@@ -15,8 +15,8 @@
 import com.android.tools.r8.graph.ResolutionResult;
 import com.android.tools.r8.resolution.SingleTargetLookupTest;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.utils.AndroidApp;
 import com.google.common.collect.ImmutableList;
-import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -43,10 +43,9 @@
   public void testResolution() throws Exception {
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
-    AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList()).build(), Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+    AndroidApp app = readClasses(CLASSES);
+    AppInfoWithLiveness appInfo = computeAppViewWithLiveness(app, Main.class).appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     // Currently R8 will resolve to L::f as that is the first in the topological search.
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
index 075e399..a9c79fc 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
@@ -44,12 +44,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
index 58d0891..a65c188 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
@@ -44,12 +44,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
index 30295fd..053fba0 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
@@ -47,12 +47,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
index 6c4070e..5163bc2 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
@@ -47,12 +47,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
index 581554b..75f689f 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
@@ -46,12 +46,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     Set<String> holders = new HashSet<>();
     resolutionResult
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
index 7ca9525..5772bdc 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.resolution.SingleTargetLookupTest;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.google.common.collect.ImmutableList;
-import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,9 +43,8 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList()).build(), Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(readClasses(CLASSES), Main.class).appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
index 1cbd668..50e0f8d 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.resolution.SingleTargetLookupTest;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.google.common.collect.ImmutableList;
-import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,9 +43,8 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList()).build(), Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(readClasses(CLASSES), Main.class).appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
index 47d7d65..bb81c51 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
@@ -47,12 +47,13 @@
     // The resolution is runtime independent, so just run it on the default CF VM.
     assumeTrue(parameters.getRuntime().equals(TestRuntime.getDefaultJavaRuntime()));
     AppInfoWithLiveness appInfo =
-        SingleTargetLookupTest.createAppInfoWithLiveness(
-            buildClasses(CLASSES, Collections.emptyList())
-                .addClassProgramData(Collections.singletonList(transformB()))
-                .build(),
-            Main.class);
-    DexMethod method = SingleTargetLookupTest.buildMethod(B.class, "f", appInfo);
+        computeAppViewWithLiveness(
+                buildClasses(CLASSES)
+                    .addClassProgramData(Collections.singletonList(transformB()))
+                    .build(),
+                Main.class)
+            .appInfo();
+    DexMethod method = SingleTargetLookupTest.buildNullaryVoidMethod(B.class, "f", appInfo);
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     Set<String> holders = new HashSet<>();
     resolutionResult