diff --git a/src/main/java/dev/architectury/loom/metadata/ArchitecturyCommonJson.java b/src/main/java/dev/architectury/loom/metadata/ArchitecturyCommonJson.java index 3d98efc2..6a7c5f7c 100644 --- a/src/main/java/dev/architectury/loom/metadata/ArchitecturyCommonJson.java +++ b/src/main/java/dev/architectury/loom/metadata/ArchitecturyCommonJson.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Set; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -59,11 +60,11 @@ public final class ArchitecturyCommonJson implements JsonBackedModMetadataFile { } @Override - public @Nullable String getAccessWidener() { + public Set getAccessWideners() { if (json.has(ACCESS_WIDENER_KEY)) { - 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/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 2b774e13..039bf843 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -285,6 +285,7 @@ public final class CompileConfiguration { if (extension.isForge() && !(minecraftProvider instanceof ForgeMinecraftProvider)) { throw new UnsupportedOperationException("Using Forge with split jars is not supported!"); } + extension.setMinecraftProvider(minecraftProvider); minecraftProvider.provideFirst(); diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java index ecbd0bb1..522c43b7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java @@ -30,6 +30,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Arrays; import java.util.Objects; +import java.util.Set; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -37,6 +38,7 @@ import dev.architectury.loom.metadata.ModMetadataFile; import dev.architectury.loom.metadata.ModMetadataFiles; import net.fabricmc.loom.util.ZipUtils; +import net.fabricmc.loom.util.function.CollectionUtil; public record AccessWidenerFile( String path, @@ -63,7 +65,13 @@ public record AccessWidenerFile( modMetadata = ModMetadataFiles.fromJar(modJarPath); if (modMetadata != null) { - awPath = modMetadata.getAccessWidener(); + final Set accessWideners = modMetadata.getAccessWideners(); + + if (accessWideners.size() > 1) { + throw new UnsupportedOperationException("Cannot read multiple access wideners from " + modJarPath); + } + + awPath = CollectionUtil.single(modMetadata.getAccessWideners()).orElse(null); if (awPath == null) return null; } else { // No known mod metadata diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java b/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java index d98d14b5..17bf8184 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java @@ -34,14 +34,12 @@ import java.util.jar.Attributes; import java.util.jar.Manifest; import com.google.gson.JsonObject; - -import net.fabricmc.loom.util.ModPlatform; - import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.configuration.InstallerData; import net.fabricmc.loom.util.FileSystemUtil; +import net.fabricmc.loom.util.ModPlatform; import net.fabricmc.loom.util.fmj.FabricModJsonFactory; // ARCH: isFabricMod means "is mod on current platform" diff --git a/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java b/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java index fbceded2..9569968a 100644 --- a/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java +++ b/src/main/java/net/fabricmc/loom/task/PrepareJarRemapTask.java @@ -28,7 +28,6 @@ import java.nio.file.Path; import javax.inject.Inject; -import dev.architectury.tinyremapper.TinyRemapper; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.InputFile; diff --git a/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java b/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java index 01146893..89a8b67a 100644 --- a/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java +++ b/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java @@ -28,12 +28,11 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.util.Objects; -import net.fabricmc.loom.configuration.providers.mappings.TinyMappingsService; - import org.cadixdev.lorenz.MappingSet; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; +import net.fabricmc.loom.configuration.providers.mappings.TinyMappingsService; import net.fabricmc.loom.util.service.SharedService; import net.fabricmc.loom.util.service.SharedServiceManager; import net.fabricmc.lorenztiny.TinyMappingsReader; diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 1e3e14bb..22e811f0 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -52,7 +52,6 @@ import net.fabricmc.loom.api.RemapConfigurationSettings; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.build.IntermediaryNamespaces; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; -import net.fabricmc.loom.configuration.providers.mappings.TinyMappingsService; import net.fabricmc.loom.task.service.LorenzMappingService; import net.fabricmc.loom.util.service.SharedServiceManager; 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 5db8e834..0e1c1661 100644 --- a/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java +++ b/src/main/java/net/fabricmc/loom/util/function/CollectionUtil.java @@ -26,6 +26,7 @@ package net.fabricmc.loom.util.function; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -118,4 +119,29 @@ public final class CollectionUtil { result.removeIf(filter.negate()); return result; } + + /** + * Gets the single element of an iterable. + * + * @param iterable the iterable + * @param the element type + * @return the single element, or empty if there are no elements or multiple elements + */ + public static Optional single(Iterable iterable) { + final Iterator iter = iterable.iterator(); + + // No elements + if (!iter.hasNext()) { + return Optional.empty(); + } + + A single = iter.next(); + + // Too many elements + if (iter.hasNext()) { + return Optional.empty(); + } + + return Optional.of(single); + } }