Mark classpath and library virtual method overrides as reachable

Change-Id: I5b8f15fe6124e18170ae82b7d9179a8a1763ff5e
diff --git a/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java b/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
index 2988016..550a96c 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
@@ -18,6 +18,7 @@
   enum Scope {
     ALL_CLASSES,
     ONLY_LIBRARY_CLASSES,
+    ONLY_LIBRARY_AND_CLASSPATH_CLASSES,
     ONLY_PROGRAM_CLASSES;
 
     public boolean shouldBePassedToVisitor(DexClass clazz) {
@@ -28,6 +29,9 @@
         case ONLY_LIBRARY_CLASSES:
           return clazz.isLibraryClass();
 
+        case ONLY_LIBRARY_AND_CLASSPATH_CLASSES:
+          return clazz.isLibraryClass() || clazz.isClasspathClass();
+
         case ONLY_PROGRAM_CLASSES:
           return clazz.isProgramClass();
 
diff --git a/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java b/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
index 79029b9..72e07e1 100644
--- a/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
+++ b/src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
@@ -24,7 +24,7 @@
   }
 
   /**
-   * Returns a visitor that can be used to visit all the program classes that are reachable from a
+   * Returns a visitor that can be used to visit all the library classes that are reachable from a
    * given set of sources.
    */
   public static TopDownClassHierarchyTraversal<DexLibraryClass> forLibraryClasses(
@@ -33,6 +33,15 @@
   }
 
   /**
+   * Returns a visitor that can be used to visit all the library and classpath classes that are
+   * reachable from a given set of sources.
+   */
+  public static TopDownClassHierarchyTraversal<DexClass> forLibraryAndClasspathClasses(
+      AppView<? extends AppInfoWithSubtyping> appView) {
+    return new TopDownClassHierarchyTraversal<>(appView, Scope.ONLY_LIBRARY_AND_CLASSPATH_CLASSES);
+  }
+
+  /**
    * Returns a visitor that can be used to visit all the program classes that are reachable from a
    * given set of sources.
    */
@@ -86,8 +95,8 @@
     switch (scope) {
       case ALL_CLASSES:
       case ONLY_LIBRARY_CLASSES:
+      case ONLY_LIBRARY_AND_CLASSPATH_CLASSES:
         return true;
-
       case ONLY_PROGRAM_CLASSES:
         return clazz.isProgramClass();
 
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 093adaa..9a297b2 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexLibraryClass;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexMethodHandle;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -1727,9 +1726,10 @@
     this.dontWarnPatterns = dontWarnPatterns;
     // Translate the result of root-set computation into enqueuer actions.
     enqueueRootItems(rootSet.noShrinking);
-    TopDownClassHierarchyTraversal.forLibraryClasses(appView)
+    TopDownClassHierarchyTraversal.forLibraryAndClasspathClasses(appView)
         // TODO(b/131813793): Would be beneficial to have `appView.appInfo().rootClasses()`.
-        .visit(appView.appInfo().classes(), this::markAllLibraryVirtualMethodsReachable);
+        .visit(
+            appView.appInfo().classes(), this::markAllLibraryAndClasspathVirtualMethodsReachable);
     trace(executorService, timing);
     options.reporter.failIfPendingErrors();
     analyses.forEach(EnqueuerAnalysis::done);
@@ -1980,7 +1980,7 @@
     }
   }
 
-  private void markAllLibraryVirtualMethodsReachable(DexLibraryClass clazz) {
+  private void markAllLibraryAndClasspathVirtualMethodsReachable(DexClass clazz) {
     if (Log.ENABLED) {
       Log.verbose(
           getClass(), "Marking all methods of library class `%s` as reachable.", clazz.type);