Merge "Change Builder APIs with more Origin"
diff --git a/src/main/java/com/android/tools/r8/BaseCommand.java b/src/main/java/com/android/tools/r8/BaseCommand.java
index e35010a..5cd87fb 100644
--- a/src/main/java/com/android/tools/r8/BaseCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCommand.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.shaking.FilteredClassPath;
 import com.android.tools.r8.utils.AbortException;
@@ -159,26 +160,14 @@
     }
 
     /** Add Java-bytecode program-data. */
-    public B addClassProgramData(byte[]... data) {
-      app.addClassProgramData(data);
-      return self();
-    }
-
-    /** Add Java-bytecode program-data. */
-    public B addClassProgramData(Collection<byte[]> data) {
-      app.addClassProgramData(data);
+    public B addClassProgramData(byte[] data, Origin origin) {
+      app.addClassProgramData(data, origin);
       return self();
     }
 
     /** Add dex program-data. */
-    public B addDexProgramData(byte[]... data) {
-      app.addDexProgramData(data);
-      return self();
-    }
-
-    /** Add dex program-data. */
-    public B addDexProgramData(Collection<byte[]> data) {
-      app.addDexProgramData(data);
+    public B addDexProgramData(byte[] data, Origin origin) {
+      app.addDexProgramData(data, origin);
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
index 8f6caa9..7a5f627 100644
--- a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
+++ b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
@@ -151,7 +151,8 @@
           .setOutputMode(OutputMode.FilePerInputClass)
           .setEnableDesugaring(desugar);
       for (int j = 0; j < count; j++) {
-        builder.addClassProgramData(provider.resources.get(descriptors.get(index + j)));
+        builder.addClassProgramData(provider.resources.get(descriptors.get(index + j)),
+            Origin.unknown());
       }
       D8Output out =
           D8.run(
@@ -174,22 +175,21 @@
       Map<String, Resource> outputs,
       ExecutorService executor)
       throws IOException, CompilationException, CompilationFailedException {
-    List<byte[]> bytes = new ArrayList<>(outputs.size());
+    Builder builder = D8Command.builder()
+        .setMinApiLevel(API)
+        .setIntermediate(false)
+        .setMode(CompilationMode.DEBUG)
+        .setOutputMode(OutputMode.Indexed)
+        .setEnableDesugaring(false);
     for (Resource input : outputs.values()) {
       try (InputStream inputStream = input.getStream()) {
-        bytes.add(ByteStreams.toByteArray(inputStream));
+        builder.addDexProgramData(ByteStreams.toByteArray(inputStream), input.origin);
       }
     }
     long start = System.nanoTime();
     D8Output out =
         D8.run(
-            D8Command.builder()
-                .setMinApiLevel(API)
-                .setIntermediate(false)
-                .setMode(CompilationMode.DEBUG)
-                .addDexProgramData(bytes)
-                .setOutputMode(OutputMode.Indexed)
-                .setEnableDesugaring(false) // never need to desugar when merging dex.
+            builder // never need to desugar when merging dex.
                 .build(),
             executor);
     printRuntimeNanoseconds(title("DexMerge", desugar), System.nanoTime() - start);
diff --git a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
index 8972a96..07496c8 100644
--- a/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilder.java
@@ -7,6 +7,8 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Output;
+import com.android.tools.r8.origin.ArchiveEntryOrigin;
+import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.CompilationFailedException;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -135,7 +137,9 @@
     try (InputStream stream = zipFile.getInputStream(classEntry)) {
       CompatDexBuilderCommandBuilder builder = new CompatDexBuilderCommandBuilder();
       builder
-          .addClassProgramData(ByteStreams.toByteArray(stream))
+          .addClassProgramData(ByteStreams.toByteArray(stream),
+              new ArchiveEntryOrigin(classEntry.getName(),
+                  new PathOrigin(Paths.get(zipFile.getName()))))
           .setMode(noLocals ? CompilationMode.RELEASE : CompilationMode.DEBUG)
           .setMinApiLevel(AndroidApiLevel.H_MR2.getLevel());
       return D8.run(builder.build(), executor);
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 d08b0b7..e8e05cf 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -579,8 +579,9 @@
     /**
      * Add dex program-data.
      */
-    public Builder addDexProgramData(byte[]... data) {
-      return addDexProgramData(Arrays.asList(data));
+    public Builder addDexProgramData(byte[] data, Origin origin) {
+      addProgramResources(Kind.DEX, Resource.fromBytes(origin, data));
+      return this;
     }
 
     /**
@@ -596,13 +597,6 @@
     /**
      * Add Java-bytecode program data.
      */
-    public Builder addClassProgramData(byte[]... data) {
-      return addClassProgramData(Arrays.asList(data));
-    }
-
-    /**
-     * Add Java-bytecode program data.
-     */
     public Builder addClassProgramData(Collection<byte[]> data) {
       for (byte[] datum : data) {
         addProgramResources(Kind.CLASS, Resource.fromBytes(Origin.unknown(), datum));
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8Compiler.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8Compiler.java
index 7842a6a..97818f2 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8Compiler.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8Compiler.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
+import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.CompilationFailedException;
 import com.android.tools.r8.utils.OutputMode;
 import java.io.IOException;
@@ -99,7 +100,7 @@
         @Override
         public FileVisitResult visitFile(Path path, BasicFileAttributes basicFileAttributes)
             throws IOException {
-          builder.addClassProgramData(Files.readAllBytes(path));
+          builder.addClassProgramData(Files.readAllBytes(path), new PathOrigin(path));
           return FileVisitResult.CONTINUE;
         }
       });
@@ -118,7 +119,7 @@
         @Override
         public FileVisitResult visitFile(Path path, BasicFileAttributes basicFileAttributes)
             throws IOException {
-          merger.addDexProgramData(Files.readAllBytes(path));
+          merger.addDexProgramData(Files.readAllBytes(path), new PathOrigin(path));
           return FileVisitResult.CONTINUE;
         }
       });
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index c8ca57e..7f9b06f 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -183,7 +183,7 @@
     Resource mergeClassFiles(List<Resource> dexFiles, Path out) throws Throwable {
       D8Command.Builder builder = D8Command.builder();
       for (Resource dexFile : dexFiles) {
-        builder.addDexProgramData(readFromResource(dexFile));
+        builder.addDexProgramData(readFromResource(dexFile), dexFile.origin);
       }
       for (UnaryOperator<D8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
diff --git a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
index 1c68d75..f8b388b 100644
--- a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
@@ -127,7 +127,7 @@
     D8Command.Builder builder = D8Command.builder()
         .setMinApiLevel(minAPILevel);
     for (Resource resource : individalDexes) {
-      builder.addDexProgramData(readFromResource(resource));
+      builder.addDexProgramData(readFromResource(resource), resource.origin);
     }
     AndroidApp mergedResult = ToolHelper.runD8(builder.build(),
         options -> options.setMarker(null));
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index 8480791..7c1ce1b 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -97,7 +97,7 @@
     Path dexOutputDir = temp.newFolder().toPath();
     R8Command command =
         new CompatProguardCommandBuilder(true, true)
-            .addDexProgramData(builder.compile())
+            .addDexProgramData(builder.compile(), Origin.unknown())
             .setOutputPath(dexOutputDir)
             .addProguardConfiguration(proguardConfigurations, Origin.unknown())
             .build();
diff --git a/src/test/java/com/android/tools/r8/regress/Regress37740372.java b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
index 5258b31..1f13013 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -9,7 +9,10 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.D8Command;
+import com.android.tools.r8.D8Command.Builder;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.EmbeddedOrigin;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DexInspector;
@@ -133,14 +136,16 @@
     AndroidApp output =
         ToolHelper.runD8(
             D8Command.builder()
-                .addClassProgramData(Base64.getDecoder().decode(javaLangObjectClassFile))
+                .addClassProgramData(Base64.getDecoder().decode(javaLangObjectClassFile),
+                    EmbeddedOrigin.INSTANCE)
                 .build());
     checkApplicationOnlyHasJavaLangObject(output);
 
     // Build an application with the java.lang.Object stub from a dex file.
     List<byte[]> dex = output.writeToMemory();
     assertEquals(1, dex.size());
-    checkApplicationOnlyHasJavaLangObject(
-        ToolHelper.runD8(D8Command.builder().addDexProgramData(dex).build()));
+    Builder builder = D8Command.builder();
+    dex.forEach(data -> builder.addDexProgramData(data, Origin.unknown()));
+    checkApplicationOnlyHasJavaLangObject(ToolHelper.runD8(builder.build()));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
index 76c24f9..dd07b68 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/inlibraries/StaticLibraryValuesChangeTest.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.jasmin.JasminBuilder;
+import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.shaking.FilteredClassPath;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.AndroidApp;
@@ -75,7 +76,7 @@
 
     // Merge the compiled TestMain with the runtime version of LibraryClass.
     builder = AndroidApp.builder(app);
-    builder.addDexProgramData(runtimeLibrary.compile());
+    builder.addDexProgramData(runtimeLibrary.compile(), EmbeddedOrigin.INSTANCE);
     String result = runOnArt(builder.build(), TestMain.class);
     assertEquals("33", result);
   }
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
index 8e946b6..fa08ece 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.shaking.FilteredClassPath;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DexInspector;
@@ -60,7 +61,7 @@
     );
 
     AndroidApp originalApp = AndroidApp.builder()
-        .addDexProgramData(builder.compile())
+        .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE)
         .addLibraryFiles(FilteredClassPath.unfiltered(ToolHelper.getDefaultAndroidJar()))
         .build();
 
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index e16b172..01b2af4 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.FilteredClassPath;
 import com.android.tools.r8.shaking.ProguardConfiguration;
@@ -55,7 +56,7 @@
   protected AndroidApp buildApplicationWithAndroidJar(SmaliBuilder builder) {
     try {
       return AndroidApp.builder()
-          .addDexProgramData(builder.compile())
+          .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE)
           .addLibraryFiles(FilteredClassPath.unfiltered(ToolHelper.getDefaultAndroidJar()))
           .build();
     } catch (IOException | RecognitionException | ExecutionException | DexOverflowException e) {
@@ -98,7 +99,7 @@
       Path dexOutputDir = temp.newFolder().toPath();
       R8Command command =
           R8Command.builder()
-              .addDexProgramData(builder.compile())
+              .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE)
               .setOutputPath(dexOutputDir)
               .setMode(CompilationMode.DEBUG)
               .addLibraryFiles(Paths.get(ToolHelper.getDefaultAndroidJar()))
diff --git a/tests/api_usage_sample.jar b/tests/api_usage_sample.jar
index 51029b5..3b7d14a 100644
--- a/tests/api_usage_sample.jar
+++ b/tests/api_usage_sample.jar
Binary files differ