From bfcd0aa8c13f3bdd3ce86e2def39016c8629e3f5 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 8 Mar 2021 00:59:47 +0800 Subject: [PATCH] Use refmap-remapper to remap refmap to prevent double remapping --- build.gradle | 13 +- .../mixin/AnnotationProcessorInvoker.java | 2 +- .../net/fabricmc/loom/task/RemapJarTask.java | 112 ++++++++++++++++-- 3 files changed, 111 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index bdd88b75..5067c927 100644 --- a/build.gradle +++ b/build.gradle @@ -84,6 +84,10 @@ dependencies { transitive = false } implementation ('org.cadixdev:lorenz-io-proguard:0.5.6') + compileOnly "me.shedaniel.architectury:refmap-remapper:1.0.4" + shadowArchitectury ("me.shedaniel.architectury:refmap-remapper:1.0.4") { + transitive = false + } // decompilers implementation ('net.fabricmc:fabric-fernflower:1.3.0') @@ -129,15 +133,12 @@ task forgeInjectJar(type: ShadowJar, dependsOn: [compileForgeInjectJava, proces } jar { - manifest { - attributes 'Implementation-Version': project.version + ' Build(' + buildNum + ')' - } - classifier 'jar' } shadowJar { relocate "net.fabricmc.tinyremapper", "me.shedaniel.architectury.loom.shadowed.impl.net.fabricmc.tinyremapper" + relocate "me.shedaniel.architectury.refmapremapper", "me.shedaniel.architectury.loom.shadowed.impl.me.shedaniel.architectury.refmapremapper" configurations = [project.configurations.shadowArchitectury] classifier "shadow" } @@ -150,6 +151,10 @@ task mainJar(type: Jar, dependsOn: shadowJar) { into "inject" rename { "injection.jar" } } + + manifest { + attributes 'Implementation-Version': project.version + ' Build(' + buildNum + ')' + } } task sourcesJar(type: Jar, dependsOn: classes) { diff --git a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java index 02714ab2..6a0a2f65 100644 --- a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java @@ -71,7 +71,7 @@ public abstract class AnnotationProcessorInvoker { private void passMixinArguments(T task) { try { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - File inMapFile = extension.isForge() ? extension.getMappingsProvider().mixinTinyMappingsWithSrg : extension.getMappingsProvider().tinyMappings; + File inMapFile = extension.getMappingsProvider().tinyMappings; Map args = new HashMap() {{ put(Constants.MixinArguments.IN_MAP_FILE_NAMED_INTERMEDIARY, inMapFile.getCanonicalPath()); put(Constants.MixinArguments.OUT_MAP_FILE_NAMED_INTERMEDIARY, extension.getNextMixinMappings().getCanonicalPath()); diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 0d06f9b9..cd7e8297 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -34,14 +34,23 @@ import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import me.shedaniel.architectury.refmapremapper.RefmapRemapper; +import me.shedaniel.architectury.refmapremapper.remapper.MappingsRemapper; +import me.shedaniel.architectury.refmapremapper.remapper.ReferenceRemapper; +import me.shedaniel.architectury.refmapremapper.remapper.Remapper; +import me.shedaniel.architectury.refmapremapper.remapper.SimpleReferenceRemapper; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.file.FileCollection; @@ -51,6 +60,7 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; import org.gradle.jvm.tasks.Jar; +import org.jetbrains.annotations.Nullable; import org.zeroturnaround.zip.ZipUtil; import net.fabricmc.loom.LoomGradleExtension; @@ -63,6 +73,10 @@ import net.fabricmc.loom.util.LoggerFilter; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.loom.util.ZipReprocessorUtil; import net.fabricmc.loom.util.gradle.GradleSupport; +import net.fabricmc.mapping.tree.ClassDef; +import net.fabricmc.mapping.tree.FieldDef; +import net.fabricmc.mapping.tree.MethodDef; +import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.stitch.util.Pair; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; @@ -175,19 +189,29 @@ public class RemapJarTask extends Jar { if (Files.exists(refmapPath)) { try (Reader refmapReader = Files.newBufferedReader(refmapPath, StandardCharsets.UTF_8)) { - JsonObject refmapElement = new JsonParser().parse(refmapReader).getAsJsonObject().deepCopy(); - Files.delete(refmapPath); + Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); + JsonObject refmapElement = gson.fromJson(refmapReader, JsonObject.class); + refmapElement = RefmapRemapper.remap(new Remapper() { + ReferenceRemapper remapper = createReferenceRemapper(extension); - if (refmapElement.has("data")) { - JsonObject data = refmapElement.get("data").getAsJsonObject(); - - if (data.has("named:intermediary")) { - data.add("searge", data.get("named:intermediary").deepCopy()); - data.remove("named:intermediary"); + @Override + @Nullable + public MappingsRemapper remapMappings() { + return className -> remapper; } - } - Files.write(refmapPath, new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create().toJson(refmapElement).getBytes(StandardCharsets.UTF_8)); + @Override + @Nullable + public Map.Entry remapMappingsData(String data) { + if (Objects.equals(data, "named:intermediary")) { + return new AbstractMap.SimpleEntry<>("searge", remapMappings()); + } + + return null; + } + }, refmapElement); + Files.delete(refmapPath); + Files.write(refmapPath, gson.toJson(refmapElement).getBytes(StandardCharsets.UTF_8)); } } } @@ -204,6 +228,72 @@ public class RemapJarTask extends Jar { } } + private ReferenceRemapper createReferenceRemapper(LoomGradleExtension extension) throws IOException { + TinyTree srg = extension.getMappingsProvider().getMappingsWithSrg(); + + return new SimpleReferenceRemapper(new SimpleReferenceRemapper.Remapper() { + @Override + @Nullable + public String mapClass(String value) { + return srg.getClasses().stream() + .filter(classDef -> Objects.equals(classDef.getName("intermediary"), value)) + .findFirst() + .map(classDef -> classDef.getName("srg")) + .orElse(null); + } + + @Override + @Nullable + public String mapMethod(@Nullable String className, String methodName, String methodDescriptor) { + if (className != null) { + Optional classDef = srg.getClasses().stream() + .filter(c -> Objects.equals(c.getName("intermediary"), className)) + .findFirst(); + + if (classDef.isPresent()) { + for (MethodDef methodDef : classDef.get().getMethods()) { + if (Objects.equals(methodDef.getName("intermediary"), methodName) && Objects.equals(methodDef.getDescriptor("intermediary"), methodDescriptor)) { + return methodDef.getName("srg"); + } + } + } + } + + return srg.getClasses().stream() + .flatMap(classDef -> classDef.getMethods().stream()) + .filter(methodDef -> Objects.equals(methodDef.getName("intermediary"), methodName) && Objects.equals(methodDef.getDescriptor("intermediary"), methodDescriptor)) + .findFirst() + .map(methodDef -> methodDef.getName("srg")) + .orElse(null); + } + + @Override + @Nullable + public String mapField(@Nullable String className, String fieldName, String fieldDescriptor) { + if (className != null) { + Optional classDef = srg.getClasses().stream() + .filter(c -> Objects.equals(c.getName("intermediary"), className)) + .findFirst(); + + if (classDef.isPresent()) { + for (FieldDef fieldDef : classDef.get().getFields()) { + if (Objects.equals(fieldDef.getName("intermediary"), fieldName) && Objects.equals(fieldDef.getDescriptor("intermediary"), fieldDescriptor)) { + return fieldDef.getName("srg"); + } + } + } + } + + return srg.getClasses().stream() + .flatMap(classDef -> classDef.getFields().stream()) + .filter(fieldDef -> Objects.equals(fieldDef.getName("intermediary"), fieldName) && Objects.equals(fieldDef.getDescriptor("intermediary"), fieldDescriptor)) + .findFirst() + .map(fieldDef -> fieldDef.getName("srg")) + .orElse(null); + } + }); + } + public void scheduleRemap() throws Throwable { Project project = getProject(); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);