From 08f9ebe32efe9f28122f4402936342712e14c68f Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Thu, 16 Feb 2023 21:16:18 +0200 Subject: [PATCH] Add support for multiple access wideners in Quilt mods --- .../loom/metadata/ModMetadataFile.java | 5 +++-- .../loom/metadata/QuiltModJson.java | 17 +++++++---------- .../util/fmj/ModMetadataFabricModJson.java | 7 +++++-- .../loom/util/function/CollectionUtil.java | 19 ++++++++++++++++--- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/architectury/loom/metadata/ModMetadataFile.java b/src/main/java/dev/architectury/loom/metadata/ModMetadataFile.java index 344202d2..c98fd290 100644 --- a/src/main/java/dev/architectury/loom/metadata/ModMetadataFile.java +++ b/src/main/java/dev/architectury/loom/metadata/ModMetadataFile.java @@ -1,6 +1,7 @@ package dev.architectury.loom.metadata; import java.util.List; +import java.util.Set; import org.jetbrains.annotations.Nullable; @@ -14,9 +15,9 @@ public interface ModMetadataFile { @Nullable String getId(); /** - * {@return the path to the access widener file of this mod, or {@code null} if absent}. + * {@return the paths to the access widener file of this mod, or an empty set if absent}. */ - @Nullable String getAccessWidener(); + Set getAccessWideners(); /** * {@return the injected interface data in this mod metadata file}. diff --git a/src/main/java/dev/architectury/loom/metadata/QuiltModJson.java b/src/main/java/dev/architectury/loom/metadata/QuiltModJson.java index 0881a27c..935229d8 100644 --- a/src/main/java/dev/architectury/loom/metadata/QuiltModJson.java +++ b/src/main/java/dev/architectury/loom/metadata/QuiltModJson.java @@ -6,8 +6,10 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -18,6 +20,7 @@ import org.slf4j.LoggerFactory; import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.configuration.ifaceinject.InterfaceInjectionProcessor; +import net.fabricmc.loom.util.function.CollectionUtil; public final class QuiltModJson implements JsonBackedModMetadataFile { public static final String FILE_NAME = "quilt.mod.json"; @@ -68,22 +71,16 @@ public final class QuiltModJson implements JsonBackedModMetadataFile { } @Override - public @Nullable String getAccessWidener() { + public Set getAccessWideners() { if (json.has(ACCESS_WIDENER_KEY)) { if (json.get(ACCESS_WIDENER_KEY).isJsonArray()) { JsonArray array = json.get(ACCESS_WIDENER_KEY).getAsJsonArray(); - - // TODO (1.1): Support multiple access wideners in Quilt mods - if (array.size() != 1) { - throw new UnsupportedOperationException("Loom does not support multiple access wideners in one mod!"); - } - - return array.get(0).getAsString(); + return CollectionUtil.mapTo(array, new LinkedHashSet<>(), JsonElement::getAsString); } else { - return json.get(ACCESS_WIDENER_KEY).getAsString(); + return Set.of(json.get(ACCESS_WIDENER_KEY).getAsString()); } } else { - return null; + return Set.of(); } } diff --git a/src/main/java/net/fabricmc/loom/util/fmj/ModMetadataFabricModJson.java b/src/main/java/net/fabricmc/loom/util/fmj/ModMetadataFabricModJson.java index 0d915762..99f6e2a2 100644 --- a/src/main/java/net/fabricmc/loom/util/fmj/ModMetadataFabricModJson.java +++ b/src/main/java/net/fabricmc/loom/util/fmj/ModMetadataFabricModJson.java @@ -27,6 +27,8 @@ package net.fabricmc.loom.util.fmj; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -77,7 +79,8 @@ public final class ModMetadataFabricModJson extends FabricModJson { @Override public Map getClassTweakers() { - @Nullable String accessWidener = modMetadata.getAccessWidener(); - return accessWidener != null ? Map.of(accessWidener, ModEnvironment.UNIVERSAL) : Map.of(); + return modMetadata.getAccessWideners() + .stream() + .collect(Collectors.toMap(Function.identity(), path -> ModEnvironment.UNIVERSAL)); } } diff --git a/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java b/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java index f3461fb8..5db8e834 100644 --- a/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java +++ b/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java @@ -83,13 +83,26 @@ public final class CollectionUtil { * @return a mutable list with the transformed entries */ public static List map(Iterable collection, Function transform) { - ArrayList result = new ArrayList<>(); + return mapTo(collection, new ArrayList<>(), transform); + } + /** + * Transforms the collection with a function, storing the results in a target collection. + * + * @param collection the source collection + * @param target the target collection + * @param transform the transformation function + * @param the source type + * @param the target type + * @param the target collection type + * @return the target collection + */ + public static > C mapTo(Iterable collection, C target, Function transform) { for (A a : collection) { - result.add(transform.apply(a)); + target.add(transform.apply(a)); } - return result; + return target; } /**