aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/util/srg
diff options
context:
space:
mode:
authorJuuxel <6596629+Juuxel@users.noreply.github.com>2020-11-30 18:56:21 +0200
committerJuuxel <6596629+Juuxel@users.noreply.github.com>2020-11-30 18:56:21 +0200
commit9b668547e0679d1190e7dc4d43b64f031a2f24ef (patch)
treed3fc23f653cf57bc470afc68cdf7ffb90a52e3e9 /src/main/java/net/fabricmc/loom/util/srg
parent5abdcea4ddb568a0f7773c1afeab1e16a97beddc (diff)
downloadarchitectury-loom-9b668547e0679d1190e7dc4d43b64f031a2f24ef.tar.gz
architectury-loom-9b668547e0679d1190e7dc4d43b64f031a2f24ef.tar.bz2
architectury-loom-9b668547e0679d1190e7dc4d43b64f031a2f24ef.zip
Add coremod and AT remappers
Diffstat (limited to 'src/main/java/net/fabricmc/loom/util/srg')
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java62
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java107
2 files changed, 169 insertions, 0 deletions
diff --git a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
new file mode 100644
index 00000000..b2ad9470
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
@@ -0,0 +1,62 @@
+/*
+ * 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.util.srg;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import com.google.common.collect.ImmutableMap;
+import org.cadixdev.at.AccessTransformSet;
+import org.cadixdev.at.io.AccessTransformFormats;
+import org.cadixdev.lorenz.MappingSet;
+
+import net.fabricmc.lorenztiny.TinyMappingsReader;
+import net.fabricmc.mapping.tree.TinyTree;
+
+/**
+ * Remaps AT classes from SRG to Yarn.
+ *
+ * @author Juuz
+ */
+public final class AtRemapper {
+ public static void remap(Path jar, TinyTree mappings) throws IOException {
+ try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + jar.toUri()), ImmutableMap.of("create", false))) {
+ Path atPath = fs.getPath("META-INF", "accesstransformer.cfg");
+
+ if (Files.exists(atPath)) {
+ AccessTransformSet atSet = AccessTransformFormats.FML.read(atPath);
+ MappingSet mappingSet = new TinyMappingsReader(mappings, "srg", "named").read();
+ AccessTransformSet remapped = atSet.remap(mappingSet);
+
+ Files.delete(atPath);
+ AccessTransformFormats.FML.write(atPath, remapped);
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java
new file mode 100644
index 00000000..edad8476
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java
@@ -0,0 +1,107 @@
+/*
+ * 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.util.srg;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import org.gradle.api.logging.Logger;
+
+import net.fabricmc.loom.util.function.CollectionUtil;
+import net.fabricmc.mapping.tree.TinyTree;
+
+/**
+ * Remaps coremod class names from SRG to Yarn.
+ *
+ * @author Juuz
+ */
+public final class CoreModClassRemapper {
+ private static final Pattern CLASS_NAME_PATTERN = Pattern.compile("^(.+')((?:com\\.mojang\\.|net\\.minecraft\\.)[A-Za-z0-9.-_$]+)('.+)$");
+
+ public static void remapJar(Path jar, TinyTree mappings, Logger logger) throws IOException {
+ try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + jar.toUri()), ImmutableMap.of("create", false))) {
+ Path coremodsJsonPath = fs.getPath("META-INF", "coremods.json");
+ if (Files.notExists(coremodsJsonPath)) return;
+
+ JsonObject coremodsJson;
+
+ try (Reader reader = Files.newBufferedReader(coremodsJsonPath)) {
+ coremodsJson = new Gson().fromJson(reader, JsonObject.class);
+ }
+
+ for (Map.Entry<String, JsonElement> nameFileEntry : coremodsJson.entrySet()) {
+ String file = nameFileEntry.getValue().getAsString();
+ Path js = fs.getPath(file);
+
+ if (Files.exists(js)) {
+ logger.info(":remapping coremod '" + file + "'");
+ remap(js, mappings);
+ } else {
+ logger.warn("Coremod '" + file + "' listed in coremods.json but not found");
+ }
+ }
+ }
+ }
+
+ public static void remap(Path js, TinyTree mappings) throws IOException {
+ List<String> lines = Files.readAllLines(js);
+ List<String> output = new ArrayList<>(lines);
+
+ for (int i = 0; i < lines.size(); i++) {
+ String line = lines.get(i);
+ Matcher matcher = CLASS_NAME_PATTERN.matcher(line);
+
+ if (matcher.matches()) {
+ String className = matcher.group(2);
+ String remapped = CollectionUtil.find(mappings.getClasses(), def -> def.getName("srg").equals(className))
+ .map(def -> def.getName("named"))
+ .orElse(className);
+
+ if (!className.equals(remapped)) {
+ output.set(i, matcher.group(1) + remapped + matcher.group(3));
+ }
+ }
+ }
+
+ if (!lines.equals(output)) {
+ Files.delete(js);
+ Files.write(js, output);
+ }
+ }
+}