Introduce a consumer data abstraction for all program consumers.

Change-Id: If6606e6102a268138beeef7a5dba896767142608
diff --git a/src/main/java/com/android/tools/r8/ClassFileConsumer.java b/src/main/java/com/android/tools/r8/ClassFileConsumer.java
index fa3e5c4..79330fb 100644
--- a/src/main/java/com/android/tools/r8/ClassFileConsumer.java
+++ b/src/main/java/com/android/tools/r8/ClassFileConsumer.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8;
 
 import com.android.tools.r8.utils.ArchiveBuilder;
+import com.android.tools.r8.utils.ClassFileConsumerDataImpl;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.DirectoryBuilder;
 import com.android.tools.r8.utils.OutputBuilder;
@@ -36,22 +37,28 @@
    * {@param handler}. If an error is reported via {@param handler} and no exceptions are thrown,
    * then the compiler guaranties to exit with an error.
    *
-   * <p>The {@link ByteDataView} {@param data} object can only be assumed valid during the duration
-   * of the accept. If the bytes are needed beyond that, a copy must be made elsewhere.
+   * <p>The {@link ByteDataView} obtained by way of {@param data} object can only be assumed valid
+   * during the duration of the accept. If the bytes are needed beyond that, a copy must be made
+   * elsewhere.
    *
-   * @param data Java class-file encoded data.
-   * @param descriptor Class descriptor of the class the data pertains to.
-   * @param handler Diagnostics handler for reporting.
+   * @param data Java class-file encoded data and its meta-data.
    */
-  void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler);
+  default void acceptClassFile(ClassFileConsumerData data) {
+    accept(data.getByteDataView(), data.getClassDescriptor(), data.getDiagnosticsHandler());
+  }
+
+  @Deprecated
+  default void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+    acceptClassFile(new ClassFileConsumerDataImpl(data, descriptor, handler));
+  }
 
   /** Empty consumer to request the production of the resource but ignore its value. */
   static ClassFileConsumer emptyConsumer() {
     return ForwardingConsumer.EMPTY_CONSUMER;
   }
 
-  /** Forwarding consumer to delegate to an optional existing consumer. */
   @Keep
+  @Deprecated
   class ForwardingConsumer implements ClassFileConsumer {
 
     private static final ClassFileConsumer EMPTY_CONSUMER = new ForwardingConsumer(null);
@@ -68,9 +75,9 @@
     }
 
     @Override
-    public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+    public void acceptClassFile(ClassFileConsumerData data) {
       if (consumer != null) {
-        consumer.accept(data, descriptor, handler);
+        consumer.acceptClassFile(data);
       }
     }
 
@@ -117,9 +124,12 @@
     }
 
     @Override
-    public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-      super.accept(data, descriptor, handler);
-      outputBuilder.addFile(DescriptorUtils.getClassFileName(descriptor), data, handler);
+    public void acceptClassFile(ClassFileConsumerData data) {
+      super.acceptClassFile(data);
+      outputBuilder.addFile(
+          DescriptorUtils.getClassFileName(data.getClassDescriptor()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
@@ -194,9 +204,12 @@
     }
 
     @Override
-    public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-      super.accept(data, descriptor, handler);
-      outputBuilder.addFile(DescriptorUtils.getClassFileName(descriptor), data, handler);
+    public void acceptClassFile(ClassFileConsumerData data) {
+      super.acceptClassFile(data);
+      outputBuilder.addFile(
+          DescriptorUtils.getClassFileName(data.getClassDescriptor()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/ClassFileConsumerData.java b/src/main/java/com/android/tools/r8/ClassFileConsumerData.java
new file mode 100644
index 0000000..eeef801
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ClassFileConsumerData.java
@@ -0,0 +1,26 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+/** Data provided in the primary callback of {@link ClassFileConsumer}. */
+@Keep
+public interface ClassFileConsumerData {
+
+  /**
+   * View of the Java class-file encoded data.
+   *
+   * <p>The obtained {@link ByteDataView} object can only be assumed valid during the duration of
+   * the accept method. If the bytes are needed beyond that, a copy must be made elsewhere.
+   */
+  ByteDataView getByteDataView();
+
+  /** Copy of the bytes for the Java class-file encoded data. */
+  byte[] getByteDataCopy();
+
+  /** Class descriptor of the class the data pertains to. */
+  String getClassDescriptor();
+
+  /** Diagnostics handler for reporting. */
+  DiagnosticsHandler getDiagnosticsHandler();
+}
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index c57bc22..85a0fbf 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -53,7 +53,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 
@@ -441,12 +440,14 @@
     private final List<ProgramResource> resources = new ArrayList<>();
 
     @Override
-    public synchronized void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
+    public synchronized void acceptDexIndexedFile(DexIndexedConsumerData data) {
       // TODO(b/154106502): Map Origin information.
       resources.add(
           ProgramResource.fromBytes(
-              Origin.unknown(), ProgramResource.Kind.DEX, data.copyByteData(), descriptors));
+              Origin.unknown(),
+              ProgramResource.Kind.DEX,
+              data.getByteDataCopy(),
+              data.getClassDescriptors()));
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumer.java b/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumer.java
index 1675cb2..68e6f12 100644
--- a/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumer.java
+++ b/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumer.java
@@ -34,7 +34,7 @@
 @KeepForSubclassing
 public interface DexFilePerClassFileConsumer extends ProgramConsumer, ByteBufferProvider {
 
-  static final boolean SHOULD_COMBINE_SYNTHETIC_CLASSES = true;
+  boolean SHOULD_COMBINE_SYNTHETIC_CLASSES = true;
 
   /**
    * Callback to receive DEX data for a single Java class-file input and its companion classes.
@@ -42,24 +42,30 @@
    * <p>There is no guaranteed order and files might be written concurrently.
    *
    * <p>The consumer is expected not to throw, but instead report any errors via the diagnostics
-   * {@param handler}. If an error is reported via {@param handler} and no exceptions are thrown,
-   * then the compiler guaranties to exit with an error.
+   * {@link DiagnosticsHandler} in the callback data. If an error is reported via handler and no
+   * exceptions are thrown, then the compiler guaranties to exit with an error.
    *
-   * <p>The {@link ByteDataView} {@param data} object can only be assumed valid during the duration
-   * of the accept. If the bytes are needed beyond that, a copy must be made elsewhere.
-   *
-   * @param primaryClassDescriptor Class descriptor of the class from the input class-file.
-   * @param data DEX encoded data in a ByteDataView wrapper.
-   * @param descriptors Class descriptors for all classes defined in the DEX data.
-   * @param handler Diagnostics handler for reporting.
+   * <p>The {@link ByteDataView} obtained from the {@param data} object can only be assumed valid
+   * during the duration of the accept. If the bytes are needed beyond that, a copy must be made
+   * elsewhere.
    */
+  default void acceptDexFile(DexFilePerClassFileConsumerData data) {
+    accept(
+        data.getPrimaryClassDescriptor(),
+        data.getByteDataView(),
+        data.getClassDescriptors(),
+        data.getDiagnosticsHandler());
+  }
+
+  // Any new implementation should not use or call the deprecated accept method.
+  @Deprecated
   default void accept(
       String primaryClassDescriptor,
       ByteDataView data,
       Set<String> descriptors,
       DiagnosticsHandler handler) {
-    // To avoid breaking binary compatiblity, old consumers not implementing the new API will be
-    // forwarded to. New consumers must implement the accept on ByteDataView.
+    // To avoid breaking binary compatibility, old consumers not implementing the new API will be
+    // forwarded to. New consumers must implement the accept method on the data object.
     accept(primaryClassDescriptor, data.copyByteData(), descriptors, handler);
   }
 
@@ -92,8 +98,8 @@
     return ForwardingConsumer.EMPTY_CONSUMER;
   }
 
-  /** Forwarding consumer to delegate to an optional existing consumer. */
   @Keep
+  @Deprecated
   class ForwardingConsumer implements DexFilePerClassFileConsumer {
 
     private static final DexFilePerClassFileConsumer EMPTY_CONSUMER = new ForwardingConsumer(null);
@@ -110,13 +116,9 @@
     }
 
     @Override
-    public void accept(
-        String primaryClassDescriptor,
-        ByteDataView data,
-        Set<String> descriptors,
-        DiagnosticsHandler handler) {
+    public void acceptDexFile(DexFilePerClassFileConsumerData data) {
       if (consumer != null) {
-        consumer.accept(primaryClassDescriptor, data, descriptors, handler);
+        consumer.acceptDexFile(data);
       }
     }
 
@@ -178,13 +180,12 @@
     }
 
     @Override
-    public void accept(
-        String primaryClassDescriptor,
-        ByteDataView data,
-        Set<String> descriptors,
-        DiagnosticsHandler handler) {
-      super.accept(primaryClassDescriptor, data, descriptors, handler);
-      outputBuilder.addFile(getDexFileName(primaryClassDescriptor), data, handler);
+    public void acceptDexFile(DexFilePerClassFileConsumerData data) {
+      super.acceptDexFile(data);
+      outputBuilder.addFile(
+          getDexFileName(data.getPrimaryClassDescriptor()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
@@ -262,13 +263,12 @@
     }
 
     @Override
-    public void accept(
-        String primaryClassDescriptor,
-        ByteDataView data,
-        Set<String> descriptors,
-        DiagnosticsHandler handler) {
-      super.accept(primaryClassDescriptor, data, descriptors, handler);
-      outputBuilder.addFile(getDexFileName(primaryClassDescriptor), data, handler);
+    public void acceptDexFile(DexFilePerClassFileConsumerData data) {
+      super.acceptDexFile(data);
+      outputBuilder.addFile(
+          getDexFileName(data.getPrimaryClassDescriptor()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumerData.java b/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumerData.java
new file mode 100644
index 0000000..e93aa0c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/DexFilePerClassFileConsumerData.java
@@ -0,0 +1,26 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import java.util.Set;
+
+/** Data provided in the primary callback of {@link DexFilePerClassFileConsumer}. */
+@Keep
+public interface DexFilePerClassFileConsumerData {
+
+  /** Class descriptor of the class from the input class-file. */
+  String getPrimaryClassDescriptor();
+
+  /** DEX encoded data in a ByteDataView wrapper. */
+  ByteDataView getByteDataView();
+
+  /** Copy of the bytes for the DEX encoded data. */
+  byte[] getByteDataCopy();
+
+  /** Class descriptors for all classes defined in the DEX data. */
+  Set<String> getClassDescriptors();
+
+  /** Diagnostics handler for reporting. */
+  DiagnosticsHandler getDiagnosticsHandler();
+}
diff --git a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
index 39f5b2e..cbccf59 100644
--- a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
+++ b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
@@ -46,17 +46,22 @@
    * <p>There is no guaranteed order and files might be written concurrently.
    *
    * <p>The consumer is expected not to throw, but instead report any errors via the diagnostics
-   * {@param handler}. If an error is reported via {@param handler} and no exceptions are thrown,
-   * then the compiler guaranties to exit with an error.
+   * {@link DiagnosticsHandler} in the callback data. If an error is reported via handler and no
+   * exceptions are thrown, then the compiler guaranties to exit with an error.
    *
-   * <p>The {@link ByteDataView} {@param data} object can only be assumed valid during the duration
-   * of the accept. If the bytes are needed beyond that, a copy must be made elsewhere.
-   *
-   * @param fileIndex Index of the DEX file for multi-dexing. Files are zero-indexed.
-   * @param data DEX encoded data in a ByteDataView wrapper.
-   * @param descriptors Class descriptors for all classes defined in the DEX data.
-   * @param handler Diagnostics handler for reporting.
+   * <p>The {@link ByteDataView} obtained from the {@param data} object can only be assumed valid
+   * during the duration of the accept. If the bytes are needed beyond that, a copy must be made
+   * elsewhere.
    */
+  default void acceptDexIndexedFile(DexIndexedConsumerData data) {
+    accept(
+        data.getFileIndex(),
+        data.getByteDataView(),
+        data.getClassDescriptors(),
+        data.getDiagnosticsHandler());
+  }
+
+  @Deprecated
   default void accept(
       int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
     // To avoid breaking binary compatiblity, old consumers not implementing the new API will be
@@ -77,8 +82,8 @@
     return ForwardingConsumer.EMPTY_CONSUMER;
   }
 
-  /** Forwarding consumer to delegate to an optional existing consumer. */
   @Keep
+  @Deprecated
   class ForwardingConsumer implements DexIndexedConsumer {
 
     private static final DexIndexedConsumer EMPTY_CONSUMER = new ForwardingConsumer(null);
@@ -95,10 +100,9 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
       if (consumer != null) {
-        consumer.accept(fileIndex, data, descriptors, handler);
+        consumer.acceptDexIndexedFile(data);
       }
     }
 
@@ -150,11 +154,13 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
-      super.accept(fileIndex, data, descriptors, handler);
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+      super.acceptDexIndexedFile(data);
       outputBuilder.addIndexedClassFile(
-          fileIndex, DexUtils.getDefaultDexFileName(fileIndex), data, handler);
+          data.getFileIndex(),
+          DexUtils.getDefaultDexFileName(data.getFileIndex()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
@@ -245,15 +251,17 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
-      super.accept(fileIndex, data, descriptors, handler);
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+      super.acceptDexIndexedFile(data);
       try {
         prepareDirectory();
       } catch (IOException e) {
-        handler.error(new ExceptionDiagnostic(e, new PathOrigin(directory)));
+        data.getDiagnosticsHandler().error(new ExceptionDiagnostic(e, new PathOrigin(directory)));
       }
-      outputBuilder.addFile(DexUtils.getDefaultDexFileName(fileIndex), data, handler);
+      outputBuilder.addFile(
+          DexUtils.getDefaultDexFileName(data.getFileIndex()),
+          data.getByteDataView(),
+          data.getDiagnosticsHandler());
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/DexIndexedConsumerData.java b/src/main/java/com/android/tools/r8/DexIndexedConsumerData.java
new file mode 100644
index 0000000..1c46f8c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/DexIndexedConsumerData.java
@@ -0,0 +1,26 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import java.util.Set;
+
+/** Data provided in the primary callback of {@link DexIndexedConsumer}. */
+@Keep
+public interface DexIndexedConsumerData {
+
+  /** Index of the DEX file for multi-dexing (Files are zero-indexed). */
+  int getFileIndex();
+
+  /** DEX encoded data in a ByteDataView wrapper. */
+  ByteDataView getByteDataView();
+
+  /** Copy of the bytes for the DEX encoded data. */
+  byte[] getByteDataCopy();
+
+  /** Class descriptors for all classes defined in the DEX data. */
+  Set<String> getClassDescriptors();
+
+  /** Diagnostics handler for reporting. */
+  DiagnosticsHandler getDiagnosticsHandler();
+}
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 99cb304..e9aab77 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -58,6 +58,8 @@
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.DexFilePerClassFileConsumerDataImpl;
+import com.android.tools.r8.utils.DexIndexedConsumerDataImpl;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.IntBox;
 import com.android.tools.r8.utils.InternalGlobalSyntheticsProgramConsumer;
@@ -586,13 +588,14 @@
     ProgramConsumer consumer;
     ByteBufferProvider byteBufferProvider;
 
+    String primaryClassDescriptor = virtualFile.getPrimaryClassDescriptor();
     if (globalSyntheticFiles != null && globalSyntheticFiles.contains(virtualFile)) {
       consumer = globalsSyntheticsConsumer;
       byteBufferProvider = globalsSyntheticsConsumer;
     } else if (programConsumer != null) {
       consumer = programConsumer;
       byteBufferProvider = programConsumer;
-    } else if (virtualFile.getPrimaryClassDescriptor() != null) {
+    } else if (primaryClassDescriptor != null) {
       consumer = options.getDexFilePerClassFileConsumer();
       byteBufferProvider = options.getDexFilePerClassFileConsumer();
     } else {
@@ -620,14 +623,17 @@
     timing.begin("Pass bytes to consumer");
     if (consumer instanceof DexFilePerClassFileConsumer) {
       ((DexFilePerClassFileConsumer) consumer)
-          .accept(
-              virtualFile.getPrimaryClassDescriptor(),
-              data,
-              virtualFile.getClassDescriptors(),
-              options.reporter);
+          .acceptDexFile(
+              new DexFilePerClassFileConsumerDataImpl(
+                  primaryClassDescriptor,
+                  data,
+                  virtualFile.getClassDescriptors(),
+                  options.reporter));
     } else {
       ((DexIndexedConsumer) consumer)
-          .accept(virtualFile.getId(), data, virtualFile.getClassDescriptors(), options.reporter);
+          .acceptDexIndexedFile(
+              new DexIndexedConsumerDataImpl(
+                  virtualFile.getId(), data, virtualFile.getClassDescriptors(), options.reporter));
     }
     timing.end();
     // Release use of the backing buffer now that accept has returned.
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java
index 0a81bd2..cdb74b5 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.utils.BitUtils;
+import com.android.tools.r8.utils.DexIndexedConsumerDataImpl;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -172,7 +173,9 @@
     if (consumer instanceof DexFilePerClassFileConsumer) {
       assert false;
     } else {
-      ((DexIndexedConsumer) consumer).accept(0, data, Sets.newIdentityHashSet(), options.reporter);
+      ((DexIndexedConsumer) consumer)
+          .acceptDexIndexedFile(
+              new DexIndexedConsumerDataImpl(0, data, Sets.newIdentityHashSet(), options.reporter));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index cc88ca9..49f2fbb 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -47,6 +47,7 @@
 import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AsmUtils;
+import com.android.tools.r8.utils.ClassFileConsumerDataImpl;
 import com.android.tools.r8.utils.ComparatorUtils;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.InternalGlobalSyntheticsProgramConsumer.InternalGlobalSyntheticsCfConsumer;
@@ -334,7 +335,10 @@
       verifyCf(result);
     }
     ExceptionUtils.withConsumeResourceHandler(
-        options.reporter, handler -> consumer.accept(ByteDataView.of(result), desc, handler));
+        options.reporter,
+        handler ->
+            consumer.acceptClassFile(
+                new ClassFileConsumerDataImpl(ByteDataView.of(result), desc, handler)));
   }
 
   private int compareTypesThroughLens(DexType a, DexType b) {
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidAppConsumers.java b/src/main/java/com/android/tools/r8/utils/AndroidAppConsumers.java
index 7a77e25..1c01a7b 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidAppConsumers.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidAppConsumers.java
@@ -4,14 +4,16 @@
 package com.android.tools.r8.utils;
 
 import com.android.tools.r8.BaseCompilerCommand;
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.ClassFileConsumerData;
 import com.android.tools.r8.DataDirectoryResource;
 import com.android.tools.r8.DataEntryResource;
 import com.android.tools.r8.DataResourceConsumer;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
+import com.android.tools.r8.DexFilePerClassFileConsumerData;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.DexIndexedConsumer.ForwardingConsumer;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.ProgramConsumer;
 import com.android.tools.r8.ResourceException;
@@ -103,13 +105,9 @@
               new Int2ReferenceAVLTreeMap<>();
 
           @Override
-          public void accept(
-              int fileIndex,
-              ByteDataView data,
-              Set<String> descriptors,
-              DiagnosticsHandler handler) {
-            super.accept(fileIndex, data, descriptors, handler);
-            addDexFile(fileIndex, data.copyByteData(), descriptors);
+          public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+            super.acceptDexIndexedFile(data);
+            addDexFile(data.getFileIndex(), data.getByteDataCopy(), data.getClassDescriptors());
           }
 
           @Override
@@ -182,13 +180,12 @@
           private TreeMap<String, DescriptorsWithContents> files = new TreeMap<>();
 
           @Override
-          public void accept(
-              String primaryClassDescriptor,
-              ByteDataView data,
-              Set<String> descriptors,
-              DiagnosticsHandler handler) {
-            super.accept(primaryClassDescriptor, data, descriptors, handler);
-            addDexFile(primaryClassDescriptor, data.copyByteData(), descriptors);
+          public void acceptDexFile(DexFilePerClassFileConsumerData data) {
+            super.acceptDexFile(data);
+            addDexFile(
+                data.getPrimaryClassDescriptor(),
+                data.getByteDataCopy(),
+                data.getClassDescriptors());
           }
 
           synchronized void addDexFile(
@@ -258,9 +255,9 @@
           private List<DescriptorsWithContents> files = new ArrayList<>();
 
           @Override
-          public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-            super.accept(data, descriptor, handler);
-            addClassFile(data.copyByteData(), descriptor);
+          public void acceptClassFile(ClassFileConsumerData data) {
+            super.acceptClassFile(data);
+            addClassFile(data.getByteDataCopy(), data.getClassDescriptor());
           }
 
           synchronized void addClassFile(byte[] data, String descriptor) {
diff --git a/src/main/java/com/android/tools/r8/utils/ClassFileConsumerDataImpl.java b/src/main/java/com/android/tools/r8/utils/ClassFileConsumerDataImpl.java
new file mode 100644
index 0000000..b375086
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/ClassFileConsumerDataImpl.java
@@ -0,0 +1,43 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.ClassFileConsumerData;
+import com.android.tools.r8.DiagnosticsHandler;
+
+/** Internal implementation of the consumer data. */
+public class ClassFileConsumerDataImpl implements ClassFileConsumerData {
+
+  private final ByteDataView data;
+  private final String descriptor;
+  private final DiagnosticsHandler handler;
+
+  public ClassFileConsumerDataImpl(
+      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+    this.data = data;
+    this.descriptor = descriptor;
+    this.handler = handler;
+  }
+
+  @Override
+  public ByteDataView getByteDataView() {
+    return data;
+  }
+
+  @Override
+  public byte[] getByteDataCopy() {
+    return data.copyByteData();
+  }
+
+  @Override
+  public String getClassDescriptor() {
+    return descriptor;
+  }
+
+  @Override
+  public DiagnosticsHandler getDiagnosticsHandler() {
+    return handler;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/DexFilePerClassFileConsumerDataImpl.java b/src/main/java/com/android/tools/r8/utils/DexFilePerClassFileConsumerDataImpl.java
new file mode 100644
index 0000000..4e028d5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/DexFilePerClassFileConsumerDataImpl.java
@@ -0,0 +1,53 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.DexFilePerClassFileConsumerData;
+import com.android.tools.r8.DiagnosticsHandler;
+import java.util.Set;
+
+public class DexFilePerClassFileConsumerDataImpl implements DexFilePerClassFileConsumerData {
+
+  private final String primaryClassDescriptor;
+  private final ByteDataView data;
+  private final Set<String> classDescriptors;
+  private final DiagnosticsHandler handler;
+
+  public DexFilePerClassFileConsumerDataImpl(
+      String primaryClassDescriptor,
+      ByteDataView data,
+      Set<String> classDescriptors,
+      DiagnosticsHandler handler) {
+    this.primaryClassDescriptor = primaryClassDescriptor;
+    this.data = data;
+    this.classDescriptors = classDescriptors;
+    this.handler = handler;
+  }
+
+  @Override
+  public String getPrimaryClassDescriptor() {
+    return primaryClassDescriptor;
+  }
+
+  @Override
+  public ByteDataView getByteDataView() {
+    return data;
+  }
+
+  @Override
+  public byte[] getByteDataCopy() {
+    return data.copyByteData();
+  }
+
+  @Override
+  public Set<String> getClassDescriptors() {
+    return classDescriptors;
+  }
+
+  @Override
+  public DiagnosticsHandler getDiagnosticsHandler() {
+    return handler;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/DexIndexedConsumerDataImpl.java b/src/main/java/com/android/tools/r8/utils/DexIndexedConsumerDataImpl.java
new file mode 100644
index 0000000..2de21e4
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/DexIndexedConsumerDataImpl.java
@@ -0,0 +1,50 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.DexIndexedConsumerData;
+import com.android.tools.r8.DiagnosticsHandler;
+import java.util.Set;
+
+public class DexIndexedConsumerDataImpl implements DexIndexedConsumerData {
+
+  private final int fileIndex;
+  private final ByteDataView data;
+  private final Set<String> classDescriptors;
+  private final DiagnosticsHandler handler;
+
+  public DexIndexedConsumerDataImpl(
+      int fileIndex, ByteDataView data, Set<String> classDescriptors, DiagnosticsHandler handler) {
+    this.fileIndex = fileIndex;
+    this.data = data;
+    this.classDescriptors = classDescriptors;
+    this.handler = handler;
+  }
+
+  @Override
+  public int getFileIndex() {
+    return fileIndex;
+  }
+
+  @Override
+  public ByteDataView getByteDataView() {
+    return data;
+  }
+
+  @Override
+  public byte[] getByteDataCopy() {
+    return data.copyByteData();
+  }
+
+  @Override
+  public Set<String> getClassDescriptors() {
+    return classDescriptors;
+  }
+
+  @Override
+  public DiagnosticsHandler getDiagnosticsHandler() {
+    return handler;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java b/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java
index 1428459..6fcc519 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
+import com.android.tools.r8.DexFilePerClassFileConsumerData;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.GlobalSyntheticsConsumer;
 import com.android.tools.r8.ProgramConsumer;
@@ -102,12 +103,8 @@
     }
 
     @Override
-    public synchronized void accept(
-        String primaryClassDescriptor,
-        ByteDataView data,
-        Set<String> descriptors,
-        DiagnosticsHandler handler) {
-      builder.addGlobalSynthetic(primaryClassDescriptor, data.copyByteData());
+    public synchronized void acceptDexFile(DexFilePerClassFileConsumerData data) {
+      builder.addGlobalSynthetic(data.getPrimaryClassDescriptor(), data.getByteDataCopy());
     }
 
     @Override
@@ -149,12 +146,8 @@
     }
 
     @Override
-    public void accept(
-        String primaryClassDescriptor,
-        ByteDataView data,
-        Set<String> descriptors,
-        DiagnosticsHandler handler) {
-      addGlobal(primaryClassDescriptor, data);
+    public void acceptDexFile(DexFilePerClassFileConsumerData data) {
+      addGlobal(data.getPrimaryClassDescriptor(), data.getByteDataView());
     }
 
     @Override
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 11cebfd..ff10302 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -44,7 +44,6 @@
 import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 import java.util.function.Predicate;
 import java.util.zip.ZipFile;
 import org.junit.Test;
@@ -466,15 +465,10 @@
     class MultiTypeConsumer implements DexIndexedConsumer, DexFilePerClassFileConsumer {
 
       @Override
-      public void accept(
-          String primaryClassDescriptor,
-          ByteDataView data,
-          Set<String> descriptors,
-          DiagnosticsHandler handler) {}
+      public void acceptDexFile(DexFilePerClassFileConsumerData data) {}
 
       @Override
-      public void accept(
-          int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {}
+      public void acceptDexIndexedFile(DexIndexedConsumerData data) {}
 
       @Override
       public void finished(DiagnosticsHandler handler) {
diff --git a/src/test/java/com/android/tools/r8/ExtractMarkerTest.java b/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
index 6ed73d8..e8a4d1d 100644
--- a/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Paths;
 import java.util.Collection;
-import java.util.Set;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -60,15 +59,11 @@
             .setProgramConsumer(
                 new DexIndexedConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      int fileIndex,
-                      ByteDataView data,
-                      Set<String> descriptors,
-                      DiagnosticsHandler handler) {
+                  public void acceptDexIndexedFile(DexIndexedConsumerData data) {
                     Marker marker;
                     try {
                       Collection<Marker> markers =
-                          ExtractMarker.extractMarkerFromDexProgramData(data.copyByteData());
+                          ExtractMarker.extractMarkerFromDexProgramData(data.getByteDataCopy());
                       assertEquals(1, markers.size());
                       marker = markers.iterator().next();
                     } catch (Exception e) {
@@ -104,12 +99,11 @@
             .setProgramConsumer(
                 new ClassFileConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                  public void acceptClassFile(ClassFileConsumerData data) {
                     Marker marker;
                     try {
                       Collection<Marker> markers =
-                          ExtractMarker.extractMarkerFromClassProgramData(data.copyByteData());
+                          ExtractMarker.extractMarkerFromClassProgramData(data.getByteDataCopy());
                       assertEquals(1, markers.size());
                       marker = markers.iterator().next();
                     } catch (Exception e) {
diff --git a/src/test/java/com/android/tools/r8/ProguardMapMarkerTest.java b/src/test/java/com/android/tools/r8/ProguardMapMarkerTest.java
index f0b68de..5be0095 100644
--- a/src/test/java/com/android/tools/r8/ProguardMapMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/ProguardMapMarkerTest.java
@@ -63,15 +63,11 @@
             .setProgramConsumer(
                 new DexIndexedConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      int fileIndex,
-                      ByteDataView data,
-                      Set<String> descriptors,
-                      DiagnosticsHandler handler) {
+                  public void acceptDexIndexedFile(DexIndexedConsumerData data) {
                     Marker marker;
                     try {
                       Collection<Marker> markers =
-                          ExtractMarker.extractMarkerFromDexProgramData(data.copyByteData());
+                          ExtractMarker.extractMarkerFromDexProgramData(data.getByteDataCopy());
                       assertEquals(1, markers.size());
                       marker = markers.iterator().next();
                     } catch (Exception e) {
@@ -111,12 +107,11 @@
             .setProgramConsumer(
                 new ClassFileConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                  public void acceptClassFile(ClassFileConsumerData data) {
                     Marker marker;
                     try {
                       Collection<Marker> markers =
-                          ExtractMarker.extractMarkerFromClassProgramData(data.copyByteData());
+                          ExtractMarker.extractMarkerFromClassProgramData(data.getByteDataCopy());
                       assertEquals(1, markers.size());
                       marker = markers.iterator().next();
                     } catch (Exception e) {
diff --git a/src/test/java/com/android/tools/r8/R8ModeMarkerTest.java b/src/test/java/com/android/tools/r8/R8ModeMarkerTest.java
index 32f0871..d4ab329 100644
--- a/src/test/java/com/android/tools/r8/R8ModeMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/R8ModeMarkerTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.dex.Marker;
 import java.util.Collection;
-import java.util.Set;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -40,11 +39,10 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
       try {
         Collection<Marker> markers =
-            ExtractMarker.extractMarkerFromDexProgramData(data.copyByteData());
+            ExtractMarker.extractMarkerFromDexProgramData(data.getByteDataCopy());
         assertEquals(1, markers.size());
         marker = markers.iterator().next();
       } catch (Exception e) {
@@ -67,10 +65,10 @@
     }
 
     @Override
-    public void accept(ByteDataView data, String descriptors, DiagnosticsHandler handler) {
+    public void acceptClassFile(ClassFileConsumerData data) {
       try {
         Collection<Marker> markers =
-            ExtractMarker.extractMarkerFromClassProgramData(data.copyByteData());
+            ExtractMarker.extractMarkerFromClassProgramData(data.getByteDataCopy());
         assertEquals(1, markers.size());
         marker = markers.iterator().next();
       } catch (Exception e) {
diff --git a/src/test/java/com/android/tools/r8/d8/DexVersionTests.java b/src/test/java/com/android/tools/r8/d8/DexVersionTests.java
index f413f98..7c82964 100644
--- a/src/test/java/com/android/tools/r8/d8/DexVersionTests.java
+++ b/src/test/java/com/android/tools/r8/d8/DexVersionTests.java
@@ -5,18 +5,17 @@
 
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Set;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -77,8 +76,7 @@
     boolean hasOutput = false;
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
       hasOutput = true;
     }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileDeprecatedAttribute.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileDeprecatedAttribute.java
index efcc639..2bc0090 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileDeprecatedAttribute.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileDeprecatedAttribute.java
@@ -6,11 +6,10 @@
 
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.ClassFileConsumer.ForwardingConsumer;
+import com.android.tools.r8.ClassFileConsumerData;
 import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -91,9 +90,8 @@
             .setProgramConsumer(
                 new ClassFileConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                    checkDeprecatedAttributes(data.getBuffer());
+                  public void acceptClassFile(ClassFileConsumerData data) {
+                    checkDeprecatedAttributes(data.getByteDataView().getBuffer());
                   }
                 })
             .compile();
@@ -128,8 +126,8 @@
       builder.setProgramConsumer(
           new ForwardingConsumer(null) {
             @Override
-            public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-              checkDeprecatedAttributes(data.getBuffer());
+            public void acceptClassFile(ClassFileConsumerData data) {
+              checkDeprecatedAttributes(data.getByteDataView().getBuffer());
             }
           });
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
index ed2dd4e..9be08a2 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
@@ -10,11 +10,11 @@
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.ClassFileConsumerData;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.DexFilePerClassFileConsumerData;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -247,21 +247,16 @@
             firstRoundOutput.isCf()
                 ? new ClassFileConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                    byte[] bytes = data.copyByteData();
+                  public void acceptClassFile(ClassFileConsumerData data) {
+                    byte[] bytes = data.getByteDataCopy();
                     assert bytes != null;
                     outputsRoundOne.add(bytes);
                   }
                 }
                 : new DexFilePerClassFileConsumer.ForwardingConsumer(null) {
                   @Override
-                  public void accept(
-                      String primaryClassDescriptor,
-                      ByteDataView data,
-                      Set<String> descriptors,
-                      DiagnosticsHandler handler) {
-                    byte[] bytes = data.copyByteData();
+                  public void acceptDexFile(DexFilePerClassFileConsumerData data) {
+                    byte[] bytes = data.getByteDataCopy();
                     assert bytes != null;
                     outputsRoundOne.add(bytes);
                   }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
index 5369238..4a55fc2 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportMainDexTest.java
@@ -9,8 +9,8 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.GenerateMainDexListRunResult;
 import com.android.tools.r8.OutputMode;
@@ -361,13 +361,12 @@
     Set<String> mainDexDescriptors;
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
-      if (fileIndex == 0) {
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+      if (data.getFileIndex() == 0) {
         assertNull(mainDexBytes);
         assertNull(mainDexDescriptors);
-        mainDexBytes = data.copyByteData();
-        mainDexDescriptors = descriptors;
+        mainDexBytes = data.getByteDataCopy();
+        mainDexDescriptors = data.getClassDescriptors();
       }
     }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
index 3fd5104..2f65784 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
@@ -9,9 +9,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.L8TestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
@@ -22,7 +21,6 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.Set;
 import java.util.zip.ZipFile;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -67,8 +65,7 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
       count++;
     }
   }
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
index 1d8821e..3988efd 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
@@ -3,10 +3,8 @@
 import static junit.framework.TestCase.fail;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.FeatureSplit;
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.R8TestCompileResult;
@@ -92,17 +90,7 @@
 
     builder
         .addProgramResourceProvider(ArchiveResourceProvider.fromArchive(featureJar, true))
-        .setProgramConsumer(
-            new ArchiveConsumer(outputPath, true) {
-              @Override
-              public void accept(
-                  int fileIndex,
-                  ByteDataView data,
-                  Set<String> descriptors,
-                  DiagnosticsHandler handler) {
-                super.accept(fileIndex, data, descriptors, handler);
-              }
-            });
+        .setProgramConsumer(new ArchiveConsumer(outputPath, true));
   }
 
   public static FeatureSplit splitWithNonJavaFile(
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 8047716..b46866c 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -8,12 +8,11 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.D8Command.Builder;
 import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliTestBase;
@@ -22,7 +21,6 @@
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.Base64;
-import java.util.Set;
 import org.junit.Test;
 
 public class Regress37740372 extends SmaliTestBase {
@@ -142,10 +140,9 @@
     }
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
-      assertEquals(0, fileIndex);
-      this.data = data.copyByteData();
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+      assertEquals(0, data.getFileIndex());
+      this.data = data.getByteDataCopy();
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index 4321812..4190da5 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
-import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.DexIndexedConsumerData;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.ApplicationWriter;
@@ -19,7 +19,6 @@
 import java.io.StringReader;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import org.antlr.runtime.CommonTokenStream;
@@ -129,9 +128,8 @@
     byte[] contents;
 
     @Override
-    public void accept(
-        int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
-      contents = data.copyByteData();
+    public void acceptDexIndexedFile(DexIndexedConsumerData data) {
+      contents = data.getByteDataCopy();
     }
 
     @Override