Revert "Clean up main dex list consumers"

This reverts commit 2dffcf5e6265158482435778b087158f099e7fda.

Reason for revert: Bots are failing

Change-Id: I2616398d7f85870e124fb1f01529f9a582a0df34
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 2a794ab..07783b3 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -5,7 +5,6 @@
 
 import static com.android.tools.r8.utils.ExceptionUtils.unwrapExecutionException;
 
-import com.android.tools.r8.StringConsumer.ForwardingConsumer;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.experimental.graphinfo.GraphConsumer;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -22,13 +21,14 @@
 import com.android.tools.r8.shaking.RootSetUtils.MainDexRootSet;
 import com.android.tools.r8.shaking.WhyAreYouKeepingConsumer;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.SortingStringConsumer;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -42,13 +42,21 @@
     this.options = options;
   }
 
-  private void run(AndroidApp app, ExecutorService executor, SortingStringConsumer consumer)
+  private List<String> run(AndroidApp app, ExecutorService executor)
       throws IOException {
     try {
+      // TODO(b/178231294): Clean up this such that we do not both return the result and call the
+      //  consumer.
       DexApplication application = new ApplicationReader(app, options, timing).read(executor);
+      List<String> result = new ArrayList<>();
       traceMainDex(executor, application, MainDexInfo.none())
-          .forEach(type -> consumer.accept(type.toBinaryName() + ".class", options.reporter));
-      consumer.finished(options.reporter);
+          .forEach(type -> result.add(type.toBinaryName() + ".class"));
+      Collections.sort(result);
+      if (options.mainDexListConsumer != null) {
+        options.mainDexListConsumer.accept(String.join("\n", result), options.reporter);
+        options.mainDexListConsumer.finished(options.reporter);
+      }
+      return result;
     } catch (ExecutionException e) {
       throw unwrapExecutionException(e);
     }
@@ -129,11 +137,11 @@
   /**
    * Main API entry for computing the main-dex list.
    *
-   * <p>The main-dex list is represented as a list of strings, each string specifies one class to
+   * The main-dex list is represented as a list of strings, each string specifies one class to
    * keep in the primary dex file (<code>classes.dex</code>).
    *
-   * <p>A class is specified using the following format: "com/example/MyClass.class". That is "/" as
-   * separator between package components, and a trailing ".class".
+   * A class is specified using the following format: "com/example/MyClass.class". That is
+   * "/" as separator between package components, and a trailing ".class".
    *
    * @param command main dex-list generator command.
    * @param executor executor service from which to get threads for multi-threaded processing.
@@ -143,28 +151,17 @@
       throws CompilationFailedException {
     AndroidApp app = command.getInputApp();
     InternalOptions options = command.getInternalOptions();
-    List<String> result = new ArrayList<>();
+    Box<List<String>> result = new Box<>();
     ExceptionUtils.withMainDexListHandler(
         command.getReporter(),
         () -> {
           try {
-            new GenerateMainDexList(options)
-                .run(
-                    app,
-                    executor,
-                    new SortingStringConsumer(
-                        new ForwardingConsumer(options.mainDexListConsumer) {
-                          @Override
-                          public void accept(String string, DiagnosticsHandler handler) {
-                            result.add(string);
-                            super.accept(string, handler);
-                          }
-                        }));
+            result.set(new GenerateMainDexList(options).run(app, executor));
           } finally {
             executor.shutdown();
           }
         });
-    return result;
+    return result.get();
   }
 
   public static void main(String[] args) throws CompilationFailedException {
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index 85bc305..b08a738 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.shaking.ProguardConfigurationSourceStrings;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.JoiningStringConsumer;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.common.collect.ImmutableList;
@@ -116,7 +115,7 @@
           factory,
           getAppBuilder().build(),
           mainDexKeepRules,
-          new JoiningStringConsumer(mainDexListConsumer, "\n"),
+          mainDexListConsumer,
           mainDexKeptGraphConsumer,
           getReporter());
     }
diff --git a/src/main/java/com/android/tools/r8/utils/JoiningStringConsumer.java b/src/main/java/com/android/tools/r8/utils/JoiningStringConsumer.java
deleted file mode 100644
index 5ec300f..0000000
--- a/src/main/java/com/android/tools/r8/utils/JoiningStringConsumer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.utils;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.StringConsumer;
-import com.android.tools.r8.StringConsumer.ForwardingConsumer;
-
-/* Joining String Consumer to join strings that it accepts. */
-public class JoiningStringConsumer extends ForwardingConsumer {
-
-  private final String separator;
-  private final StringBuilder builder = new StringBuilder();
-
-  /**
-   * @param consumer Consumer to forward to the joined input to. If null, nothing will be forwarded.
-   */
-  public JoiningStringConsumer(StringConsumer consumer, String separator) {
-    super(consumer);
-    this.separator = separator;
-  }
-
-  @Override
-  public void accept(String string, DiagnosticsHandler handler) {
-    if (builder.length() > 0) {
-      builder.append(separator);
-    }
-    builder.append(string);
-  }
-
-  @Override
-  public void finished(DiagnosticsHandler handler) {
-    super.accept(builder.toString(), handler);
-    super.finished(handler);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/utils/SortingStringConsumer.java b/src/main/java/com/android/tools/r8/utils/SortingStringConsumer.java
deleted file mode 100644
index 8c65b00..0000000
--- a/src/main/java/com/android/tools/r8/utils/SortingStringConsumer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.utils;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.StringConsumer;
-import com.android.tools.r8.StringConsumer.ForwardingConsumer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Sorting consumer that accepts all input and then sorts it when calling finished */
-public class SortingStringConsumer extends ForwardingConsumer {
-
-  private final List<String> accepted = new ArrayList<>();
-
-  /**
-   * @param consumer Consumer to forward to the sorted consumed input to. If null, nothing will be
-   *     forwarded.
-   */
-  public SortingStringConsumer(StringConsumer consumer) {
-    super(consumer);
-  }
-
-  @Override
-  public void accept(String string, DiagnosticsHandler handler) {
-    this.accepted.add(string);
-  }
-
-  @Override
-  public void finished(DiagnosticsHandler handler) {
-    Collections.sort(accepted);
-    accepted.forEach(string -> super.accept(string, handler));
-    super.finished(handler);
-  }
-}