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);
- }
-}