diff --git a/build.gradle b/build.gradle index dc5dc0f1..2fa73d84 100644 --- a/build.gradle +++ b/build.gradle @@ -77,8 +77,8 @@ dependencies { } // tinyfile management - compileOnly ('net.fabricmc:tiny-remapper:0.3.2-architectury.6') - shadowArchitectury ('net.fabricmc:tiny-remapper:0.3.2-architectury.6') { + compileOnly ('net.fabricmc:tiny-remapper:0.3.2-architectury.7') + shadowArchitectury ('net.fabricmc:tiny-remapper:0.3.2-architectury.7') { transitive = false } implementation ('net.fabricmc:tiny-mappings-parser:0.3.0+build.17') diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 9569c34d..dd11e8e0 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -134,11 +134,12 @@ public class LoomGradleExtension { } public MappingSet getOrCreateSrcMappingCache(int id, Supplier factory) { + if (id < 0 || id >= srcMappingCache.length) return factory.get(); return srcMappingCache[id] != null ? srcMappingCache[id] : (srcMappingCache[id] = factory.get()); } public Mercury getOrCreateSrcMercuryCache(int id, Supplier factory) { - if (id == -1) return factory.get(); + if (id < 0 || id >= srcMercuryCache.length) return factory.get(); return srcMercuryCache[id] != null ? srcMercuryCache[id] : (srcMercuryCache[id] = factory.get()); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java index 7979e43c..5b2d2b2e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java @@ -115,6 +115,7 @@ public class MinecraftMappedProvider extends DependencyProvider { if (getExtension().isForge()) { minecraftSrgJar.delete(); } + getExtension().getMappingsProvider().cleanFiles(); throw new RuntimeException("Failed to remap minecraft", t); } diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 8e929163..25380740 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -79,7 +79,7 @@ import net.fabricmc.loom.build.nesting.NestedJarProvider; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.LoggerFilter; +import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.loom.util.gradle.GradleSupport; import net.fabricmc.loom.util.ZipReprocessorUtil; @@ -114,7 +114,7 @@ public class RemapJarTask extends Jar { fromM = getProject().getObjects().property(String.class); toM = getProject().getObjects().property(String.class); fromM.set("named"); - toM.set("intermediary"); + toM.set(SourceRemapper.intermediary(getProject())); // false by default, I have no idea why I have to do it for this property and not the other one remapAccessWidener.set(false); addDefaultNestedDependencies.set(true); @@ -136,6 +136,72 @@ public class RemapJarTask extends Jar { } } + private ReferenceRemapper createReferenceRemapper(LoomGradleExtension extension, String fromM, String toM) throws IOException { + TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); + + return new SimpleReferenceRemapper(new SimpleReferenceRemapper.Remapper() { + @Override + @Nullable + public String mapClass(String value) { + return mappings.getClasses().stream() + .filter(classDef -> Objects.equals(classDef.getName(fromM), value)) + .findFirst() + .map(classDef -> classDef.getName(toM)) + .orElse(null); + } + + @Override + @Nullable + public String mapMethod(@Nullable String className, String methodName, String methodDescriptor) { + if (className != null) { + Optional classDef = mappings.getClasses().stream() + .filter(c -> Objects.equals(c.getName(fromM), className)) + .findFirst(); + + if (classDef.isPresent()) { + for (MethodDef methodDef : classDef.get().getMethods()) { + if (Objects.equals(methodDef.getName(fromM), methodName) && Objects.equals(methodDef.getDescriptor(fromM), methodDescriptor)) { + return methodDef.getName(toM); + } + } + } + } + + return mappings.getClasses().stream() + .flatMap(classDef -> classDef.getMethods().stream()) + .filter(methodDef -> Objects.equals(methodDef.getName(fromM), methodName) && Objects.equals(methodDef.getDescriptor(fromM), methodDescriptor)) + .findFirst() + .map(methodDef -> methodDef.getName(toM)) + .orElse(null); + } + + @Override + @Nullable + public String mapField(@Nullable String className, String fieldName, String fieldDescriptor) { + if (className != null) { + Optional classDef = mappings.getClasses().stream() + .filter(c -> Objects.equals(c.getName(fromM), className)) + .findFirst(); + + if (classDef.isPresent()) { + for (FieldDef fieldDef : classDef.get().getFields()) { + if (Objects.equals(fieldDef.getName(fromM), fieldName) && Objects.equals(fieldDef.getDescriptor(fromM), fieldDescriptor)) { + return fieldDef.getName(toM); + } + } + } + } + + return mappings.getClasses().stream() + .flatMap(classDef -> classDef.getFields().stream()) + .filter(fieldDef -> Objects.equals(fieldDef.getName(fromM), fieldName) && Objects.equals(fieldDef.getDescriptor(fromM), fieldDescriptor)) + .findFirst() + .map(fieldDef -> fieldDef.getName(toM)) + .orElse(null); + } + }); + } + public void scheduleRemap(boolean isMainRemapTask) throws Throwable { Project project = getProject(); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); @@ -154,19 +220,21 @@ public class RemapJarTask extends Jar { if (isMainRemapTask) { jarRemapper.addToClasspath(getRemapClasspath()); - jarRemapper.addMappings(TinyRemapperMappingsHelper.create(extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false)); + jarRemapper.addMappings(TinyRemapperMappingsHelper.create(extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false)); } for (File mixinMapFile : extension.getAllMixinMappings()) { if (mixinMapFile.exists()) { IMappingProvider provider = TinyUtils.createTinyMappingProvider(mixinMapFile.toPath(), fromM, "intermediary"); - jarRemapper.addMappings(extension.isForge() ? remapToSrg(extension, provider) : provider); + jarRemapper.addMappings(!toM.equals("intermediary") ? remapToSrg(extension, provider, fromM, toM) : provider); } } // Add remap options to the jar remapper jarRemapper.addOptions(this.remapOptions); + project.getLogger().info(":scheduling remap " + input.getFileName() + " from " + fromM + " to " + toM); + NestedJarProvider nestedJarProvider = getNestedJarProvider(); nestedJarProvider.prepare(getProject()); @@ -237,42 +305,42 @@ public class RemapJarTask extends Jar { ); } - private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent) throws IOException { - TinyTree srg = extension.getMappingsProvider().getMappingsWithSrg(); + private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent, String fromM, String toM) throws IOException { + TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); return sink -> { parent.load(new IMappingProvider.MappingAcceptor() { @Override public void acceptClass(String srcName, String dstName) { - String srgName = srg.getClasses() + String srgName = mappings.getClasses() .stream() - .filter(it -> Objects.equals(it.getName("intermediary"), dstName)) + .filter(it -> Objects.equals(it.getName(fromM), dstName)) .findFirst() - .map(it -> it.getName("srg")) + .map(it -> it.getName(toM)) .orElse(dstName); sink.acceptClass(srcName, srgName); } @Override public void acceptMethod(IMappingProvider.Member method, String dstName) { - String srgName = srg.getClasses() + String srgName = mappings.getClasses() .stream() .flatMap(it -> it.getMethods().stream()) - .filter(it -> Objects.equals(it.getName("intermediary"), dstName)) + .filter(it -> Objects.equals(it.getName(fromM), dstName)) .findFirst() - .map(it -> it.getName("srg")) + .map(it -> it.getName(toM)) .orElse(dstName); sink.acceptMethod(method, srgName); } @Override public void acceptField(IMappingProvider.Member field, String dstName) { - String srgName = srg.getClasses() + String srgName = mappings.getClasses() .stream() .flatMap(it -> it.getFields().stream()) - .filter(it -> Objects.equals(it.getName("intermediary"), dstName)) + .filter(it -> Objects.equals(it.getName(fromM), dstName)) .findFirst() - .map(it -> it.getName("srg")) + .map(it -> it.getName(toM)) .orElse(dstName); sink.acceptField(field, srgName); } diff --git a/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java index 9548ad7f..4b7f6635 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java @@ -37,18 +37,25 @@ import net.fabricmc.loom.util.SourceRemapper; public class RemapSourcesJarTask extends AbstractLoomTask { private Object input; private Object output; - private String direction = "intermediary"; + private String from = "named"; + private String direction; private SourceRemapper sourceRemapper = null; private boolean preserveFileTimestamps = true; private boolean reproducibleFileOrder = false; public RemapSourcesJarTask() { + this.direction = SourceRemapper.intermediary(getProject()); } @TaskAction public void remap() throws Exception { if (sourceRemapper == null) { - SourceRemapper.remapSources(getProject(), getInput(), getOutput(), direction.equals("named"), reproducibleFileOrder, preserveFileTimestamps); + if (from.equals(direction)) { + SourceRemapper.remapSources(getProject(), getInput(), getOutput(), + direction.equals("named") ? SourceRemapper.intermediary(getProject()) : "named", direction, reproducibleFileOrder, preserveFileTimestamps); + } else { + SourceRemapper.remapSources(getProject(), getInput(), getOutput(), from, direction, reproducibleFileOrder, preserveFileTimestamps); + } } else { sourceRemapper.scheduleRemapSources(getInput(), getOutput(), reproducibleFileOrder, preserveFileTimestamps); } @@ -74,6 +81,11 @@ public class RemapSourcesJarTask extends AbstractLoomTask { return getProject().file(output == null ? input : output); } + @Input + public String getSourceNamespace() { + return from; + } + @Input public String getTargetNamespace() { return direction; @@ -87,6 +99,10 @@ public class RemapSourcesJarTask extends AbstractLoomTask { this.output = output; } + public void setSourceNamespace(String value) { + this.from = value; + } + public void setTargetNamespace(String value) { this.direction = value; } diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index dc6c7f58..f9573bf5 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -52,18 +52,29 @@ import net.fabricmc.stitch.util.StitchUtil; public class SourceRemapper { private final Project project; - private final boolean toNamed; + private String from; + private String to; private final List> remapTasks = new ArrayList<>(); private Mercury mercury; - public SourceRemapper(Project project, boolean toNamed) { - this.project = project; - this.toNamed = toNamed; + public SourceRemapper(Project project, boolean named) { + this(project, named ? intermediary(project) : "named", !named ? intermediary(project) : "named"); } - public static void remapSources(Project project, File input, File output, boolean named, boolean reproducibleFileOrder, boolean preserveFileTimestamps) { - SourceRemapper sourceRemapper = new SourceRemapper(project, named); + public static String intermediary(Project project) { + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + return extension.isForge() ? "srg" : "intermediary"; + } + + public SourceRemapper(Project project, String from, String to) { + this.project = project; + this.from = from; + this.to = to; + } + + public static void remapSources(Project project, File input, File output, String from, String to, boolean reproducibleFileOrder, boolean preserveFileTimestamps) { + SourceRemapper sourceRemapper = new SourceRemapper(project, from, to); sourceRemapper.scheduleRemapSources(input, output, reproducibleFileOrder, preserveFileTimestamps); sourceRemapper.remapAll(); } @@ -104,7 +115,7 @@ public class SourceRemapper { } private void remapSourcesInner(File source, File destination) throws Exception { - project.getLogger().info(":remapping source jar"); + project.getLogger().info(":remapping source jar " + source.getName() + " from " + from + " to " + to); Mercury mercury = getMercuryInstance(); if (source.equals(destination)) { @@ -165,19 +176,27 @@ public class SourceRemapper { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); MappingsProvider mappingsProvider = extension.getMappingsProvider(); - MappingSet mappings = extension.getOrCreateSrcMappingCache(toNamed ? 1 : 0, () -> { + String intermediary = extension.isForge() ? "srg" : "intermediary"; + int id = -1; + + if (from.equals(intermediary) && to.equals("named")) { + id = 1; + } else if (to.equals(intermediary) && from.equals("named")) { + id = 0; + } + + MappingSet mappings = extension.getOrCreateSrcMappingCache(id, () -> { try { - String intermediary = extension.isForge() ? "srg" : "intermediary"; - TinyTree m = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); - project.getLogger().info(":loading " + (toNamed ? intermediary + " -> named" : "named -> " + intermediary) + " source mappings"); - return new TinyMappingsReader(m, toNamed ? intermediary : "named", toNamed ? "named" : intermediary).read(); + TinyTree m = extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); + project.getLogger().info(":loading " + from + " -> " + to + " source mappings"); + return new TinyMappingsReader(m, from, to).read(); } catch (Exception e) { throw new RuntimeException(e); } }); - Mercury mercury = extension.getOrCreateSrcMercuryCache(toNamed ? 1 : 0, () -> { - Mercury m = createMercuryWithClassPath(project, toNamed); + Mercury mercury = extension.getOrCreateSrcMercuryCache(id, () -> { + Mercury m = createMercuryWithClassPath(project, to.equals("named")); for (File file : extension.getUnmappedModCollection()) { Path path = file.toPath(); diff --git a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java index d45fea9d..7639eb00 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java +++ b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java @@ -245,23 +245,24 @@ public class MCPReader { } } - try (CSVReader reader = new CSVReader(Files.newBufferedReader(params, StandardCharsets.UTF_8))) { - reader.readNext(); - String[] line; + if (Files.exists(params)) { + try (CSVReader reader = new CSVReader(Files.newBufferedReader(params, StandardCharsets.UTF_8))) { + reader.readNext(); + String[] line; - while ((line = reader.readNext()) != null) { - Matcher param = paramsPattern.matcher(line[0]); + while ((line = reader.readNext()) != null) { + Matcher param = paramsPattern.matcher(line[0]); - if (param.matches()) { - String named = line[1]; - String srgMethodStartWith = "func_" + param.group(1); - int lvIndex = Integer.parseInt(param.group(2)); - List intermediaryMethod = simpleSrgToIntermediary.get(srgMethodStartWith); + if (param.matches()) { + String named = line[1]; + String srgMethodStartWith = "func_" + param.group(1); + int lvIndex = Integer.parseInt(param.group(2)); + List intermediaryMethod = simpleSrgToIntermediary.get(srgMethodStartWith); - if (intermediaryMethod != null) { - for (String s : intermediaryMethod) { - intermediaryToParamsMap.computeIfAbsent(s, s1 -> new HashMap<>()) - .put(lvIndex, named); + if (intermediaryMethod != null) { + for (String s : intermediaryMethod) { + intermediaryToParamsMap.computeIfAbsent(s, s1 -> new HashMap<>()).put(lvIndex, named); + } } } }