diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index 255c5da5..3dc9325f 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -204,7 +204,7 @@ public interface LoomGradleExtensionAPI { */ Property getIntermediaryUrl(); - Property getMinecraftJarConfiguration(); + Property> getMinecraftJarConfiguration(); default void serverOnlyMinecraftJar() { getMinecraftJarConfiguration().set(MinecraftJarConfiguration.SERVER_ONLY); diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index db6e8847..94ba3ea4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -63,7 +63,6 @@ import net.fabricmc.loom.configuration.processors.MinecraftJarProcessorManager; import net.fabricmc.loom.configuration.processors.ModJavadocProcessor; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsFactory; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; -import net.fabricmc.loom.configuration.providers.minecraft.MinecraftJarConfiguration; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; import net.fabricmc.loom.configuration.providers.minecraft.mapped.AbstractMappedMinecraftProvider; @@ -152,10 +151,10 @@ public abstract class CompileConfiguration implements Runnable { private synchronized void setupMinecraft(ConfigContext configContext) throws Exception { final Project project = configContext.project(); final LoomGradleExtension extension = configContext.extension(); - final MinecraftJarConfiguration jarConfiguration = extension.getMinecraftJarConfiguration().get(); + final var jarConfiguration = extension.getMinecraftJarConfiguration().get(); // Provide the vanilla mc jars -- TODO share across getProject()s. - final MinecraftProvider minecraftProvider = jarConfiguration.getMinecraftProviderFunction().apply(configContext); + final MinecraftProvider minecraftProvider = jarConfiguration.createMinecraftProvider(configContext); extension.setMinecraftProvider(minecraftProvider); minecraftProvider.provide(); @@ -168,15 +167,15 @@ public abstract class CompileConfiguration implements Runnable { mappingConfiguration.applyToProject(getProject(), mappingsDep); // Provide the remapped mc jars - final IntermediaryMinecraftProvider intermediaryMinecraftProvider = jarConfiguration.getIntermediaryMinecraftProviderBiFunction().apply(project, minecraftProvider); - NamedMinecraftProvider namedMinecraftProvider = jarConfiguration.getNamedMinecraftProviderBiFunction().apply(project, minecraftProvider); + final IntermediaryMinecraftProvider intermediaryMinecraftProvider = jarConfiguration.createIntermediaryMinecraftProvider(project); + NamedMinecraftProvider namedMinecraftProvider = jarConfiguration.createNamedMinecraftProvider(project); registerGameProcessors(configContext); MinecraftJarProcessorManager minecraftJarProcessorManager = MinecraftJarProcessorManager.create(getProject()); if (minecraftJarProcessorManager != null) { // Wrap the named MC provider for one that will provide the processed jars - namedMinecraftProvider = jarConfiguration.getProcessedNamedMinecraftProviderBiFunction().apply(namedMinecraftProvider, minecraftJarProcessorManager); + namedMinecraftProvider = jarConfiguration.createProcessedNamedMinecraftProvider(namedMinecraftProvider, minecraftJarProcessorManager); } final var provideContext = new AbstractMappedMinecraftProvider.ProvideContext(true, extension.refreshDeps(), configContext); @@ -237,8 +236,7 @@ public abstract class CompileConfiguration implements Runnable { final LoomGradleExtension extension = configContext.extension(); extension.getMinecraftJarConfiguration().get() - .getDecompileConfigurationBiFunction() - .apply(configContext.project(), extension.getNamedMinecraftProvider()) + .createDecompileConfiguration(getProject()) .afterEvaluation(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/idea/DownloadSourcesHook.java b/src/main/java/net/fabricmc/loom/configuration/ide/idea/DownloadSourcesHook.java index 98244e3a..d799b45d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/idea/DownloadSourcesHook.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/idea/DownloadSourcesHook.java @@ -116,8 +116,7 @@ record DownloadSourcesHook(Project project, Task task) { private String getGenSourcesTaskName(MinecraftJar.Type jarType) { LoomGradleExtension extension = LoomGradleExtension.get(project); return extension.getMinecraftJarConfiguration().get() - .getDecompileConfigurationBiFunction() - .apply(project, extension.getNamedMinecraftProvider()) + .createDecompileConfiguration(project) .getTaskName(jarType); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java index 34e8f42e..0efb21c2 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java @@ -25,11 +25,10 @@ package net.fabricmc.loom.configuration.providers.minecraft; import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Function; import org.gradle.api.Project; +import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.configuration.ConfigContext; import net.fabricmc.loom.configuration.decompile.DecompileConfiguration; import net.fabricmc.loom.configuration.decompile.SingleJarDecompileConfiguration; @@ -40,85 +39,111 @@ import net.fabricmc.loom.configuration.providers.minecraft.mapped.MappedMinecraf import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.ProcessedNamedMinecraftProvider; -public enum MinecraftJarConfiguration { - MERGED( - MergedMinecraftProvider::new, - IntermediaryMinecraftProvider.MergedImpl::new, - NamedMinecraftProvider.MergedImpl::new, - ProcessedNamedMinecraftProvider.MergedImpl::new, - SingleJarDecompileConfiguration::new, - List.of("client", "server") - ), - SERVER_ONLY( - SingleJarMinecraftProvider::server, - IntermediaryMinecraftProvider.SingleJarImpl::server, - NamedMinecraftProvider.SingleJarImpl::server, - ProcessedNamedMinecraftProvider.SingleJarImpl::server, - SingleJarDecompileConfiguration::new, - List.of("server") - ), - CLIENT_ONLY( - SingleJarMinecraftProvider::client, - IntermediaryMinecraftProvider.SingleJarImpl::client, - NamedMinecraftProvider.SingleJarImpl::client, - ProcessedNamedMinecraftProvider.SingleJarImpl::client, - SingleJarDecompileConfiguration::new, - List.of("client") - ), - SPLIT( - SplitMinecraftProvider::new, - IntermediaryMinecraftProvider.SplitImpl::new, - NamedMinecraftProvider.SplitImpl::new, - ProcessedNamedMinecraftProvider.SplitImpl::new, - SplitDecompileConfiguration::new, - List.of("client", "server") - ); +public record MinecraftJarConfiguration< + M extends MinecraftProvider, + N extends NamedMinecraftProvider, + Q extends MappedMinecraftProvider>( + MinecraftProviderFactory minecraftProviderFactory, + IntermediaryMinecraftProviderFactory intermediaryMinecraftProviderFactory, + NamedMinecraftProviderFactory namedMinecraftProviderFactory, + ProcessedNamedMinecraftProviderFactory processedNamedMinecraftProviderFactory, + DecompileConfigurationFactory decompileConfigurationFactory, + List supportedEnvironments) { + public static final MinecraftJarConfiguration< + MergedMinecraftProvider, + NamedMinecraftProvider.MergedImpl, + MappedMinecraftProvider> MERGED = new MinecraftJarConfiguration<>( + MergedMinecraftProvider::new, + IntermediaryMinecraftProvider.MergedImpl::new, + NamedMinecraftProvider.MergedImpl::new, + ProcessedNamedMinecraftProvider.MergedImpl::new, + SingleJarDecompileConfiguration::new, + List.of("client", "server") + ); + public static final MinecraftJarConfiguration< + SingleJarMinecraftProvider, + NamedMinecraftProvider.SingleJarImpl, + MappedMinecraftProvider> SERVER_ONLY = new MinecraftJarConfiguration<>( + SingleJarMinecraftProvider::server, + IntermediaryMinecraftProvider.SingleJarImpl::server, + NamedMinecraftProvider.SingleJarImpl::server, + ProcessedNamedMinecraftProvider.SingleJarImpl::server, + SingleJarDecompileConfiguration::new, + List.of("server") + ); + public static final MinecraftJarConfiguration< + SingleJarMinecraftProvider, + NamedMinecraftProvider.SingleJarImpl, + MappedMinecraftProvider> CLIENT_ONLY = new MinecraftJarConfiguration<>( + SingleJarMinecraftProvider::client, + IntermediaryMinecraftProvider.SingleJarImpl::client, + NamedMinecraftProvider.SingleJarImpl::client, + ProcessedNamedMinecraftProvider.SingleJarImpl::client, + SingleJarDecompileConfiguration::new, + List.of("client") + ); + public static final MinecraftJarConfiguration< + SplitMinecraftProvider, + NamedMinecraftProvider.SplitImpl, + MappedMinecraftProvider.Split> SPLIT = new MinecraftJarConfiguration<>( + SplitMinecraftProvider::new, + IntermediaryMinecraftProvider.SplitImpl::new, + NamedMinecraftProvider.SplitImpl::new, + ProcessedNamedMinecraftProvider.SplitImpl::new, + SplitDecompileConfiguration::new, + List.of("client", "server") + ); - private final Function minecraftProviderFunction; - private final BiFunction> intermediaryMinecraftProviderBiFunction; - private final BiFunction> namedMinecraftProviderBiFunction; - private final BiFunction, MinecraftJarProcessorManager, ProcessedNamedMinecraftProvider> processedNamedMinecraftProviderBiFunction; - private final BiFunction> decompileConfigurationBiFunction; - private final List supportedEnvironments; - - @SuppressWarnings("unchecked") // Just a bit of a generic mess :) - , Q extends MappedMinecraftProvider> MinecraftJarConfiguration( - Function minecraftProviderFunction, - BiFunction> intermediaryMinecraftProviderBiFunction, - BiFunction namedMinecraftProviderBiFunction, - BiFunction> processedNamedMinecraftProviderBiFunction, - BiFunction> decompileConfigurationBiFunction, - List supportedEnvironments - ) { - this.minecraftProviderFunction = (Function) minecraftProviderFunction; - this.intermediaryMinecraftProviderBiFunction = (BiFunction>) (Object) intermediaryMinecraftProviderBiFunction; - this.namedMinecraftProviderBiFunction = (BiFunction>) namedMinecraftProviderBiFunction; - this.processedNamedMinecraftProviderBiFunction = (BiFunction, MinecraftJarProcessorManager, ProcessedNamedMinecraftProvider>) (Object) processedNamedMinecraftProviderBiFunction; - this.decompileConfigurationBiFunction = (BiFunction>) decompileConfigurationBiFunction; - this.supportedEnvironments = supportedEnvironments; + public MinecraftProvider createMinecraftProvider(ConfigContext context) { + return minecraftProviderFactory.create(context); } - public Function getMinecraftProviderFunction() { - return minecraftProviderFunction; + public IntermediaryMinecraftProvider createIntermediaryMinecraftProvider(Project project) { + return intermediaryMinecraftProviderFactory.create(project, getMinecraftProvider(project)); } - public BiFunction> getIntermediaryMinecraftProviderBiFunction() { - return intermediaryMinecraftProviderBiFunction; + public NamedMinecraftProvider createNamedMinecraftProvider(Project project) { + return namedMinecraftProviderFactory.create(project, getMinecraftProvider(project)); } - public BiFunction> getNamedMinecraftProviderBiFunction() { - return namedMinecraftProviderBiFunction; + public ProcessedNamedMinecraftProvider createProcessedNamedMinecraftProvider(NamedMinecraftProvider namedMinecraftProvider, MinecraftJarProcessorManager jarProcessorManager) { + return processedNamedMinecraftProviderFactory.create((N) namedMinecraftProvider, jarProcessorManager); } - public BiFunction, MinecraftJarProcessorManager, ProcessedNamedMinecraftProvider> getProcessedNamedMinecraftProviderBiFunction() { - return processedNamedMinecraftProviderBiFunction; + public DecompileConfiguration createDecompileConfiguration(Project project) { + return decompileConfigurationFactory.create(project, getMappedMinecraftProvider(project)); } - public BiFunction> getDecompileConfigurationBiFunction() { - return decompileConfigurationBiFunction; + private M getMinecraftProvider(Project project) { + LoomGradleExtension extension = LoomGradleExtension.get(project); + //noinspection unchecked + return (M) extension.getMinecraftProvider(); } - public List getSupportedEnvironments() { - return supportedEnvironments; + private Q getMappedMinecraftProvider(Project project) { + LoomGradleExtension extension = LoomGradleExtension.get(project); + //noinspection unchecked + return (Q) extension.getNamedMinecraftProvider(); + } + + // Factory interfaces: + private interface MinecraftProviderFactory { + M create(ConfigContext configContext); + } + + private interface IntermediaryMinecraftProviderFactory { + IntermediaryMinecraftProvider create(Project project, M minecraftProvider); + } + + private interface NamedMinecraftProviderFactory { + NamedMinecraftProvider create(Project project, M minecraftProvider); + } + + private interface ProcessedNamedMinecraftProviderFactory> { + ProcessedNamedMinecraftProvider create(N namedMinecraftProvider, MinecraftJarProcessorManager jarProcessorManager); + } + + private interface DecompileConfigurationFactory { + DecompileConfiguration create(Project project, M minecraftProvider); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index 62fa2bdd..896a2bd5 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -82,8 +82,8 @@ public class MinecraftLibraryProvider { final LoomGradleExtension extension = LoomGradleExtension.get(project); final MinecraftJarConfiguration jarConfiguration = extension.getMinecraftJarConfiguration().get(); - final boolean provideClient = jarConfiguration.getSupportedEnvironments().contains("client"); - final boolean provideServer = jarConfiguration.getSupportedEnvironments().contains("server"); + final boolean provideClient = jarConfiguration.supportedEnvironments().contains("client"); + final boolean provideServer = jarConfiguration.supportedEnvironments().contains("server"); assert provideClient || provideServer; if (provideClient) { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java index 50e4cdd9..0b57b23d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java @@ -34,29 +34,26 @@ import net.fabricmc.tinyremapper.NonClassCopyMode; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; -public final class SingleJarMinecraftProvider extends MinecraftProvider { - private final Environment environment; - +public abstract sealed class SingleJarMinecraftProvider extends MinecraftProvider permits SingleJarMinecraftProvider.Server, SingleJarMinecraftProvider.Client { private Path minecraftEnvOnlyJar; - private SingleJarMinecraftProvider(ConfigContext configContext, Environment environment) { + private SingleJarMinecraftProvider(ConfigContext configContext) { super(configContext); - this.environment = environment; } - public static SingleJarMinecraftProvider server(ConfigContext configContext) { - return new SingleJarMinecraftProvider(configContext, new Server()); + public static SingleJarMinecraftProvider.Server server(ConfigContext configContext) { + return new SingleJarMinecraftProvider.Server(configContext); } - public static SingleJarMinecraftProvider client(ConfigContext configContext) { - return new SingleJarMinecraftProvider(configContext, new Client()); + public static SingleJarMinecraftProvider.Client client(ConfigContext configContext) { + return new SingleJarMinecraftProvider.Client(configContext); } @Override protected void initFiles() { super.initFiles(); - minecraftEnvOnlyJar = path("minecraft-%s-only.jar".formatted(environment.type())); + minecraftEnvOnlyJar = path("minecraft-%s-only.jar".formatted(type())); } @Override @@ -79,7 +76,7 @@ public final class SingleJarMinecraftProvider extends MinecraftProvider { return; } - final Path inputJar = environment.getInputJar(this); + final Path inputJar = getInputJar(this); TinyRemapper remapper = null; @@ -96,7 +93,7 @@ public final class SingleJarMinecraftProvider extends MinecraftProvider { } } catch (Exception e) { Files.deleteIfExists(minecraftEnvOnlyJar); - throw new RuntimeException("Failed to process %s only jar".formatted(environment.type()), e); + throw new RuntimeException("Failed to process %s only jar".formatted(type()), e); } finally { if (remapper != null) { remapper.finish(); @@ -104,27 +101,19 @@ public final class SingleJarMinecraftProvider extends MinecraftProvider { } } - @Override - protected boolean provideClient() { - return environment instanceof Client; - } - - @Override - protected boolean provideServer() { - return environment instanceof Server; - } - public Path getMinecraftEnvOnlyJar() { return minecraftEnvOnlyJar; } - private interface Environment { - SingleJarEnvType type(); + abstract SingleJarEnvType type(); - Path getInputJar(SingleJarMinecraftProvider provider) throws Exception; - } + abstract Path getInputJar(SingleJarMinecraftProvider provider) throws Exception; + + public static final class Server extends SingleJarMinecraftProvider { + private Server(ConfigContext configContext) { + super(configContext); + } - private static final class Server implements Environment { @Override public SingleJarEnvType type() { return SingleJarEnvType.SERVER; @@ -141,9 +130,23 @@ public final class SingleJarMinecraftProvider extends MinecraftProvider { provider.extractBundledServerJar(); return provider.getMinecraftExtractedServerJar().toPath(); } + + @Override + protected boolean provideServer() { + return true; + } + + @Override + protected boolean provideClient() { + return false; + } } - private static final class Client implements Environment { + public static final class Client extends SingleJarMinecraftProvider { + private Client(ConfigContext configContext) { + super(configContext); + } + @Override public SingleJarEnvType type() { return SingleJarEnvType.CLIENT; @@ -153,5 +156,15 @@ public final class SingleJarMinecraftProvider extends MinecraftProvider { public Path getInputJar(SingleJarMinecraftProvider provider) throws Exception { return provider.getMinecraftClientJar().toPath(); } + + @Override + protected boolean provideServer() { + return false; + } + + @Override + protected boolean provideClient() { + return true; + } } } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index e81a0560..49bc25b4 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -91,7 +91,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected final Property intermediateMappingsProvider; private final Property runtimeOnlyLog4j; private final Property splitModDependencies; - private final Property minecraftJarConfiguration; + private final Property> minecraftJarConfiguration; private final Property splitEnvironmentalSourceSet; private final InterfaceInjectionExtensionAPI interfaceInjectionExtension; @@ -144,7 +144,8 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.minecraftJarProcessors = (ListProperty>) (Object) project.getObjects().listProperty(MinecraftJarProcessor.class); this.minecraftJarProcessors.finalizeValueOnRead(); - this.minecraftJarConfiguration = project.getObjects().property(MinecraftJarConfiguration.class).convention(MinecraftJarConfiguration.MERGED); + //noinspection unchecked + this.minecraftJarConfiguration = project.getObjects().property((Class>) (Class) MinecraftJarConfiguration.class).convention(MinecraftJarConfiguration.MERGED); this.minecraftJarConfiguration.finalizeValueOnRead(); this.accessWidener.finalizeValueOnRead(); @@ -341,7 +342,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA } @Override - public Property getMinecraftJarConfiguration() { + public Property> getMinecraftJarConfiguration() { return minecraftJarConfiguration; } diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index e32cfa5d..794f26ac 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -164,13 +164,18 @@ public abstract class LoomTasks implements Runnable { // Remove the client or server run config when not required. Done by name to not remove any possible custom run configs GradleUtils.afterSuccessfulEvaluation(getProject(), () -> { - String taskName = switch (extension.getMinecraftJarConfiguration().get()) { - case SERVER_ONLY -> "client"; - case CLIENT_ONLY -> "server"; - default -> null; - }; + String taskName; - if (taskName == null) { + boolean serverOnly = extension.getMinecraftJarConfiguration().get() == MinecraftJarConfiguration.SERVER_ONLY; + boolean clientOnly = extension.getMinecraftJarConfiguration().get() == MinecraftJarConfiguration.CLIENT_ONLY; + + if (serverOnly) { + // Server only, remove the client run config + taskName = "client"; + } else if (clientOnly) { + // Client only, remove the server run config + taskName = "server"; + } else { return; }