[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);
+ }
+ }
+}