Warning when java. library class is also non library

Bug: 205606714
Change-Id: Ib0f3225240d957d558e95ab9b17c1ab37413aac4
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index cf0d761..cce1760 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -15,10 +15,13 @@
 import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.Timing;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import java.util.Collections;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 public class LazyLoadedDexApplication extends DexApplication {
 
@@ -130,13 +133,13 @@
       // on the configured lookup order.
       Map<DexType, DexClass> prioritizedClasses = new IdentityHashMap<>(expectedMaxSize);
       if (options.lookupLibraryBeforeProgram) {
-        libraryClasses = fillPrioritizedClasses(allLibraryClasses, prioritizedClasses);
-        programClasses = fillPrioritizedClasses(allProgramClasses, prioritizedClasses);
-        classpathClasses = fillPrioritizedClasses(allClasspathClasses, prioritizedClasses);
+        libraryClasses = fillPrioritizedClasses(allLibraryClasses, prioritizedClasses, options);
+        programClasses = fillPrioritizedClasses(allProgramClasses, prioritizedClasses, options);
+        classpathClasses = fillPrioritizedClasses(allClasspathClasses, prioritizedClasses, options);
       } else {
-        programClasses = fillPrioritizedClasses(allProgramClasses, prioritizedClasses);
-        classpathClasses = fillPrioritizedClasses(allClasspathClasses, prioritizedClasses);
-        libraryClasses = fillPrioritizedClasses(allLibraryClasses, prioritizedClasses);
+        programClasses = fillPrioritizedClasses(allProgramClasses, prioritizedClasses, options);
+        classpathClasses = fillPrioritizedClasses(allClasspathClasses, prioritizedClasses, options);
+        libraryClasses = fillPrioritizedClasses(allLibraryClasses, prioritizedClasses, options);
       }
 
       allClasses = Collections.unmodifiableMap(prioritizedClasses);
@@ -163,22 +166,49 @@
   }
 
   private static <T extends DexClass> ImmutableList<T> fillPrioritizedClasses(
-      Map<DexType, T> classCollection, Map<DexType, DexClass> prioritizedClasses) {
+      Map<DexType, T> classCollection,
+      Map<DexType, DexClass> prioritizedClasses,
+      InternalOptions options) {
     if (classCollection != null) {
+      Set<DexType> javaLibraryOverride = Sets.newIdentityHashSet();
       ImmutableList.Builder<T> builder = ImmutableList.builder();
       classCollection.forEach(
           (type, clazz) -> {
-            if (!prioritizedClasses.containsKey(type)) {
+            DexClass other = prioritizedClasses.get(type);
+            if (other == null) {
               prioritizedClasses.put(type, clazz);
               builder.add(clazz);
+            } else if (type.getPackageName().startsWith("java.")
+                && (clazz.isLibraryClass() || other.isLibraryClass())) {
+              javaLibraryOverride.add(type);
             }
           });
+      if (!javaLibraryOverride.isEmpty()) {
+        warnJavaLibraryOverride(options, javaLibraryOverride);
+      }
       return builder.build();
     } else {
       return ImmutableList.of();
     }
   }
 
+  private static void warnJavaLibraryOverride(
+      InternalOptions options, Set<DexType> javaLibraryOverride) {
+    String joined =
+        javaLibraryOverride.stream()
+            .sorted()
+            .map(DexType::toString)
+            .collect(Collectors.joining(", "));
+    String message =
+        "The following library types, prefixed by java.,"
+            + " are present both as library and non library classes: "
+            + joined
+            + ". "
+            + (options.lookupLibraryBeforeProgram ? "Non library" : "Library")
+            + " classes will be ignored.";
+    options.reporter.warning(message);
+  }
+
   /**
    * Force load all classes and return type -> class map containing all the classes.
    */