From 64c21c01b8210297b4ef04919ca0fc251a69033a Mon Sep 17 00:00:00 2001 From: asie Date: Fri, 10 May 2019 13:32:11 +0200 Subject: [PATCH] add updateMappings task --- .../net/fabricmc/loom/LoomGradlePlugin.java | 4 + .../loom/task/AbstractDecompileTask.java | 2 +- ...ultLoomTask.java => AbstractLoomTask.java} | 4 +- ...{RunTaskBase.java => AbstractRunTask.java} | 4 +- .../fabricmc/loom/task/CleanLoomBinaries.java | 2 +- .../fabricmc/loom/task/CleanLoomMappings.java | 2 +- .../loom/task/DownloadAssetsTask.java | 2 +- .../loom/task/GenEclipseRunsTask.java | 2 +- .../loom/task/GenIdeaProjectTask.java | 2 +- .../loom/task/GenVsCodeProjectTask.java | 2 +- .../java/net/fabricmc/loom/task/RemapJar.java | 2 +- .../loom/task/RemapLineNumbersTask.java | 5 +- .../fabricmc/loom/task/RemapSourcesJar.java | 2 +- .../net/fabricmc/loom/task/RunClientTask.java | 12 +- .../net/fabricmc/loom/task/RunServerTask.java | 9 +- .../loom/task/UpdateMappingsTask.java | 145 ++++++++++++++++++ 16 files changed, 165 insertions(+), 36 deletions(-) rename src/main/java/net/fabricmc/loom/task/{DefaultLoomTask.java => AbstractLoomTask.java} (93%) rename src/main/java/net/fabricmc/loom/task/{RunTaskBase.java => AbstractRunTask.java} (97%) create mode 100644 src/main/java/net/fabricmc/loom/task/UpdateMappingsTask.java diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index 030154e..0690ebf 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -64,6 +64,10 @@ public class LoomGradlePlugin extends AbstractPlugin { tasks.register("cleanLoomBinaries", CleanLoomBinaries.class); tasks.register("cleanLoomMappings", CleanLoomMappings.class); + tasks.register("updateMappings", UpdateMappingsTask.class, t -> { + t.getOutputs().upToDateWhen((o) -> false); + }); + tasks.register("remapJar", RemapJar.class); tasks.register("genSourcesDecompile", FernFlowerTask.class, t -> { diff --git a/src/main/java/net/fabricmc/loom/task/AbstractDecompileTask.java b/src/main/java/net/fabricmc/loom/task/AbstractDecompileTask.java index b2f98b9..db26ad5 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractDecompileTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractDecompileTask.java @@ -30,7 +30,7 @@ import org.gradle.api.tasks.OutputFile; import java.io.File; -public abstract class AbstractDecompileTask extends DefaultLoomTask { +public abstract class AbstractDecompileTask extends AbstractLoomTask { private Object input; private Object output; private Object lineMapFile; diff --git a/src/main/java/net/fabricmc/loom/task/DefaultLoomTask.java b/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java similarity index 93% rename from src/main/java/net/fabricmc/loom/task/DefaultLoomTask.java rename to src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java index bdf42b2..cd39ecf 100644 --- a/src/main/java/net/fabricmc/loom/task/DefaultLoomTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java @@ -26,9 +26,9 @@ package net.fabricmc.loom.task; import org.gradle.api.DefaultTask; -public abstract class DefaultLoomTask extends DefaultTask { +public abstract class AbstractLoomTask extends DefaultTask { - public DefaultLoomTask() { + public AbstractLoomTask() { setGroup("fabric"); } diff --git a/src/main/java/net/fabricmc/loom/task/RunTaskBase.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java similarity index 97% rename from src/main/java/net/fabricmc/loom/task/RunTaskBase.java rename to src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index c88026b..93964f2 100644 --- a/src/main/java/net/fabricmc/loom/task/RunTaskBase.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -39,11 +39,11 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; -public abstract class RunTaskBase extends JavaExec { +public abstract class AbstractRunTask extends JavaExec { private final Function configProvider; private RunConfig config; - public RunTaskBase(Function config) { + public AbstractRunTask(Function config) { super(); setGroup("fabric"); this.configProvider = config; diff --git a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java b/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java index 3b1a3c2..a885aad 100644 --- a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java +++ b/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java @@ -28,7 +28,7 @@ import net.fabricmc.loom.LoomGradleExtension; import org.gradle.api.Project; import org.gradle.api.tasks.TaskAction; -public class CleanLoomBinaries extends DefaultLoomTask { +public class CleanLoomBinaries extends AbstractLoomTask { @TaskAction public void run() { Project project = this.getProject(); diff --git a/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java b/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java index bdafc3c..60569ae 100644 --- a/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java +++ b/src/main/java/net/fabricmc/loom/task/CleanLoomMappings.java @@ -32,7 +32,7 @@ import org.gradle.api.tasks.TaskAction; import java.io.IOException; import java.nio.file.Files; -public class CleanLoomMappings extends DefaultLoomTask { +public class CleanLoomMappings extends AbstractLoomTask { @TaskAction public void run() { Project project = this.getProject(); diff --git a/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java b/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java index 91a71a0..3fce992 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadAssetsTask.java @@ -31,7 +31,7 @@ import org.gradle.api.tasks.TaskAction; import java.io.IOException; -public class DownloadAssetsTask extends DefaultLoomTask { +public class DownloadAssetsTask extends AbstractLoomTask { @TaskAction public void downloadAssets() throws IOException { Project project = this.getProject(); diff --git a/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java b/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java index 7c57561..3d2065b 100644 --- a/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenEclipseRunsTask.java @@ -33,7 +33,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -public class GenEclipseRunsTask extends DefaultLoomTask { +public class GenEclipseRunsTask extends AbstractLoomTask { @TaskAction public void genRuns() throws IOException { diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index 96c3d5b..34a1bf5 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -46,7 +46,7 @@ import javax.xml.transform.stream.StreamResult; import java.io.File; import java.io.IOException; -public class GenIdeaProjectTask extends DefaultLoomTask { +public class GenIdeaProjectTask extends AbstractLoomTask { @TaskAction public void genIdeaRuns() throws IOException, ParserConfigurationException, SAXException, TransformerException { diff --git a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java index 8d9cd4d..aa64562 100644 --- a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java @@ -41,7 +41,7 @@ import java.util.List; // https://marketplace.visualstudio.com/items?itemName=redhat.java // https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug // https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack -public class GenVsCodeProjectTask extends DefaultLoomTask { +public class GenVsCodeProjectTask extends AbstractLoomTask { @TaskAction public void genRuns() { diff --git a/src/main/java/net/fabricmc/loom/task/RemapJar.java b/src/main/java/net/fabricmc/loom/task/RemapJar.java index 6c94ffa..b56221c 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJar.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJar.java @@ -33,7 +33,7 @@ import org.gradle.api.tasks.TaskAction; import java.io.File; import java.io.IOException; -public class RemapJar extends DefaultLoomTask { +public class RemapJar extends AbstractLoomTask { public File jar; public File destination; public boolean nestJar = true; diff --git a/src/main/java/net/fabricmc/loom/task/RemapLineNumbersTask.java b/src/main/java/net/fabricmc/loom/task/RemapLineNumbersTask.java index c695c1d..7d8ea91 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapLineNumbersTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapLineNumbersTask.java @@ -29,7 +29,6 @@ import net.fabricmc.loom.util.LineNumberRemapper; import net.fabricmc.loom.util.progress.ProgressLogger; import net.fabricmc.stitch.util.StitchUtil; import org.gradle.api.Project; -import org.gradle.api.file.FileCollection; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; @@ -37,10 +36,8 @@ import org.gradle.api.tasks.TaskAction; import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -public class RemapLineNumbersTask extends DefaultLoomTask { +public class RemapLineNumbersTask extends AbstractLoomTask { private Object input; private Object output; private Object lineMapFile; diff --git a/src/main/java/net/fabricmc/loom/task/RemapSourcesJar.java b/src/main/java/net/fabricmc/loom/task/RemapSourcesJar.java index 8bc74d1..f71eec5 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapSourcesJar.java +++ b/src/main/java/net/fabricmc/loom/task/RemapSourcesJar.java @@ -31,7 +31,7 @@ import org.gradle.api.tasks.TaskAction; import java.io.File; -public class RemapSourcesJar extends DefaultLoomTask { +public class RemapSourcesJar extends AbstractLoomTask { public File jar; public File destinationJar; public String direction = "intermediary"; diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 19f25a0..0200b1e 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -24,19 +24,9 @@ package net.fabricmc.loom.task; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.MinecraftVersionInfo; -import net.fabricmc.loom.util.OperatingSystem; import net.fabricmc.loom.util.RunConfig; -import org.gradle.api.tasks.JavaExec; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class RunClientTask extends RunTaskBase { +public class RunClientTask extends AbstractRunTask { public RunClientTask() { super(RunConfig::clientRunConfig); } diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index 40eb45e..d1d3d95 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -24,16 +24,9 @@ package net.fabricmc.loom.task; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.RunConfig; -import org.gradle.api.tasks.JavaExec; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class RunServerTask extends RunTaskBase { +public class RunServerTask extends AbstractRunTask { public RunServerTask() { super(RunConfig::serverRunConfig); } diff --git a/src/main/java/net/fabricmc/loom/task/UpdateMappingsTask.java b/src/main/java/net/fabricmc/loom/task/UpdateMappingsTask.java new file mode 100644 index 0000000..b52309a --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/UpdateMappingsTask.java @@ -0,0 +1,145 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.task; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.mappings.*; +import org.cadixdev.lorenz.MappingSet; +import org.cadixdev.lorenz.io.MappingsReader; +import org.cadixdev.mercury.Mercury; +import org.cadixdev.mercury.remapper.MercuryRemapper; +import org.gradle.api.Project; +import org.gradle.api.tasks.TaskAction; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class UpdateMappingsTask extends AbstractLoomTask { + @TaskAction + public void doTask() throws Throwable { + Project project = getProject(); + LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); + + project.getLogger().lifecycle(":loading mappings"); + + File mappingsFile = new File((String) project.getProperties().get("targetMappingsFile")); + File inputDir = new File((String) project.getProperties().get("inputDir")); + File outputDir = new File((String) project.getProperties().get("outputDir")); + + Mappings sourceMappings = extension.getMappingsProvider().getMappings(); + Mappings targetMappings; + + try (FileInputStream stream = new FileInputStream(mappingsFile)) { + targetMappings = net.fabricmc.mappings.MappingsProvider.readTinyMappings(stream, false); + } + + project.getLogger().lifecycle(":joining mappings"); + MappingSet mappingSet = new MappingsJoiner(sourceMappings, targetMappings, "intermediary", "named").read(); + + project.getLogger().lifecycle(":remapping"); + Mercury mercury = new Mercury(); + + for (File file : project.getConfigurations().getByName(Constants.MINECRAFT_DEPENDENCIES).getFiles()) { + mercury.getClassPath().add(file.toPath()); + } + + for (File file : project.getConfigurations().getByName(Constants.COMPILE_MODS_MAPPED).getFiles()) { + mercury.getClassPath().add(file.toPath()); + } + + mercury.getClassPath().add(extension.getMinecraftMappedProvider().MINECRAFT_MAPPED_JAR.toPath()); + mercury.getClassPath().add(extension.getMinecraftMappedProvider().MINECRAFT_INTERMEDIARY_JAR.toPath()); + + mercury.getProcessors().add(MercuryRemapper.create(mappingSet)); + + try { + mercury.rewrite(inputDir.toPath(), outputDir.toPath()); + } catch (Exception e) { + project.getLogger().warn("Could not remap fully!", e); + } + + project.getLogger().lifecycle(":cleaning file descriptors"); + System.gc(); + } + + public static class MappingsJoiner extends MappingsReader { + private final Mappings sourceMappings, targetMappings; + private final String fromNamespace, toNamespace; + + public MappingsJoiner(Mappings sourceMappings, Mappings targetMappings, String fromNamespace, String toNamespace) { + this.sourceMappings = sourceMappings; + this.targetMappings = targetMappings; + this.fromNamespace = fromNamespace; + this.toNamespace = toNamespace; + } + + @Override + public MappingSet read(MappingSet mappings) throws IOException { + Map targetClasses = new HashMap<>(); + Map targetFields = new HashMap<>(); + Map targetMethods = new HashMap<>(); + + targetMappings.getClassEntries().forEach((c) -> targetClasses.put(c.get(fromNamespace), c)); + targetMappings.getFieldEntries().forEach((c) -> targetFields.put(c.get(fromNamespace), c)); + targetMappings.getMethodEntries().forEach((c) -> targetMethods.put(c.get(fromNamespace), c)); + + for (ClassEntry entry : sourceMappings.getClassEntries()) { + String from = entry.get(toNamespace); + String to = targetClasses.getOrDefault(entry.get(fromNamespace), entry).get(toNamespace); + + mappings.getOrCreateClassMapping(from).setDeobfuscatedName(to); + } + + for (FieldEntry entry : sourceMappings.getFieldEntries()) { + EntryTriple fromEntry = entry.get(toNamespace); + EntryTriple toEntry = targetFields.getOrDefault(entry.get(fromNamespace), entry).get(toNamespace); + + mappings.getOrCreateClassMapping(fromEntry.getOwner()) + .getOrCreateFieldMapping(fromEntry.getName(), fromEntry.getDesc()) + .setDeobfuscatedName(toEntry.getName()); + } + + for (MethodEntry entry : sourceMappings.getMethodEntries()) { + EntryTriple fromEntry = entry.get(toNamespace); + EntryTriple toEntry = targetMethods.getOrDefault(entry.get(fromNamespace), entry).get(toNamespace); + + mappings.getOrCreateClassMapping(fromEntry.getOwner()) + .getOrCreateMethodMapping(fromEntry.getName(), fromEntry.getDesc()) + .setDeobfuscatedName(toEntry.getName()); + } + + return mappings; + } + + @Override + public void close() throws IOException { + + } + } +}