Merge "Remove and hide non-API procedures on R8."
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index dc6ebee..032c07a 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -46,7 +46,6 @@
 import com.android.tools.r8.shaking.protolite.ProtoLiteExtension;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.CfgPrinter;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.FileUtils;
@@ -168,7 +167,7 @@
     return marker;
   }
 
-  public static void writeApplication(
+  static void writeApplication(
       ExecutorService executorService,
       DexApplication application,
       String deadCode,
@@ -496,28 +495,6 @@
     }
   }
 
-  /** TODO(sgjesse): Get rid of this. */
-  public static AndroidApp runInternal(R8Command command) throws IOException, CompilationException {
-    InternalOptions options = command.getInternalOptions();
-    ExecutorService executorService = ThreadUtils.getExecutorService(options);
-    try {
-      return runInternal(command, executorService);
-    } finally {
-      executorService.shutdown();
-    }
-  }
-
-  /**
-   * TODO(sgjesse): Get rid of this.
-   */
-  public static AndroidApp runInternal(R8Command command, ExecutorService executor)
-      throws IOException, CompilationException {
-    InternalOptions options = command.getInternalOptions();
-    AndroidAppConsumers compatConsumers = new AndroidAppConsumers(options);
-    run(command.getInputApp(), options, executor);
-    return compatConsumers.build();
-  }
-
   private static void run(String[] args) throws CompilationFailedException {
     R8Command command = R8Command.parse(args, CommandLineOrigin.INSTANCE).build();
     if (command.isPrintHelp()) {
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 7c50696..17c4706 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -6,18 +6,20 @@
 
 import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.Version;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.origin.CommandLineOrigin;
 import com.android.tools.r8.utils.AbortException;
-import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.OutputMode;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Proguard + dx compatibility interface for r8.
@@ -170,10 +172,16 @@
     if (options.mainDexList != null) {
       builder.addMainDexListFiles(Paths.get(options.mainDexList));
     }
-    AndroidApp result = R8.runInternal(builder.build());
+
+    // Wrap the output consumer so we can count the number of output files.
+    CountOutputConsumer outputConsumer =
+        new CountOutputConsumer((DexIndexedConsumer) builder.getProgramConsumer());
+    builder.setProgramConsumer(outputConsumer);
+
+    R8.run(builder.build());
 
     if (!options.multiDex) {
-      if (result.getDexProgramResources().size() > 1) {
+      if (outputConsumer.count > 1) {
         throw new CompilationError(
             "Compilation result could not fit into a single dex file. "
                 + "Reduce the input-program size or run with --multi-dex enabled");
@@ -193,4 +201,20 @@
       System.exit(1);
     }
   }
+
+  private static class CountOutputConsumer extends DexIndexedConsumer.ForwardingConsumer {
+
+    int count = 0;
+
+    public CountOutputConsumer(DexIndexedConsumer consumer) {
+      super(consumer);
+    }
+
+    @Override
+    public synchronized void accept(int fileIndex, byte[] data, Set<String> descriptors,
+        DiagnosticsHandler handler) {
+      super.accept(fileIndex, data, descriptors, handler);
+      count++;
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index b58aa45..7d3dbe2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -11,9 +11,11 @@
 import com.android.tools.r8.DeviceRunner.DeviceRunnerConfigurationException;
 import com.android.tools.r8.ToolHelper.DexVm.Kind;
 import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.errors.DexOverflowException;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
@@ -53,6 +55,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import joptsimple.internal.Strings;
@@ -1153,4 +1156,16 @@
         });
     return builder;
   }
+
+  public static void writeApplication(DexApplication application, InternalOptions options)
+      throws ExecutionException, DexOverflowException {
+    R8.writeApplication(
+        Executors.newSingleThreadExecutor(),
+        application,
+        null,
+        NamingLens.getIdentityLens(),
+        null,
+        options,
+        null);
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index 0e97b13..074c704 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir;
 
-import com.android.tools.r8.R8;
+import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.errors.DexOverflowException;
 import com.android.tools.r8.graph.AppInfo;
@@ -15,7 +15,6 @@
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.ValueNumberGenerator;
 import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
@@ -29,7 +28,6 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
 import org.antlr.runtime.RecognitionException;
 
 public class IrInjectionTestBase extends SmaliTestBase {
@@ -123,14 +121,7 @@
     private AndroidApp writeDex(DexApplication application, InternalOptions options)
         throws DexOverflowException {
       try {
-        R8.writeApplication(
-            Executors.newSingleThreadExecutor(),
-            application,
-            null,
-            NamingLens.getIdentityLens(),
-            null,
-            options,
-            null);
+        ToolHelper.writeApplication(application, options);
         options.signalFinishedToProgramConsumer();
         return consumers.build();
       } catch (ExecutionException e) {
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index cefa888..8e2242d 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8Command;
-import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.DexAnnotationElement;
@@ -60,7 +59,7 @@
 
   private AndroidApp compileWithR8(Path inputPath, Path outputPath, Path keepRulesPath)
       throws IOException, CompilationException, CompilationFailedException {
-    return R8.runInternal(
+    return ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(inputPath)
             .addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()))