Revert "Load all library and program classes when running R8"

This reverts commit b3f9e6a55091618444ea4b1ab3774c82f7edfcde.

This causes test failures.

Change-Id: Ie71974bd7bcd3358d94dc2daa02e613323c4f5de
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 012c4a4..e4f1c8c 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -7,7 +7,6 @@
 package com.android.tools.r8.graph;
 
 import com.android.tools.r8.ProgramResourceProvider;
-import com.android.tools.r8.graph.LazyLoadedDexApplication.AllClasses;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.Timing;
@@ -22,11 +21,9 @@
 
 public class DirectMappedDexApplication extends DexApplication {
 
-  private final AllClasses allClasses;
   private final ImmutableMap<DexType, DexLibraryClass> libraryClasses;
 
   private DirectMappedDexApplication(ClassNameMapper proguardMap,
-      AllClasses allClasses,
       ProgramClassCollection programClasses,
       ImmutableList<ProgramResourceProvider> programResourceProviders,
       ImmutableMap<DexType, DexLibraryClass> libraryClasses,
@@ -35,7 +32,6 @@
       Timing timing) {
     super(proguardMap, programClasses, programResourceProviders, mainDexList, deadCode,
         dexItemFactory, highestSortingString, timing);
-    this.allClasses = allClasses;
     this.libraryClasses = libraryClasses;
   }
 
@@ -96,21 +92,17 @@
 
   public static class Builder extends DexApplication.Builder<Builder> {
 
-    private final AllClasses allClasses;
     private final List<DexLibraryClass> libraryClasses = new ArrayList<>();
 
     Builder(LazyLoadedDexApplication application) {
       super(application);
       // As a side-effect, this will force-load all classes.
-      this.allClasses = application.loadAllClasses();
-      Map<DexType, DexClass> allClasses = this.allClasses.getClasses();
-      // TODO(120884788): This filter will only add library classes which are not program classes.
+      Map<DexType, DexClass> allClasses = application.getFullClassMap();
       Iterables.filter(allClasses.values(), DexLibraryClass.class).forEach(libraryClasses::add);
     }
 
     private Builder(DirectMappedDexApplication application) {
       super(application);
-      this.allClasses = application.allClasses;
       this.libraryClasses.addAll(application.libraryClasses.values());
     }
 
@@ -124,7 +116,6 @@
       // Rebuild the map. This will fail if keys are not unique.
       return new DirectMappedDexApplication(
           proguardMap,
-          allClasses,
           ProgramClassCollection.create(
               programClasses, ProgramClassCollection::resolveClassConflictImpl),
           ImmutableList.copyOf(programResourceProviders),
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 6dea825..b648e41 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -55,67 +55,31 @@
     return clazz;
   }
 
-  static class AllClasses {
-    private Map<DexType, DexClass> libraryClasses;
-    private Map<DexType, DexClass> classpathClasses;
-    private Map<DexType, DexClass> programClasses;
-    private Map<DexType, DexClass> classes;
+  private Map<DexType, DexClass> forceLoadAllClasses() {
+    Map<DexType, DexClass> loaded = new IdentityHashMap<>();
 
-    AllClasses(
-        LibraryClassCollection libraryClasses,
-        ClasspathClassCollection classpathClasses,
-        ProgramClassCollection programClasses) {
-      load(libraryClasses, classpathClasses, programClasses);
+    // Program classes are supposed to be loaded, but force-loading them is no-op.
+    programClasses.forceLoad(type -> true);
+    programClasses.getAllClasses().forEach(clazz -> loaded.put(clazz.type, clazz));
 
-      // Collect loaded classes in the precedence order program classes, class path classes and
-      // library classes.
-      // TODO(b/120884788): Change this.
-      classes = new IdentityHashMap<>();
-      classes.putAll(this.programClasses);
-      if (classpathClasses != null) {
-        classpathClasses.getAllClasses().forEach(clazz -> classes.putIfAbsent(clazz.type, clazz));
-      }
-      if (libraryClasses != null) {
-        libraryClasses.getAllClasses().forEach(clazz -> classes.putIfAbsent(clazz.type, clazz));
-      }
+    if (classpathClasses != null) {
+      classpathClasses.forceLoad(type -> !loaded.containsKey(type));
+      classpathClasses.getAllClasses().forEach(clazz -> loaded.putIfAbsent(clazz.type, clazz));
     }
 
-    public Map<DexType, DexClass> getLibraryClasses() {
-      return libraryClasses;
+    if (libraryClasses != null) {
+      libraryClasses.forceLoad(type -> !loaded.containsKey(type));
+      libraryClasses.getAllClasses().forEach(clazz -> loaded.putIfAbsent(clazz.type, clazz));
     }
 
-    public Map<DexType, DexClass> getClasspathClasses() {
-      return classpathClasses;
-    }
-
-    public Map<DexType, DexClass> getClasses() {
-      return classes;
-    }
-
-    private void load(
-        LibraryClassCollection libraryClasses,
-        ClasspathClassCollection classpathClasses,
-        ProgramClassCollection programClasses) {
-      if (libraryClasses != null) {
-        libraryClasses.forceLoad(type -> true);
-        this.libraryClasses = libraryClasses.getAllClassesInMap();
-      }
-      if (classpathClasses != null) {
-        classpathClasses.forceLoad(type -> true);
-        this.classpathClasses = classpathClasses.getAllClassesInMap();
-      }
-      assert programClasses != null;
-      // Program classes are supposed to be loaded, but force-loading them is no-op.
-      programClasses.forceLoad(type -> true);
-      this.programClasses = programClasses.getAllClassesInMap();
-    }
+    return loaded;
   }
 
   /**
    * Force load all classes and return type -> class map containing all the classes.
    */
-  public AllClasses loadAllClasses() {
-    return new AllClasses(libraryClasses, classpathClasses, programClasses);
+  public Map<DexType, DexClass> getFullClassMap() {
+    return forceLoadAllClasses();
   }
 
   public static class Builder extends DexApplication.Builder<Builder> {
diff --git a/src/main/java/com/android/tools/r8/utils/ClassMap.java b/src/main/java/com/android/tools/r8/utils/ClassMap.java
index 33c1bf3..0ebfb9d 100644
--- a/src/main/java/com/android/tools/r8/utils/ClassMap.java
+++ b/src/main/java/com/android/tools/r8/utils/ClassMap.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.graph.ClassKind;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexType;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -135,18 +134,6 @@
     return loadedClasses;
   }
 
-  public Map<DexType, DexClass> getAllClassesInMap() {
-    if (classProvider.get() != null) {
-      throw new Unreachable("Getting all classes from not fully loaded collection.");
-    }
-    ImmutableMap.Builder<DexType, DexClass> builder = ImmutableMap.builder();
-    // This is fully loaded, so the class map will no longer change.
-    for (Map.Entry<DexType, Supplier<T>> entry : classes.entrySet()) {
-      builder.put(entry.getKey(), entry.getValue().get());
-    }
-    return builder.build();
-  }
-
   public Iterable<DexType> getAllTypes() {
     return classes.keySet();
   }