From aa8a4457840310b85b49f62d6f318f794726fa9c Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 12 Nov 2023 23:25:29 +0800 Subject: [PATCH 1/2] Fix #162 --- .../FieldMigratedMappingConfiguration.java | 54 +++++++++---------- .../mappings/MappingConfiguration.java | 3 +- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java index 72304ffb2..3ae71bc02 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java @@ -26,8 +26,8 @@ import java.io.BufferedReader; import java.io.IOException; -import java.io.StringWriter; import java.io.UncheckedIOException; +import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; @@ -58,7 +58,6 @@ import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.ThreadingUtils; import net.fabricmc.loom.util.service.SharedServiceManager; -import net.fabricmc.loom.util.srg.SrgMerger; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.format.Tiny2Writer; import net.fabricmc.mappingio.tree.MappingTree; @@ -110,14 +109,6 @@ protected void manipulateMappings(Project project, Path mappingsJar) throws IOEx this.rawTinyMappings = tinyMappings; this.rawTinyMappingsWithSrg = tinyMappingsWithSrg; - if (extension.shouldGenerateSrgTiny()) { - if (Files.notExists(rawTinyMappingsWithSrg) || extension.refreshDeps()) { - // Merge tiny mappings with srg - SrgMerger.ExtraMappings extraMappings = SrgMerger.ExtraMappings.ofMojmapTsrg(getMojmapSrgFileIfPossible(project)); - SrgMerger.mergeSrg(getRawSrgFile(project), rawTinyMappings, rawTinyMappingsWithSrg, extraMappings, true); - } - } - tinyMappings = mappingsWorkingDir().resolve("mappings-field-migrated.tiny"); tinyMappingsWithSrg = mappingsWorkingDir().resolve("mappings-srg-field-migrated.tiny"); @@ -139,39 +130,46 @@ public void updateFieldMigration(Project project) throws IOException { }); Files.writeString(migratedFieldsCache, new Gson().toJson(map)); Files.deleteIfExists(tinyMappings); + Files.deleteIfExists(tinyMappingsWithSrg); } - if (!Files.exists(tinyMappings)) { + if (Files.notExists(tinyMappings) || Files.notExists(tinyMappingsWithSrg)) { Table fieldDescriptorMap = HashBasedTable.create(); for (Map.Entry entry : migratedFields) { fieldDescriptorMap.put(entry.getKey().owner, entry.getKey().field, entry.getValue()); } - MemoryMappingTree mappings = new MemoryMappingTree(); + injectMigration(project, fieldDescriptorMap, rawTinyMappings, tinyMappings); + injectMigration(project, fieldDescriptorMap, rawTinyMappingsWithSrg, tinyMappingsWithSrg); + } + } - try (BufferedReader reader = Files.newBufferedReader(rawTinyMappings)) { - MappingReader.read(reader, mappings); + private static void injectMigration(Project project, Table fieldDescriptorMap, Path source, Path out) throws IOException { + MemoryMappingTree mappings = new MemoryMappingTree(); - for (MappingTree.ClassMapping classDef : new ArrayList<>(mappings.getClasses())) { - Map row = fieldDescriptorMap.row(classDef.getName(MappingsNamespace.INTERMEDIARY.toString())); + try (BufferedReader reader = Files.newBufferedReader(source)) { + MappingReader.read(reader, mappings); + } - if (!row.isEmpty()) { - for (MappingTree.FieldMapping fieldDef : new ArrayList<>(classDef.getFields())) { - String newDescriptor = row.get(fieldDef.getName(MappingsNamespace.INTERMEDIARY.toString())); + for (MappingTree.ClassMapping classDef : new ArrayList<>(mappings.getClasses())) { + Map row = fieldDescriptorMap.row(classDef.getName(MappingsNamespace.INTERMEDIARY.toString())); - if (newDescriptor != null) { - fieldDef.setSrcDesc(mappings.mapDesc(newDescriptor, mappings.getNamespaceId(MappingsNamespace.INTERMEDIARY.toString()), MappingTreeView.SRC_NAMESPACE_ID)); - } - } + if (!row.isEmpty()) { + for (MappingTree.FieldMapping fieldDef : new ArrayList<>(classDef.getFields())) { + String newDescriptor = row.get(fieldDef.getName(MappingsNamespace.INTERMEDIARY.toString())); + + if (newDescriptor != null) { + String prev = fieldDef.getDesc(MappingsNamespace.INTERMEDIARY.toString()); + fieldDef.setSrcDesc(mappings.mapDesc(newDescriptor, mappings.getNamespaceId(MappingsNamespace.INTERMEDIARY.toString()), MappingTreeView.SRC_NAMESPACE_ID)); + project.getLogger().info("Migrated field descriptor of field {}#{} from {} to {}", classDef.getName(MappingsNamespace.INTERMEDIARY.toString()), fieldDef.getName(MappingsNamespace.INTERMEDIARY.toString()), prev, newDescriptor); } } } + } - StringWriter stringWriter = new StringWriter(); - Tiny2Writer tiny2Writer = new Tiny2Writer(stringWriter, false); - mappings.accept(tiny2Writer); - Files.writeString(tinyMappings, stringWriter.toString(), StandardOpenOption.CREATE); + try (Writer writer = Files.newBufferedWriter(out, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + mappings.accept(new Tiny2Writer(writer, false)); } } @@ -242,7 +240,7 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin String newDescriptorRemapped = DescriptorRemapper.remapDescriptor(newDescriptor, clazz -> srgToIntermediary.getOrDefault(clazz, clazz)); migratedFields.put(new FieldMember(ownerIntermediary, fieldIntermediary), newDescriptorRemapped); - project.getLogger().info(ownerIntermediary + "#" + fieldIntermediary + ": " + descriptorIntermediary + " -> " + newDescriptorRemapped); + project.getLogger().info("Found migration of " + ownerIntermediary + "#" + fieldIntermediary + ": " + descriptorIntermediary + " -> " + newDescriptorRemapped); } } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingConfiguration.java index a27165661..bef4fdbd7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingConfiguration.java @@ -195,7 +195,6 @@ protected void setup(Project project, SharedServiceManager serviceManager, Minec public void setupPost(Project project) throws IOException { LoomGradleExtension extension = LoomGradleExtension.get(project); - manipulateMappings(project, tinyMappingsJar); if (extension.shouldGenerateSrgTiny()) { if (Files.notExists(tinyMappingsWithSrg) || extension.refreshDeps()) { @@ -206,6 +205,8 @@ public void setupPost(Project project) throws IOException { project.getLogger().info(":merged srg mappings in " + stopwatch.stop()); } } + + manipulateMappings(project, tinyMappingsJar); } public void applyToProject(Project project, DependencyInfo dependency) throws IOException { From 3448898c2d87db23823bb2360abc994f5f4636ca Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 13 Nov 2023 00:24:26 +0800 Subject: [PATCH 2/2] Refactor some field migrator code --- .../FieldMigratedMappingConfiguration.java | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java index 3ae71bc02..7a06ed06b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingConfiguration.java @@ -44,7 +44,6 @@ import com.google.common.collect.Table; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; -import dev.architectury.refmapremapper.utils.DescriptorRemapper; import org.gradle.api.Project; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -123,7 +122,8 @@ protected void manipulateMappings(Project project, Path mappingsJar) throws IOEx public void updateFieldMigration(Project project) throws IOException { if (!Files.exists(migratedFieldsCache)) { - generateNewFieldMigration(project); + migratedFields.clear(); + migratedFields.addAll(generateNewFieldMigration(project, MinecraftPatchedProvider.get(project).getMinecraftPatchedSrgJar(), MappingsNamespace.SRG.toString(), rawTinyMappingsWithSrg).entrySet()); Map map = new HashMap<>(); migratedFields.forEach(entry -> { map.put(entry.getKey().owner + "#" + entry.getKey().field, entry.getValue()); @@ -173,7 +173,7 @@ private static void injectMigration(Project project, Table generateNewFieldMigration(Project project, Path patchedJar, String patchedJarNamespace, Path mappingsPath) throws IOException { Map fieldDescriptorMap = new ConcurrentHashMap<>(); LoomGradleExtension extension = LoomGradleExtension.get(project); ThreadingUtils.TaskCompleter completer = ThreadingUtils.taskCompleter(); @@ -198,8 +198,7 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin } Visitor visitor = new Visitor(Opcodes.ASM9); - Path patchedSrgJar = MinecraftPatchedProvider.get(project).getMinecraftPatchedSrgJar(); - FileSystemUtil.Delegate system = FileSystemUtil.getJarFileSystem(patchedSrgJar, false); + FileSystemUtil.Delegate system = FileSystemUtil.getJarFileSystem(patchedJar, false); completer.onComplete(value -> system.close()); for (Path fsPath : (Iterable) Files.walk(system.get().getPath("/"))::iterator) { @@ -214,40 +213,29 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin completer.complete(); Map migratedFields = new HashMap<>(); - try (BufferedReader reader = Files.newBufferedReader(rawTinyMappingsWithSrg)) { + try (BufferedReader reader = Files.newBufferedReader(mappingsPath)) { MemoryMappingTree mappings = new MemoryMappingTree(); MappingReader.read(reader, mappings); - Map srgToIntermediary = new HashMap<>(); - - for (MappingTree.ClassMapping aClass : mappings.getClasses()) { - srgToIntermediary.put(aClass.getName("srg"), aClass.getName("intermediary")); - } for (MappingTree.ClassMapping classDef : mappings.getClasses()) { - String ownerSrg = classDef.getName("srg"); - String ownerIntermediary = classDef.getName("intermediary"); - for (MappingTree.FieldMapping fieldDef : classDef.getFields()) { - String fieldSrg = fieldDef.getName("srg"); - String descriptorSrg = fieldDef.getDesc("srg"); - - FieldMember member = new FieldMember(ownerSrg, fieldSrg); - String newDescriptor = fieldDescriptorMap.get(member); - - if (newDescriptor != null && !newDescriptor.equals(descriptorSrg)) { - String fieldIntermediary = fieldDef.getName("intermediary"); - String descriptorIntermediary = fieldDef.getDesc("intermediary"); - String newDescriptorRemapped = DescriptorRemapper.remapDescriptor(newDescriptor, - clazz -> srgToIntermediary.getOrDefault(clazz, clazz)); - migratedFields.put(new FieldMember(ownerIntermediary, fieldIntermediary), newDescriptorRemapped); - project.getLogger().info("Found migration of " + ownerIntermediary + "#" + fieldIntermediary + ": " + descriptorIntermediary + " -> " + newDescriptorRemapped); + String newDescriptor = fieldDescriptorMap.get(new FieldMember(classDef.getName(patchedJarNamespace), fieldDef.getName(patchedJarNamespace))); + String existingDescriptor = fieldDef.getDesc(patchedJarNamespace); + + if (newDescriptor != null && !newDescriptor.equals(existingDescriptor)) { + String ownerIntermediary = classDef.getName(MappingsNamespace.INTERMEDIARY.toString()); + String fieldIntermediary = fieldDef.getName(MappingsNamespace.INTERMEDIARY.toString()); + String descriptorIntermediary = fieldDef.getDesc(MappingsNamespace.INTERMEDIARY.toString()); + String newDescriptorIntermediary = mappings.mapDesc(newDescriptor, mappings.getNamespaceId(patchedJarNamespace), + mappings.getNamespaceId(MappingsNamespace.INTERMEDIARY.toString())); + migratedFields.put(new FieldMember(ownerIntermediary, fieldIntermediary), newDescriptorIntermediary); + project.getLogger().info("Found migration of " + ownerIntermediary + "#" + fieldIntermediary + ": " + descriptorIntermediary + " -> " + newDescriptorIntermediary); } } } } - this.migratedFields.clear(); - this.migratedFields.addAll(migratedFields.entrySet()); + return migratedFields; } public static class FieldMember {