Merge "Avoid calling toString on all dex strings to collect markers."
diff --git a/src/main/java/com/android/tools/r8/ProgramResourceProvider.java b/src/main/java/com/android/tools/r8/ProgramResourceProvider.java
index 0dcc619..76d340c 100644
--- a/src/main/java/com/android/tools/r8/ProgramResourceProvider.java
+++ b/src/main/java/com/android/tools/r8/ProgramResourceProvider.java
@@ -9,4 +9,8 @@
 public interface ProgramResourceProvider {
 
   Collection<ProgramResource> getProgramResources() throws ResourceException;
+
+  default DataResourceProvider getDataResourceProvider() {
+    return null;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 919e982..a52d694 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -228,12 +228,6 @@
           new EnsureNonDexProgramResourceProvider(programProvider));
     }
 
-    public Builder addDataResourceProvider(DataResourceProvider dataResourceProvider) {
-      assert dataResourceProvider != null;
-      getAppBuilder().addDataResourceProvider(dataResourceProvider);
-      return self();
-    }
-
     @Override
     protected InternalProgramOutputPathConsumer createProgramOutputConsumer(
         Path path,
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 7dec61a..a478860 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -114,7 +114,7 @@
       classReader.readSources();
       ThreadUtils.awaitFutures(futures);
       classReader.initializeLazyClassCollection(builder);
-      builder.replaceDataResourceProviders(inputApp.getDataResourceProviders());
+      builder.addProgramResourceProviders(inputApp.getProgramResourceProviders());
     } catch (ResourceException e) {
       throw options.reporter.fatalError(new StringDiagnostic(e.getMessage(), e.getOrigin()));
     } finally {
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index b8d17ce..df16622 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.DataResourceProvider.Visitor;
 import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.DexOverflowException;
@@ -42,9 +43,11 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import java.util.stream.Collectors;
 
 public class ApplicationWriter {
 
@@ -297,7 +300,14 @@
     }
     DataResourceConsumer dataResourceConsumer = options.dataResourceConsumer;
     if (dataResourceConsumer != null) {
-      for (DataResourceProvider dataResourceProvider : application.dataResourceProviders) {
+
+      List<DataResourceProvider> dataResourceProviders = application.programResourceProviders
+          .stream()
+          .map(ProgramResourceProvider::getDataResourceProvider)
+          .filter(Objects::nonNull)
+          .collect(Collectors.toList());
+
+      for (DataResourceProvider dataResourceProvider : dataResourceProviders) {
         try {
           dataResourceProvider.accept(new Visitor() {
             @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index e908b64..ead547f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -6,7 +6,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.DataResourceProvider;
+import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -27,7 +27,7 @@
   // Maps type into class, may be used concurrently.
   final ProgramClassCollection programClasses;
 
-  public final ImmutableList<DataResourceProvider> dataResourceProviders;
+  public final ImmutableList<ProgramResourceProvider> programResourceProviders;
 
   public final ImmutableSet<DexType> mainDexList;
   public final String deadCode;
@@ -47,7 +47,7 @@
   DexApplication(
       ClassNameMapper proguardMap,
       ProgramClassCollection programClasses,
-      ImmutableList<DataResourceProvider> dataResourceProviders,
+      ImmutableList<ProgramResourceProvider> programResourceProviders,
       ImmutableSet<DexType> mainDexList,
       String deadCode,
       DexItemFactory dexItemFactory,
@@ -56,7 +56,7 @@
     assert programClasses != null;
     this.proguardMap = proguardMap;
     this.programClasses = programClasses;
-    this.dataResourceProviders = dataResourceProviders;
+    this.programResourceProviders = programResourceProviders;
     this.mainDexList = mainDexList;
     this.deadCode = deadCode;
     this.dexItemFactory = dexItemFactory;
@@ -118,7 +118,7 @@
 
     final List<DexProgramClass> programClasses;
 
-    final List<DataResourceProvider> dataResourceProviders = new ArrayList<>();
+    final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>();
 
     public final DexItemFactory dexItemFactory;
     ClassNameMapper proguardMap;
@@ -141,7 +141,7 @@
 
     public Builder(DexApplication application) {
       programClasses = application.programClasses.getAllClasses();
-      replaceDataResourceProviders(application.dataResourceProviders);
+      addProgramResourceProviders(application.programResourceProviders);
       proguardMap = application.getProguardMap();
       timing = application.timing;
       highestSortingString = application.highestSortingString;
@@ -164,11 +164,10 @@
       return self();
     }
 
-    public synchronized T replaceDataResourceProviders(
-        List<DataResourceProvider> dataResourceProviders) {
-      this.dataResourceProviders.clear();
-      if (dataResourceProviders != null) {
-        this.dataResourceProviders.addAll(dataResourceProviders);
+    public synchronized T addProgramResourceProviders(
+        List<ProgramResourceProvider> programResourceProviders) {
+      if (programResourceProviders != null) {
+        this.programResourceProviders.addAll(programResourceProviders);
       }
       return self();
     }
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 a28d8ef..8d5f0d0 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -6,7 +6,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.DataResourceProvider;
+import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.Timing;
@@ -25,12 +25,12 @@
 
   private DirectMappedDexApplication(ClassNameMapper proguardMap,
       ProgramClassCollection programClasses,
-      ImmutableList<DataResourceProvider> dataResourceProviders,
+      ImmutableList<ProgramResourceProvider> programResourceProviders,
       ImmutableMap<DexType, DexLibraryClass> libraryClasses,
       ImmutableSet<DexType> mainDexList, String deadCode,
       DexItemFactory dexItemFactory, DexString highestSortingString,
       Timing timing) {
-    super(proguardMap, programClasses, dataResourceProviders, mainDexList, deadCode,
+    super(proguardMap, programClasses, programResourceProviders, mainDexList, deadCode,
         dexItemFactory, highestSortingString, timing);
     this.libraryClasses = libraryClasses;
   }
@@ -119,7 +119,7 @@
           proguardMap,
           ProgramClassCollection.create(
               programClasses, ProgramClassCollection::resolveClassConflictImpl),
-          ImmutableList.copyOf(dataResourceProviders),
+          ImmutableList.copyOf(programResourceProviders),
           libraryClasses.stream().collect(ImmutableMap.toImmutableMap(c -> c.type, c -> c)),
           ImmutableSet.copyOf(mainDexList),
           deadCode,
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 6eb9ce5..b648e41 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -6,7 +6,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.DataResourceProvider;
+import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.ClasspathClassCollection;
@@ -28,13 +28,13 @@
    */
   private LazyLoadedDexApplication(ClassNameMapper proguardMap,
       ProgramClassCollection programClasses,
-      ImmutableList<DataResourceProvider> dataResourceProviders,
+      ImmutableList<ProgramResourceProvider> programResourceProviders,
       ClasspathClassCollection classpathClasses,
       LibraryClassCollection libraryClasses,
       ImmutableSet<DexType> mainDexList, String deadCode,
       DexItemFactory dexItemFactory, DexString highestSortingString,
       Timing timing) {
-    super(proguardMap, programClasses, dataResourceProviders, mainDexList, deadCode,
+    super(proguardMap, programClasses, programResourceProviders, mainDexList, deadCode,
         dexItemFactory, highestSortingString, timing);
     this.classpathClasses = classpathClasses;
     this.libraryClasses = libraryClasses;
@@ -122,7 +122,7 @@
       return new LazyLoadedDexApplication(
           proguardMap,
           ProgramClassCollection.create(programClasses, resolver),
-          ImmutableList.copyOf(dataResourceProviders),
+          ImmutableList.copyOf(programResourceProviders),
           classpathClasses,
           libraryClasses,
           ImmutableSet.copyOf(mainDexList),
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 1bf193b..d8dffea 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.ArchiveClassFileProvider;
 import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.ClassFileResourceProvider;
-import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.DirectoryClassFileProvider;
@@ -49,7 +48,6 @@
 public class AndroidApp {
 
   private final ImmutableList<ProgramResourceProvider> programResourceProviders;
-  private final ImmutableList<DataResourceProvider> dataResourceProviders;
   private final ImmutableMap<Resource, String> programResourcesMainDescriptor;
   private final ImmutableList<ClassFileResourceProvider> classpathResourceProviders;
   private final ImmutableList<ClassFileResourceProvider> libraryResourceProviders;
@@ -61,7 +59,6 @@
   // See factory methods and AndroidApp.Builder below.
   private AndroidApp(
       ImmutableList<ProgramResourceProvider> programResourceProviders,
-      ImmutableList<DataResourceProvider> dataResourceProviders,
       ImmutableMap<Resource, String> programResourcesMainDescriptor,
       ImmutableList<ClassFileResourceProvider> classpathResourceProviders,
       ImmutableList<ClassFileResourceProvider> libraryResourceProviders,
@@ -69,7 +66,6 @@
       List<StringResource> mainDexListResources,
       List<String> mainDexClasses) {
     this.programResourceProviders = programResourceProviders;
-    this.dataResourceProviders = dataResourceProviders;
     this.programResourcesMainDescriptor = programResourcesMainDescriptor;
     this.classpathResourceProviders = classpathResourceProviders;
     this.libraryResourceProviders = libraryResourceProviders;
@@ -146,11 +142,6 @@
     return programResourceProviders;
   }
 
-  /** Get non program resource providers. */
-  public List<DataResourceProvider> getDataResourceProviders() {
-    return dataResourceProviders;
-  }
-
   /** Get classpath resource providers. */
   public List<ClassFileResourceProvider> getClasspathResourceProviders() {
     return classpathResourceProviders;
@@ -276,7 +267,6 @@
 
     private final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>();
     private final List<ProgramResource> programResources = new ArrayList<>();
-    private final List<DataResourceProvider> dataResourceProviders = new ArrayList<>();
     private final Map<ProgramResource, String> programResourcesMainDescriptor = new HashMap<>();
     private final List<ClassFileResourceProvider> classpathResourceProviders = new ArrayList<>();
     private final List<ClassFileResourceProvider> libraryResourceProviders = new ArrayList<>();
@@ -300,7 +290,6 @@
       programResourceProviders.addAll(app.programResourceProviders);
       classpathResourceProviders.addAll(app.classpathResourceProviders);
       libraryResourceProviders.addAll(app.libraryResourceProviders);
-      dataResourceProviders.addAll(app.dataResourceProviders);
       mainDexListResources = app.mainDexListResources;
       mainDexListClasses = app.mainDexClasses;
     }
@@ -329,8 +318,6 @@
         ArchiveResourceProvider archiveResourceProvider =
             new ArchiveResourceProvider(archive, ignoreDexInArchive);
         addProgramResourceProvider(archiveResourceProvider);
-        addDataResourceProvider(archiveResourceProvider);
-
       }
       return this;
     }
@@ -341,12 +328,6 @@
       return this;
     }
 
-    public Builder addDataResourceProvider(DataResourceProvider provider) {
-      assert provider != null;
-      dataResourceProviders.add(provider);
-      return this;
-    }
-
     /**
      * Add classpath file resources.
      */
@@ -562,7 +543,6 @@
       }
       return new AndroidApp(
           ImmutableList.copyOf(programResourceProviders),
-          ImmutableList.copyOf(dataResourceProviders),
           ImmutableMap.copyOf(programResourcesMainDescriptor),
           ImmutableList.copyOf(classpathResourceProviders),
           ImmutableList.copyOf(libraryResourceProviders),
@@ -583,7 +563,6 @@
         ArchiveResourceProvider archiveResourceProvider = new ArchiveResourceProvider(
             FilteredClassPath.unfiltered(file), ignoreDexInArchive);
         addProgramResourceProvider(archiveResourceProvider);
-        addDataResourceProvider(archiveResourceProvider);
       } else {
         throw new CompilationError("Unsupported source file type", new PathOrigin(file));
       }
diff --git a/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java b/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
index 9c33fc5..37aa208 100644
--- a/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
@@ -99,6 +99,11 @@
   }
 
   @Override
+  public DataResourceProvider getDataResourceProvider() {
+    return this;
+  }
+
+  @Override
   public void accept(Visitor resourceBrowser) throws ResourceException {
     try (ZipFile zipFile = new ZipFile(archive.getPath().toFile())) {
       final Enumeration<? extends ZipEntry> entries = zipFile.entries();