MainDexList test showing the inclusion of references from source retention

Bug: 186090713
Change-Id: Id509367e2e820c968a3c4b6fb6023996784fcee9
diff --git a/src/test/java/com/android/tools/r8/D8TestCompileResult.java b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
index e36ff2d..7e8e572 100644
--- a/src/test/java/com/android/tools/r8/D8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.utils.AndroidApp;
 import java.util.Set;
 
@@ -29,7 +28,7 @@
 
   @Override
   public Set<String> getMainDexClasses() {
-    throw new Unimplemented();
+    return state.getMainDexClasses();
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
new file mode 100644
index 0000000..74cc91d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
@@ -0,0 +1,122 @@
+// 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.maindexlist;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableSet;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class MainDexSourceAndClassRetentionTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withDexRuntimes()
+        .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
+        .build();
+  }
+
+  public MainDexSourceAndClassRetentionTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testMainDex() throws Exception {
+    List<ClassReference> mainDexList =
+        testForMainDexListGenerator(temp)
+            .addInnerClasses(getClass())
+            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.B))
+            .addMainDexRules(
+                "-keep class " + Main.class.getTypeName() + " {",
+                "  public static void main(java.lang.String[]);",
+                "}")
+            .run()
+            .getMainDexList();
+    // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
+    assertEquals(
+        ImmutableSet.of(
+            Reference.classFromClass(Foo.class),
+            Reference.classFromClass(Bar.class),
+            Reference.classFromClass(Main.class),
+            Reference.classFromClass(ClassRetentionAnnotation.class),
+            Reference.classFromClass(SourceRetentionAnnotation.class)),
+        new HashSet<>(mainDexList));
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    Set<String> mainDexClasses =
+        testForD8(temp)
+            .addInnerClasses(getClass())
+            .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+            .setMinApi(parameters.getApiLevel())
+            .collectMainDexClasses()
+            .addMainDexRules(
+                "-keep class " + Main.class.getTypeName() + " {",
+                "  public static void main(java.lang.String[]);",
+                "}")
+            .compile()
+            .getMainDexClasses();
+    // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
+    assertEquals(
+        ImmutableSet.of(
+            typeName(Foo.class),
+            typeName(Bar.class),
+            typeName(Main.class),
+            typeName(ClassRetentionAnnotation.class),
+            typeName(SourceRetentionAnnotation.class)),
+        mainDexClasses);
+  }
+
+  public enum Foo {
+    TEST;
+  }
+
+  public enum Bar {
+    TEST;
+  }
+
+  @Retention(RetentionPolicy.SOURCE)
+  @Target(ElementType.TYPE)
+  public @interface SourceRetentionAnnotation {
+
+    Foo value();
+  }
+
+  @Retention(RetentionPolicy.CLASS)
+  @Target(ElementType.TYPE)
+  public @interface ClassRetentionAnnotation {
+
+    Bar value();
+  }
+
+  @SourceRetentionAnnotation(Foo.TEST)
+  @ClassRetentionAnnotation(Bar.TEST)
+  public static class Main {
+
+    public static void main(String[] args) {}
+  }
+}