Merge "Make Shrinker-specific utils instance methods."
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index dd1ee60..db3f356 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -100,22 +100,13 @@
     this.minify = minify;
   }
 
-  private String run(AndroidApp app, String main) throws IOException {
-    if (generatesDex(shrinker)) {
-      return runOnArt(app, main);
-    } else {
-      assert generatesCf(shrinker);
-      return runOnJava(app, main, Collections.emptyList());
-    }
-  }
-
   private static boolean vmVersionIgnored() {
     return !ToolHelper.getDexVm().getVersion().isAtLeast(Version.V7_0_0);
   }
 
   @Test
   public void test_keepAll() throws Exception {
-    Assume.assumeFalse(generatesDex(shrinker) && vmVersionIgnored());
+    Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored());
     Class mainClass = TestMain.class;
     String keep = !minify ? "-keep" : "-keep,allowobfuscation";
     List<String> config = ImmutableList.of(
@@ -138,10 +129,10 @@
     AndroidApp app = runShrinker(shrinker, CLASSES, config);
     assertEquals(
         StringUtils.withNativeLineSeparator("123451234567\nABC\n"),
-        run(app, mainClass.getCanonicalName()));
+        runOnVM(app, mainClass.getCanonicalName(), shrinker.toBackend()));
 
     CodeInspector codeInspector =
-        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+        shrinker.isR8() ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
     ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
@@ -149,7 +140,7 @@
     MethodSubject staticMethod = testClass.method("void", "unused", ImmutableList.of());
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    if (isR8(shrinker)) {
+    if (shrinker.isR8()) {
       assertEquals(allowAccessModification, staticMethod.getMethod().accessFlags.isPublic());
     } else {
       assertFalse(staticMethod.getMethod().accessFlags.isPublic());
@@ -159,14 +150,14 @@
     staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    boolean publicizeCondition = isR8(shrinker) ? allowAccessModification
+    boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
         : minify && repackagePrefix != null && allowAccessModification;
     assertEquals(publicizeCondition, staticMethod.getMethod().accessFlags.isPublic());
   }
 
   @Test
   public void test_keepNonPublic() throws Exception {
-    Assume.assumeFalse(generatesDex(shrinker) && vmVersionIgnored());
+    Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored());
     Class mainClass = TestMain.class;
     String keep = !minify ? "-keep" : "-keep,allowobfuscation";
     List<String> config = ImmutableList.of(
@@ -189,10 +180,10 @@
     AndroidApp app = runShrinker(shrinker, CLASSES, config);
     assertEquals(
         StringUtils.withNativeLineSeparator("123451234567\nABC\n"),
-        run(app, mainClass.getCanonicalName()));
+        runOnVM(app, mainClass.getCanonicalName(), shrinker.toBackend()));
 
     CodeInspector codeInspector =
-        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+        shrinker.isR8() ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
     ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
@@ -200,7 +191,7 @@
     MethodSubject staticMethod = testClass.method("void", "unused", ImmutableList.of());
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    if (isR8(shrinker)) {
+    if (shrinker.isR8()) {
       assertEquals(allowAccessModification, staticMethod.getMethod().accessFlags.isPublic());
     } else {
       assertFalse(staticMethod.getMethod().accessFlags.isPublic());
@@ -210,14 +201,14 @@
     staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    boolean publicizeCondition = isR8(shrinker) ? allowAccessModification
+    boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
         : minify && repackagePrefix != null && allowAccessModification;
     assertEquals(publicizeCondition, staticMethod.getMethod().accessFlags.isPublic());
   }
 
   @Test
   public void test_keepPublic() throws Exception {
-    Assume.assumeFalse(generatesDex(shrinker) && vmVersionIgnored());
+    Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored());
     Class mainClass = TestMain.class;
     String keep = !minify ? "-keep" : "-keep,allowobfuscation";
     Iterable<String> config = ImmutableList.of(
@@ -236,7 +227,7 @@
         "}",
         "-dontwarn java.lang.invoke.*"
     );
-    if (isR8(shrinker)) {
+    if (shrinker.isR8()) {
       config = Iterables.concat(config, ImmutableList.of(
           "-neverinline class " + TestClass.class.getCanonicalName() + " {",
           "  * staticMethod();",
@@ -247,10 +238,10 @@
     AndroidApp app = runShrinker(shrinker, CLASSES, config);
     assertEquals(
         StringUtils.withNativeLineSeparator("123451234567\nABC\n"),
-        run(app, mainClass.getCanonicalName()));
+        runOnVM(app, mainClass.getCanonicalName(), shrinker.toBackend()));
 
     CodeInspector codeInspector =
-        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+        shrinker.isR8() ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
     ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
@@ -262,7 +253,7 @@
     staticMethod = testClass.method("java.lang.String", "staticMethod", ImmutableList.of());
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    boolean publicizeCondition = isR8(shrinker) ? allowAccessModification
+    boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
         : minify && repackagePrefix != null && allowAccessModification;
     assertEquals(publicizeCondition, staticMethod.getMethod().accessFlags.isPublic());
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
index 44527a2..952bae6 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
@@ -40,35 +40,35 @@
     R8_COMPAT,
     R8_COMPAT_CF,
     R8,
-    R8_CF
-  }
+    R8_CF;
 
-  protected static boolean isR8(Shrinker shrinker) {
-    return shrinker == Shrinker.R8_COMPAT
-        || shrinker == Shrinker.R8_COMPAT_CF
-        || shrinker == Shrinker.R8
-        || shrinker == Shrinker.R8_CF;
-  }
-
-  protected static boolean generatesDex(Shrinker shrinker) {
-    return shrinker == Shrinker.PROGUARD6_THEN_D8
-        || shrinker == Shrinker.R8_COMPAT
-        || shrinker == Shrinker.R8;
-  }
-
-  protected static boolean generatesCf(Shrinker shrinker) {
-    return shrinker == Shrinker.PROGUARD5
-        || shrinker == Shrinker.PROGUARD6
-        || shrinker == Shrinker.R8_COMPAT_CF
-        || shrinker == Shrinker.R8_CF;
-  }
-
-  protected static Backend toBackend(Shrinker shrinker) {
-    if (generatesDex(shrinker)) {
-      return Backend.DEX;
+    public boolean isR8() {
+      return this == R8_COMPAT
+          || this == R8_COMPAT_CF
+          || this == R8
+          || this == R8_CF;
     }
-    assert generatesCf(shrinker);
-    return Backend.CF;
+
+    public boolean generatesDex() {
+      return this == PROGUARD6_THEN_D8
+          || this == R8_COMPAT
+          || this == R8;
+    }
+
+    public boolean generatesCf() {
+      return this == PROGUARD5
+          || this == PROGUARD6
+          || this == R8_COMPAT_CF
+          || this == R8_CF;
+    }
+
+    public Backend toBackend() {
+      if (generatesDex()) {
+        return Backend.DEX;
+      }
+      assert generatesCf();
+      return Backend.CF;
+    }
   }
 
   protected AndroidApp runShrinker(
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
index fe2a93f..dcb1970c 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
@@ -274,7 +274,7 @@
   @Test
   public void testExternalizable() throws Exception {
     // TODO(b/116735204): R8 should keep default ctor() of classes that implement Externalizable
-    if (isR8(shrinker)) {
+    if (shrinker.isR8()) {
       return;
     }
 
@@ -294,9 +294,9 @@
     AndroidApp processedApp = runShrinker(shrinker, CLASSES_FOR_EXTERNALIZABLE, config);
 
     // TODO(b/117302947): Need to update ART binary.
-    if (generatesCf(shrinker)) {
+    if (shrinker.generatesCf()) {
       String output = runOnVM(
-          processedApp, ExternalizableTestMain.class.getCanonicalName(), toBackend(shrinker));
+          processedApp, ExternalizableTestMain.class.getCanonicalName(), shrinker.toBackend());
       assertEquals(javaOutput.trim(), output.trim());
     }
 
@@ -311,7 +311,7 @@
   public void testSerializable() throws Exception {
     // TODO(b/116735204): R8 should keep default ctor() of first non-serializable superclass of
     // serializable class.
-    if (isR8(shrinker)) {
+    if (shrinker.isR8()) {
       return;
     }
 
@@ -330,9 +330,9 @@
 
     AndroidApp processedApp = runShrinker(shrinker, CLASSES_FOR_SERIALIZABLE, config);
     // TODO(b/117302947): Need to update ART binary.
-    if (generatesCf(shrinker)) {
+    if (shrinker.generatesCf()) {
       String output = runOnVM(
-          processedApp, SerializableTestMain.class.getCanonicalName(), toBackend(shrinker));
+          processedApp, SerializableTestMain.class.getCanonicalName(), shrinker.toBackend());
       assertEquals(javaOutput.trim(), output.trim());
     }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index e6de7cc..5ea7769 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -104,8 +104,8 @@
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
     classSubject = codeInspector.clazz(ClassForSubsequent.class);
-    if (isR8(shrinker)) {
-      // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
+    if (shrinker.isR8()) {
+      // TODO(b/117330692): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
       assertThat(classSubject, not(isPresent()));
       return;
@@ -143,8 +143,8 @@
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
     classSubject = codeInspector.clazz(ClassForSubsequent.class);
-    if (isR8(shrinker)) {
-      // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
+    if (shrinker.isR8()) {
+      // TODO(b/117330692): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
       assertThat(classSubject, not(isPresent()));
       return;
@@ -219,8 +219,8 @@
     assertThat(methodSubject, not(isPresent()));
     methodSubject = classSubject.method(nonPublicMethod);
     assertThat(methodSubject, isPresent());
-    if (isR8(shrinker)) {
-      // TODO(b/72109068): if kept in the 1st tree shaking, should not be publicized.
+    if (shrinker.isR8()) {
+      // TODO(b/117330692): if kept in the 1st tree shaking, should not be publicized.
       assertTrue(methodSubject.getMethod().accessFlags.isPublic());
       return;
     }