Add --nocode option for disassembling

This makes it easier to compare class and kotlin metadata.

Change-Id: I4f7e3b14f4ccdda349677ce45f9e6b478521b51b
diff --git a/src/main/java/com/android/tools/r8/Disassemble.java b/src/main/java/com/android/tools/r8/Disassemble.java
index 6e3764a..7c4ac49 100644
--- a/src/main/java/com/android/tools/r8/Disassemble.java
+++ b/src/main/java/com/android/tools/r8/Disassemble.java
@@ -34,6 +34,7 @@
       private Path proguardMapFile = null;
       private boolean useSmali = false;
       private boolean allInfo = false;
+      private boolean noCode = false;
       private boolean useIr;
 
       @Override
@@ -70,6 +71,11 @@
         return this;
       }
 
+      public Builder setNoCode(boolean noCode) {
+        this.noCode = noCode;
+        return this;
+      }
+
       @Override
       protected DisassembleCommand makeCommand() {
         // If printing versions ignore everything else.
@@ -82,7 +88,8 @@
             proguardMapFile == null ? null : StringResource.fromFile(proguardMapFile),
             allInfo,
             useSmali,
-            useIr);
+            useIr,
+            noCode);
       }
     }
 
@@ -93,6 +100,7 @@
             + "  --all                       # Include all information in disassembly.\n"
             + "  --smali                     # Disassemble using smali syntax.\n"
             + "  --ir                        # Print IR before and after optimization.\n"
+            + "  --nocode                    # No printing of code objects.\n"
             + "  --pg-map <file>             # Proguard map <file> for mapping names.\n"
             + "  --pg-map-charset <charset>  # Charset for Proguard map file.\n"
             + "  --output                    # Specify a file or directory to write to.\n"
@@ -102,6 +110,7 @@
     private final boolean allInfo;
     private final boolean useSmali;
     private final boolean useIr;
+    private final boolean noCode;
 
     public static Builder builder() {
       return new Builder();
@@ -128,6 +137,8 @@
           builder.setUseSmali(true);
         } else if (arg.equals("--ir")) {
           builder.setUseIr(true);
+        } else if (arg.equals("--nocode")) {
+          builder.setNoCode(true);
         } else if (arg.equals("--pg-map")) {
           builder.setProguardMapFile(Paths.get(args[++i]));
         } else if (arg.equals("--pg-map-charset")) {
@@ -161,13 +172,15 @@
         StringResource proguardMap,
         boolean allInfo,
         boolean useSmali,
-        boolean useIr) {
+        boolean useIr,
+        boolean noCode) {
       super(inputApp);
       this.outputPath = outputPath;
       this.proguardMap = proguardMap;
       this.allInfo = allInfo;
       this.useSmali = useSmali;
       this.useIr = useIr;
+      this.noCode = noCode;
     }
 
     private DisassembleCommand(boolean printHelp, boolean printVersion) {
@@ -177,6 +190,7 @@
       allInfo = false;
       useSmali = false;
       useIr = false;
+      noCode = false;
     }
 
     public Path getOutputPath() {
@@ -191,6 +205,10 @@
       return useIr;
     }
 
+    public boolean noCode() {
+      return noCode;
+    }
+
     @Override
     InternalOptions getInternalOptions() {
       InternalOptions internal = new InternalOptions();
@@ -226,7 +244,8 @@
       DexByteCodeWriter writer =
           command.useSmali()
               ? new SmaliWriter(application, options)
-              : new AssemblyWriter(application, options, command.allInfo, command.useIr());
+              : new AssemblyWriter(
+                  application, options, command.allInfo, command.useIr(), !command.noCode());
       if (command.getOutputPath() != null) {
         writer.write(command.getOutputPath());
       } else {
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 3cd5fc5..d10c69f 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -30,17 +30,23 @@
   private final boolean writeFields;
   private final boolean writeAnnotations;
   private final boolean writeIR;
+  private final boolean writeCode;
   private final AppInfoWithClassHierarchy appInfo;
   private final Kotlin kotlin;
   private final Timing timing = new Timing("AssemblyWriter");
 
   public AssemblyWriter(
-      DexApplication application, InternalOptions options, boolean allInfo, boolean writeIR) {
+      DexApplication application,
+      InternalOptions options,
+      boolean allInfo,
+      boolean writeIR,
+      boolean writeCode) {
     super(application, options);
     this.writeAllClassInfo = allInfo;
     this.writeFields = allInfo;
     this.writeAnnotations = allInfo;
     this.writeIR = writeIR;
+    this.writeCode = writeCode;
     if (writeIR) {
       this.appInfo = new AppInfoWithClassHierarchy(application.toDirect());
       if (options.programConsumer == null) {
@@ -128,6 +134,9 @@
     ps.println("# " + definition.accessFlags);
     ps.println("#");
     ps.println();
+    if (!writeCode) {
+      return;
+    }
     Code code = definition.getCode();
     if (code != null) {
       if (writeIR) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 9ad7a70..31150c4 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -2129,7 +2129,7 @@
       throws IOException, ExecutionException {
     DexApplication application =
         new ApplicationReader(app, new InternalOptions(), Timing.empty()).read().toDirect();
-    new AssemblyWriter(application, new InternalOptions(), true, false).write(ps);
+    new AssemblyWriter(application, new InternalOptions(), true, false, true).write(ps);
   }
 
   public static Path getTestFolderForClass(Class<?> clazz) {