Add asmify method to ClassSubject

Change-Id: If48f8b2c3c8f1679c6a4e4e4d7bb82bba7eea744
diff --git a/build.gradle b/build.gradle
index 730d291..c47befd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -35,7 +35,7 @@
 
 ext {
     androidSupportVersion = '25.4.0'
-    asmVersion = '8.0'  // When updating update tools/asmifier.py as well.
+    asmVersion = '8.0'  // When updating update tools/asmifier.py and Toolhelper as well.
     espressoVersion = '3.0.0'
     fastutilVersion = '7.2.0'
     guavaVersion = '23.0'
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 7de9a9a..e6fd9e0 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -121,6 +121,9 @@
   public static final String JAVA_CLASSES_DIR = BUILD_DIR + "classes/java/";
   public static final String JDK_11_TESTS_CLASSES_DIR = JAVA_CLASSES_DIR + "jdk11Tests/";
 
+  public static final String ASM_JAR = BUILD_DIR + "deps/asm-8.0.jar";
+  public static final String ASM_UTIL_JAR = BUILD_DIR + "deps/asm-util-8.0.jar";
+
   public static final Path API_SAMPLE_JAR = Paths.get("tests", "r8_api_usage_sample.jar");
 
   public static final String LINE_SEPARATOR = StringUtils.LINE_SEPARATOR;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 75c2325..fe4d4d9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -12,6 +12,7 @@
 import java.util.List;
 import java.util.function.Consumer;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
 
 public class AbsentClassSubject extends ClassSubject {
 
@@ -190,7 +191,12 @@
   }
 
   @Override
-  public void disassembleUsingJavap(boolean verbose) throws Exception {
+  public String disassembleUsingJavap(boolean verbose) throws Exception {
     throw new Unreachable("Cannot disassembly an absent class");
   }
+
+  @Override
+  public String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception {
+    throw new Unreachable("Cannot asmify an absent class");
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index d3c1ecc..96b0d0c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -25,6 +25,7 @@
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
 
 public abstract class ClassSubject extends Subject {
 
@@ -217,5 +218,7 @@
 
   public abstract ClassNamingForNameMapper getNaming();
 
-  public abstract void disassembleUsingJavap(boolean verbose) throws Exception;
+  public abstract String disassembleUsingJavap(boolean verbose) throws Exception;
+
+  public abstract String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception;
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 1f16bb5..dbdff3d 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -30,10 +30,14 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ZipUtils;
+import java.io.File;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
+import org.junit.rules.TemporaryFolder;
 
 public class FoundClassSubject extends ClassSubject {
 
@@ -424,7 +428,7 @@
   }
 
   @Override
-  public void disassembleUsingJavap(boolean verbose) throws Exception {
+  public String disassembleUsingJavap(boolean verbose) throws Exception {
     assert dexClass.origin != null;
     List<String> command = new ArrayList<>();
     command.add(
@@ -442,5 +446,34 @@
     ProcessResult processResult = ToolHelper.runProcess(new ProcessBuilder(command));
     assert processResult.exitCode == 0;
     System.out.println(processResult.stdout);
+    return processResult.stdout;
+  }
+
+  @Override
+  public String asmify(TemporaryFolder tempFolder, boolean debug) throws Exception {
+    assert dexClass.origin != null;
+    List<String> parts = dexClass.origin.parts();
+    assert parts.size() == 2;
+    String directory = parts.get(0);
+    String fileName = parts.get(1);
+    if (directory.endsWith(".jar") || directory.endsWith(".zip")) {
+      File tempOut = tempFolder.newFolder();
+      ZipUtils.unzip(directory, tempOut);
+      directory = tempOut.getAbsolutePath();
+    }
+    List<String> command = new ArrayList<>();
+    command.add(
+        CfRuntime.getCheckedInJdk9().getJavaHome().resolve("bin").resolve("java").toString());
+    command.add("-cp");
+    command.add(ToolHelper.ASM_JAR + ":" + ToolHelper.ASM_UTIL_JAR);
+    command.add("org.objectweb.asm.util.ASMifier");
+    if (!debug) {
+      command.add("-debug");
+    }
+    command.add(Paths.get(directory, fileName).toString());
+    ProcessResult processResult = ToolHelper.runProcess(new ProcessBuilder(command));
+    assert processResult.exitCode == 0;
+    System.out.println(processResult.stdout);
+    return processResult.stdout;
   }
 }