aboutsummaryrefslogtreecommitdiff
path: root/src/forgeInject
diff options
context:
space:
mode:
authorJuuxel <6596629+Juuxel@users.noreply.github.com>2020-11-30 20:29:00 +0200
committerJuuxel <6596629+Juuxel@users.noreply.github.com>2020-11-30 20:29:00 +0200
commit385e0c9544fb4ce4dce73896def0f5a99f306bbb (patch)
tree551db91400076269cf4dee1a58f2248da88bf103 /src/forgeInject
parenta22a9b476c1711b07bf917086bf8a16607823a36 (diff)
downloadarchitectury-loom-385e0c9544fb4ce4dce73896def0f5a99f306bbb.tar.gz
architectury-loom-385e0c9544fb4ce4dce73896def0f5a99f306bbb.tar.bz2
architectury-loom-385e0c9544fb4ce4dce73896def0f5a99f306bbb.zip
Add yarn naming service that is injected to the game jar
If Forge can do it, so can I.
Diffstat (limited to 'src/forgeInject')
-rw-r--r--src/forgeInject/java/net/fabricmc/loom/inject/Pair.java52
-rw-r--r--src/forgeInject/java/net/fabricmc/loom/inject/YarnNamingService.java126
-rw-r--r--src/forgeInject/resources/META-INF/services/cpw.mods.modlauncher.api.INameMappingService1
3 files changed, 179 insertions, 0 deletions
diff --git a/src/forgeInject/java/net/fabricmc/loom/inject/Pair.java b/src/forgeInject/java/net/fabricmc/loom/inject/Pair.java
new file mode 100644
index 00000000..0206cb5d
--- /dev/null
+++ b/src/forgeInject/java/net/fabricmc/loom/inject/Pair.java
@@ -0,0 +1,52 @@
+/*
+ * 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.inject;
+
+import java.util.Map;
+
+final class Pair<A, B> implements Map.Entry<A, B> {
+ private final A first;
+ private final B second;
+
+ Pair(A first, B second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ @Override
+ public A getKey() {
+ return first;
+ }
+
+ @Override
+ public B getValue() {
+ return second;
+ }
+
+ @Override
+ public B setValue(B value) {
+ throw new UnsupportedOperationException("Pairs are immutable!");
+ }
+}
diff --git a/src/forgeInject/java/net/fabricmc/loom/inject/YarnNamingService.java b/src/forgeInject/java/net/fabricmc/loom/inject/YarnNamingService.java
new file mode 100644
index 00000000..c9de6ed4
--- /dev/null
+++ b/src/forgeInject/java/net/fabricmc/loom/inject/YarnNamingService.java
@@ -0,0 +1,126 @@
+/*
+ * 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.inject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
+
+import cpw.mods.modlauncher.api.INameMappingService;
+
+import net.fabricmc.mapping.tree.TinyMappingFactory;
+import net.fabricmc.mapping.tree.TinyTree;
+
+public class YarnNamingService implements INameMappingService {
+ private TinyTree mappings = null;
+
+ @Override
+ public String mappingName() {
+ return "srgtoyarn";
+ }
+
+ @Override
+ public String mappingVersion() {
+ return "1";
+ }
+
+ @Override
+ public Map.Entry<String, String> understanding() {
+ return new Pair<>("srg", "mcp");
+ }
+
+ @Override
+ public BiFunction<Domain, String, String> namingFunction() {
+ return this::remap;
+ }
+
+ private TinyTree getMappings() {
+ if (mappings != null) {
+ return mappings;
+ }
+
+ String pathStr = System.getProperty("loom.srgtoyarn.path");
+ if (pathStr == null) throw new RuntimeException("Missing system property 'loom.srgtoyarn.path'!");
+ Path path = Paths.get(pathStr);
+
+ try (BufferedReader reader = Files.newBufferedReader(path)) {
+ mappings = TinyMappingFactory.loadWithDetection(reader);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+
+ return mappings;
+ }
+
+ private String remap(Domain domain, String name) {
+ TinyTree mappings = getMappings();
+
+ switch (domain) {
+ case CLASS:
+ boolean dot = name.contains(".");
+ return find(mappings.getClasses(), def -> maybeReplace(dot, def.getName("srg"), '/', '.').equals(name))
+ .map(def -> maybeReplace(dot, def.getName("named"), '/', '.'))
+ .orElse(name);
+ case METHOD:
+ return mappings.getClasses().stream()
+ .flatMap(def -> def.getMethods().stream())
+ .filter(def -> def.getName("srg").equals(name))
+ .findAny()
+ .map(def -> def.getName("named"))
+ .orElse(name);
+ case FIELD:
+ return mappings.getClasses().stream()
+ .flatMap(def -> def.getFields().stream())
+ .filter(def -> def.getName("srg").equals(name))
+ .findAny()
+ .map(def -> def.getName("named"))
+ .orElse(name);
+ default:
+ return name;
+ }
+ }
+
+ // From CollectionUtil
+ private static <E> Optional<E> find(Iterable<? extends E> collection, Predicate<? super E> filter) {
+ for (E e : collection) {
+ if (filter.test(e)) {
+ return Optional.of(e);
+ }
+ }
+
+ return Optional.empty();
+ }
+
+ private static String maybeReplace(boolean run, String s, char from, char to) {
+ return run ? s.replace(from, to) : s;
+ }
+}
diff --git a/src/forgeInject/resources/META-INF/services/cpw.mods.modlauncher.api.INameMappingService b/src/forgeInject/resources/META-INF/services/cpw.mods.modlauncher.api.INameMappingService
new file mode 100644
index 00000000..45290566
--- /dev/null
+++ b/src/forgeInject/resources/META-INF/services/cpw.mods.modlauncher.api.INameMappingService
@@ -0,0 +1 @@
+net.fabricmc.loom.inject.YarnNamingService