Minor cleanup of startup profile

Change-Id: I452beb08ddc82fb848304c56335a2523b9a30e35
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
index 10dc344..e67e98a 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
@@ -105,12 +105,10 @@
       StartupItem startupItem,
       LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems,
       AppView<?> appView) {
-    if (startupItem.isStartupClass()) {
-      addClassAndParentClasses(
-          startupItem.asStartupClass().getReference(), rewrittenStartupItems, appView);
-    } else {
-      rewrittenStartupItems.put(startupItem.getReference(), startupItem);
-    }
+    startupItem.accept(
+        startupClass ->
+            addClassAndParentClasses(startupClass.getReference(), rewrittenStartupItems, appView),
+        startupMethod -> rewrittenStartupItems.put(startupItem.getReference(), startupItem));
   }
 
   private static boolean addClass(
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
index 4c8ea1b..6e288b5 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
@@ -50,7 +50,7 @@
 
   /** Serialize the given {@param startupProfileProvider} to a string for writing it to a dump. */
   public static String serializeToString(
-      InternalOptions options, StartupProfileProvider startupProfileProvider) {
+      InternalOptions options, StartupProfileProvider startupProfileProvider) throws IOException {
     // Do not report missing items.
     MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder =
         MissingStartupProfileItemsDiagnostic.Builder.nop();
@@ -63,7 +63,8 @@
     // Serialize the startup items.
     StringBuilder resultBuilder = new StringBuilder();
     for (StartupItem startupItem : startupProfileBuilder.build().getStartupItems()) {
-      resultBuilder.append(startupItem.serializeToString()).append('\n');
+      startupItem.write(resultBuilder);
+      resultBuilder.append('\n');
     }
     return resultBuilder.toString();
   }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
index 9ab1224..8e4efdb 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.startup.StartupClassBuilder;
 import com.android.tools.r8.utils.ClassReferenceUtils;
+import java.io.IOException;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -45,16 +46,6 @@
   }
 
   @Override
-  public boolean isStartupClass() {
-    return true;
-  }
-
-  @Override
-  public StartupClass asStartupClass() {
-    return this;
-  }
-
-  @Override
   public boolean equals(Object o) {
     if (this == o) {
       return true;
@@ -72,8 +63,8 @@
   }
 
   @Override
-  public String serializeToString() {
-    return getReference().toDescriptorString();
+  public void write(Appendable appendable) throws IOException {
+    appendable.append(getReference().toDescriptorString());
   }
 
   public static class Builder implements StartupClassBuilder {
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
index 91a615e..6ab6ec1 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.experimental.startup.profile;
 
 import com.android.tools.r8.graph.DexReference;
+import java.io.IOException;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -18,23 +19,5 @@
 
   public abstract DexReference getReference();
 
-  public boolean isStartupClass() {
-    return false;
-  }
-
-  public StartupClass asStartupClass() {
-    assert false;
-    return null;
-  }
-
-  public boolean isStartupMethod() {
-    return false;
-  }
-
-  public StartupMethod asStartupMethod() {
-    assert false;
-    return null;
-  }
-
-  public abstract String serializeToString();
+  public abstract void write(Appendable appendable) throws IOException;
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
index e245260..5d7448b 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.startup.StartupMethodBuilder;
 import com.android.tools.r8.utils.MethodReferenceUtils;
+import java.io.IOException;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -45,16 +46,6 @@
   }
 
   @Override
-  public boolean isStartupMethod() {
-    return true;
-  }
-
-  @Override
-  public StartupMethod asStartupMethod() {
-    return this;
-  }
-
-  @Override
   public boolean equals(Object o) {
     if (this == o) {
       return true;
@@ -72,8 +63,8 @@
   }
 
   @Override
-  public String serializeToString() {
-    return method.toSmaliString();
+  public void write(Appendable appendable) throws IOException {
+    appendable.append(method.toSmaliString());
   }
 
   public static class Builder implements StartupMethodBuilder {
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 2eda6e7..9066212 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -22,7 +22,6 @@
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.experimental.startup.profile.StartupItem;
-import com.android.tools.r8.experimental.startup.profile.StartupMethod;
 import com.android.tools.r8.experimental.startup.profile.StartupProfile;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
@@ -816,9 +815,9 @@
     Collection<StartupItem> startupItems = startupProfile.getStartupItems();
     assertEquals(1, startupItems.size());
     StartupItem startupItem = startupItems.iterator().next();
-    assertTrue(startupItem.isStartupMethod());
-    StartupMethod startupMethod = startupItem.asStartupMethod();
-    assertEquals(profileRule, startupMethod.getReference().toSmaliString());
+    startupItem.accept(
+        startupClass -> fail(),
+        startupMethod -> assertEquals(profileRule, startupMethod.getReference().toSmaliString()));
   }
 
   @Test