From fe823ddb30d7b2505ad20f142b9660540cbc5b3a Mon Sep 17 00:00:00 2001 From: modmuss Date: Thu, 15 Jun 2023 20:14:52 +0100 Subject: [PATCH] Add an internal API to allow 3rd party loom extensions to add library processors. (#906) Stability of this API will not be guaranteed. --- .../java/net/fabricmc/loom/LoomGradleExtension.java | 6 ++++++ .../minecraft/MinecraftLibraryProvider.java | 2 +- .../minecraft/library/LibraryProcessorManager.java | 13 ++++++++----- .../loom/extension/LoomGradleExtensionImpl.java | 11 +++++++++++ .../unit/library/LibraryProcessorManagerTest.groovy | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 10ac4db9..b985bd82 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -30,6 +30,8 @@ import java.util.List; import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; +import org.gradle.api.provider.ListProperty; +import org.jetbrains.annotations.ApiStatus; import net.fabricmc.loom.api.LoomGradleExtensionAPI; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; @@ -38,12 +40,14 @@ import net.fabricmc.loom.configuration.LoomDependencyManager; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerFile; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryProcessorManager; import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; import net.fabricmc.loom.extension.LoomFiles; import net.fabricmc.loom.extension.MixinExtension; import net.fabricmc.loom.util.download.DownloadBuilder; +@ApiStatus.Internal public interface LoomGradleExtension extends LoomGradleExtensionAPI { static LoomGradleExtension get(Project project) { return (LoomGradleExtension) project.getExtensions().getByName("loom"); @@ -109,4 +113,6 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { *

You can enable it by setting the Gradle property {@code fabric.loom.multiProjectOptimisation} to {@code true}. */ boolean multiProjectOptimisation(); + + ListProperty getLibraryProcessors(); } 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 8c1dc700..62fa2bdd 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 @@ -56,7 +56,7 @@ public class MinecraftLibraryProvider { public MinecraftLibraryProvider(MinecraftProvider minecraftProvider, Project project) { this.project = project; this.minecraftProvider = minecraftProvider; - this.processorManager = new LibraryProcessorManager(platform, project.getRepositories(), getEnabledProcessors()); + this.processorManager = new LibraryProcessorManager(platform, project.getRepositories(), LoomGradleExtension.get(project).getLibraryProcessors().get(), getEnabledProcessors()); } private List getEnabledProcessors() { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryProcessorManager.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryProcessorManager.java index a6782af3..51f59c0f 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryProcessorManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryProcessorManager.java @@ -43,7 +43,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.library.processors.Ru import net.fabricmc.loom.util.Platform; public class LibraryProcessorManager { - private static final List> LIBRARY_PROCESSORS = List.of( + public static final List DEFAULT_LIBRARY_PROCESSORS = List.of( ArmNativesLibraryProcessor::new, LegacyASMLibraryProcessor::new, LoomNativeSupportLibraryProcessor::new, @@ -55,22 +55,25 @@ public class LibraryProcessorManager { private final Platform platform; private final RepositoryHandler repositories; + private final List libraryProcessorFactories; private final List enabledProcessors; - public LibraryProcessorManager(Platform platform, RepositoryHandler repositories, List enabledProcessors) { + public LibraryProcessorManager(Platform platform, RepositoryHandler repositories, List libraryProcessorFactories, List enabledProcessors) { this.platform = platform; this.repositories = repositories; + this.libraryProcessorFactories = libraryProcessorFactories; this.enabledProcessors = enabledProcessors; } + @VisibleForTesting public LibraryProcessorManager(Platform platform, RepositoryHandler repositories) { - this(platform, repositories, Collections.emptyList()); + this(platform, repositories, DEFAULT_LIBRARY_PROCESSORS, Collections.emptyList()); } private List getProcessors(LibraryContext context) { var processors = new ArrayList(); - for (LibraryProcessorFactory factory : LIBRARY_PROCESSORS) { + for (LibraryProcessorFactory factory : libraryProcessorFactories) { final LibraryProcessor processor = factory.apply(platform, context); final LibraryProcessor.ApplicationResult applicationResult = processor.getApplicationResult(); @@ -122,6 +125,6 @@ public class LibraryProcessorManager { return Collections.unmodifiableList(libraries); } - public interface LibraryProcessorFactory extends BiFunction { + public interface LibraryProcessorFactory extends BiFunction { } } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 706090d7..81c5c793 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -33,6 +33,7 @@ import java.util.Objects; import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; +import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Provider; import net.fabricmc.loom.LoomGradleExtension; @@ -44,6 +45,7 @@ import net.fabricmc.loom.configuration.accesswidener.AccessWidenerFile; import net.fabricmc.loom.configuration.providers.mappings.IntermediaryMappingsProvider; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryProcessorManager; import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; import net.fabricmc.loom.util.Constants; @@ -67,6 +69,7 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen private InstallerData installerData; private boolean refreshDeps; private Provider multiProjectOptimisation; + private final ListProperty libraryProcessorFactories; public LoomGradleExtensionImpl(Project project, LoomFiles files) { super(project, files); @@ -87,6 +90,9 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen refreshDeps = manualRefreshDeps(); multiProjectOptimisation = GradleUtils.getBooleanPropertyProvider(project, Constants.Properties.MULTI_PROJECT_OPTIMISATION); + libraryProcessorFactories = project.getObjects().listProperty(LibraryProcessorManager.LibraryProcessorFactory.class); + libraryProcessorFactories.addAll(LibraryProcessorManager.DEFAULT_LIBRARY_PROCESSORS); + libraryProcessorFactories.finalizeValueOnRead(); if (refreshDeps) { project.getLogger().lifecycle("Refresh dependencies is in use, loom will be significantly slower."); @@ -236,6 +242,11 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen return multiProjectOptimisation.getOrElse(false); } + @Override + public ListProperty getLibraryProcessors() { + return libraryProcessorFactories; + } + @Override protected void configureIntermediateMappingsProviderInternal(T provider) { provider.getMinecraftVersion().set(getProject().provider(() -> getMinecraftProvider().minecraftVersion())); diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryProcessorManagerTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryProcessorManagerTest.groovy index 62ac6ab1..9b5b4256 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryProcessorManagerTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryProcessorManagerTest.groovy @@ -82,7 +82,7 @@ class LibraryProcessorManagerTest extends LibraryProcessorTest { when: def platform = PlatformTestUtils.WINDOWS_X64 def (original, context) = getLibs("1.19.2", platform) - def processed = new LibraryProcessorManager(platform, GradleTestUtil.mockRepositoryHandler(), [ + def processed = new LibraryProcessorManager(platform, GradleTestUtil.mockRepositoryHandler(), LibraryProcessorManager.DEFAULT_LIBRARY_PROCESSORS, [ RuntimeLog4jLibraryProcessor.class.simpleName ]).processLibraries(original, context)