[Retrace] Add information object to track file names for partitions

Bug: b/274735214
Change-Id: I279eeed0ac659d5fabbf028aa44ffab67aa08efd
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
index 6680142..ffc0a72 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
@@ -62,6 +62,10 @@
     return false;
   }
 
+  public boolean isPartitionFileNameInformation() {
+    return false;
+  }
+
   public MapVersionMappingInformation asMapVersionMappingInformation() {
     return null;
   }
@@ -102,6 +106,10 @@
     return null;
   }
 
+  public PartitionFileNameInformation asPartitionFileNameInformation() {
+    return null;
+  }
+
   public boolean shouldCompose(MappingInformation existing) {
     return !allowOther(existing);
   }
@@ -176,6 +184,9 @@
       case ResidualSignatureMappingInformation.ID:
         ResidualSignatureMappingInformation.deserialize(version, object, onMappingInfo);
         return;
+      case PartitionFileNameInformation.ID:
+        PartitionFileNameInformation.deserialize(object, onMappingInfo);
+        return;
       default:
         diagnosticsHandler.info(MappingInformationDiagnostics.noHandlerFor(lineNumber, id));
         UnknownJsonMappingInformation.deserialize(id, object, onMappingInfo);
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/PartitionFileNameInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/PartitionFileNameInformation.java
new file mode 100644
index 0000000..8cc01b9
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/PartitionFileNameInformation.java
@@ -0,0 +1,93 @@
+// 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.naming.mappinginformation;
+
+import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+
+public class PartitionFileNameInformation extends ReferentialMappingInformation {
+
+  private final Map<String, String> typeNameToFileNameMapping;
+
+  public static final String ID = "partitionSourceFiles";
+  static final String FILE_NAME_MAPPINGS_KEY = "fileNameMappings";
+
+  private PartitionFileNameInformation(Map<String, String> typeNameToFileNameMapping) {
+    this.typeNameToFileNameMapping = typeNameToFileNameMapping;
+  }
+
+  @Override
+  public String getId() {
+    return ID;
+  }
+
+  public Map<String, String> getTypeNameToFileNameMapping() {
+    return typeNameToFileNameMapping;
+  }
+
+  @Override
+  public boolean isPartitionFileNameInformation() {
+    return true;
+  }
+
+  @Override
+  public PartitionFileNameInformation asPartitionFileNameInformation() {
+    return this;
+  }
+
+  @Override
+  public MappingInformation compose(MappingInformation existing) throws MappingComposeException {
+    throw new MappingComposeException("Unable to compose " + ID);
+  }
+
+  @Override
+  public boolean allowOther(MappingInformation information) {
+    return !information.isPartitionFileNameInformation();
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  @Override
+  public String serialize() {
+    JsonObject object = new JsonObject();
+    object.add(MAPPING_ID_KEY, new JsonPrimitive(ID));
+    JsonObject map = new JsonObject();
+    typeNameToFileNameMapping.forEach(map::addProperty);
+    object.add(FILE_NAME_MAPPINGS_KEY, map);
+    return object.toString();
+  }
+
+  public static void deserialize(JsonObject object, Consumer<MappingInformation> onMappingInfo) {
+    JsonObject mappingsObject = object.getAsJsonObject(FILE_NAME_MAPPINGS_KEY);
+    Builder builder = builder();
+    mappingsObject
+        .entrySet()
+        .forEach(
+            entry ->
+                builder.addClassToFileNameMapping(entry.getKey(), entry.getValue().getAsString()));
+    onMappingInfo.accept(builder.build());
+  }
+
+  public static class Builder {
+
+    private final Map<String, String> typeNameToFileNameMapping = new HashMap<>();
+
+    public Builder addClassToFileNameMapping(String typeName, String fileName) {
+      typeNameToFileNameMapping.put(typeName, fileName);
+      return this;
+    }
+
+    public PartitionFileNameInformation build() {
+      return new PartitionFileNameInformation(typeNameToFileNameMapping);
+    }
+  }
+}