Allow main-dex tracing through reflection on DEX inputs.

Change-Id: Ibd618dec98801df1aa5adcff8b74f96e131e0a41
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index f6a10a9..07569a7 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -223,7 +223,7 @@
   @Override
   InternalOptions getInternalOptions() {
     InternalOptions internal = new InternalOptions(factory, reporter);
-    internal.programConsumer = ClassFileConsumer.emptyConsumer();
+    internal.programConsumer = DexIndexedConsumer.emptyConsumer();
     internal.mainDexKeepRules = mainDexKeepRules;
     internal.mainDexListConsumer = mainDexListConsumer;
     internal.mainDexKeptGraphConsumer = mainDexKeptGraphConsumer;
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 85705d2..86776a3 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -154,7 +154,7 @@
             features);
     switch (allowedDiagnosticMessages) {
       case ALL:
-        compileResult.assertDiagnosticThatMatches(new IsAnything<>());
+        compileResult.getDiagnosticMessages().assertAllDiagnosticsMatch(new IsAnything<>());
         break;
       case ERROR:
         compileResult.assertOnlyErrors();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
index c43b8ae..6ef399e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.withNativeFileSeparators;
@@ -21,7 +22,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ThrowableConsumer;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ir.desugar.LambdaRewriter;
@@ -60,13 +60,29 @@
   private static final String EXAMPLE_SRC_DIR = ToolHelper.EXAMPLES_DIR;
   private static final String EXAMPLE_O_SRC_DIR = ToolHelper.EXAMPLES_ANDROID_O_DIR;
 
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
+  @Parameters(name = "{0}, {1}")
+  public static List<Object[]> data() {
+    return buildParameters(getTestParameters().withNoneRuntime().build(), Backend.values());
   }
 
-  public MainDexTracingTest(TestParameters parameters) {
+  private final Backend backend;
+
+  public MainDexTracingTest(TestParameters parameters, Backend backend) {
     parameters.assertNoneRuntime();
+    this.backend = backend;
+  }
+
+  private Path getInputJar(Path cfJar) throws Exception {
+    if (backend == Backend.CF) {
+      return cfJar;
+    }
+    return testForD8()
+        .setIntermediate(true)
+        .addProgramFiles(cfJar)
+        .setMinApi(AndroidApiLevel.K)
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.K))
+        .compile()
+        .writeToZip();
   }
 
   @Test
@@ -309,7 +325,7 @@
       throws Throwable {
     Path out = temp.getRoot().toPath().resolve(testName + ZIP_EXTENSION);
 
-    Path inputJar = Paths.get(buildDir, packageName + JAR_EXTENSION);
+    Path inputJar = getInputJar(Paths.get(buildDir, packageName + JAR_EXTENSION));
     // Build main-dex list using GenerateMainDexList and test the output from run.
     GenerateMainDexListCommand.Builder mdlCommandBuilder = GenerateMainDexListCommand.builder();
     GenerateMainDexListCommand mdlCommand = mdlCommandBuilder
@@ -350,14 +366,22 @@
         .addKeepRules("-keepattributes *Annotation*")
         .addMainDexRuleFiles(mainDexRules)
         .apply(configuration)
-        .allowDiagnosticWarningMessages()
         .assumeAllMethodsMayHaveSideEffects()
         .setMinApi(minSdk)
         .noMinification()
         .noTreeShaking()
         .setMainDexListConsumer(ToolHelper.consumeString(r8MainDexListOutput::set))
-        .compile()
-        .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
+        .allowDiagnosticMessages()
+        .compileWithExpectedDiagnostics(
+            diagnostics -> {
+              diagnostics.assertNoInfos().assertNoErrors();
+              if (backend == Backend.CF) {
+                diagnostics.assertWarningsMatch(
+                    diagnosticMessage(equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")));
+              } else {
+                diagnostics.assertNoWarnings();
+              }
+            })
         .writeToZip(out);
 
     List<String> r8MainDexList =
@@ -386,9 +410,16 @@
         if (mainDexGeneratorMainDexList.size() <= i - nonLambdaOffset) {
           fail("Main dex list generator is missing '" + reference + "'");
         }
-        checkSameMainDexEntry(reference, mainDexGeneratorMainDexList.get(i - nonLambdaOffset));
-        checkSameMainDexEntry(
-            reference, mainDexGeneratorMainDexListFromConsumer.get(i - nonLambdaOffset));
+        String fromList = mainDexGeneratorMainDexList.get(i - nonLambdaOffset);
+        String fromConsumer = mainDexGeneratorMainDexListFromConsumer.get(i - nonLambdaOffset);
+        if (isLambda(fromList)) {
+          assertEquals(Backend.DEX, backend);
+          assertEquals(fromList, fromConsumer);
+          nonLambdaOffset--;
+        } else {
+          checkSameMainDexEntry(reference, fromList);
+          checkSameMainDexEntry(reference, fromConsumer);
+        }
       } else {
         nonLambdaOffset++;
       }