From fa18e5736ce44c648138738b47afdc0c0ed6e4d4 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 1 Jan 2025 13:13:00 +0000 Subject: [PATCH] Even more cleanup --- .../fabricapi/FabricApiAbstractSourceSet.java | 110 ++++++++++++++++++ .../fabricapi/FabricApiDataGeneration.java | 52 ++------- 2 files changed, 119 insertions(+), 43 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiAbstractSourceSet.java diff --git a/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiAbstractSourceSet.java b/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiAbstractSourceSet.java new file mode 100644 index 000000000..6ffdce0c9 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiAbstractSourceSet.java @@ -0,0 +1,110 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2025 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.configuration.fabricapi; + +import java.io.IOException; + +import javax.inject.Inject; + +import org.gradle.api.Project; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; +import net.fabricmc.loom.util.fmj.FabricModJson; +import net.fabricmc.loom.util.fmj.FabricModJsonFactory; +import net.fabricmc.loom.util.gradle.SourceSetHelper; + +abstract class FabricApiAbstractSourceSet { + @Inject + protected abstract Project getProject(); + + protected abstract String getSourceSetName(); + + protected void configureSourceSet(Property modId, boolean isClient) { + final LoomGradleExtension extension = LoomGradleExtension.get(getProject()); + final SourceSet mainSourceSet = SourceSetHelper.getMainSourceSet(getProject()); + + final boolean isClientAndSplit = extension.areEnvironmentSourceSetsSplit() && isClient; + + SourceSetContainer sourceSets = SourceSetHelper.getSourceSets(getProject()); + + // Create the new datagen sourceset, depend on the main or client sourceset. + SourceSet dataGenSourceSet = sourceSets.create(getSourceSetName(), sourceSet -> { + dependsOn(sourceSet, mainSourceSet); + + if (isClientAndSplit) { + dependsOn(sourceSet, SourceSetHelper.getSourceSetByName(MinecraftSourceSets.Split.CLIENT_ONLY_SOURCE_SET_NAME, getProject())); + } + }); + + modId.convention(getProject().provider(() -> { + try { + final FabricModJson fabricModJson = FabricModJsonFactory.createFromSourceSetsNullable(getProject(), dataGenSourceSet); + + if (fabricModJson == null) { + throw new RuntimeException("Could not find a fabric.mod.json file in the data source set or a value for DataGenerationSettings.getModId()"); + } + + return fabricModJson.getId(); + } catch (IOException e) { + throw new org.gradle.api.UncheckedIOException("Failed to read mod id from the datagen source set.", e); + } + })); + + extension.getMods().create(modId.get(), mod -> { + // Create a classpath group for this mod. Assume that the main sourceset is already in a group. + mod.sourceSet(getSourceSetName()); + }); + + extension.createRemapConfigurations(sourceSets.getByName(getSourceSetName())); + } + + private static void extendsFrom(Project project, String name, String extendsFrom) { + final ConfigurationContainer configurations = project.getConfigurations(); + + configurations.named(name, configuration -> { + configuration.extendsFrom(configurations.getByName(extendsFrom)); + }); + } + + private void dependsOn(SourceSet sourceSet, SourceSet other) { + sourceSet.setCompileClasspath( + sourceSet.getCompileClasspath() + .plus(other.getOutput()) + ); + + sourceSet.setRuntimeClasspath( + sourceSet.getRuntimeClasspath() + .plus(other.getOutput()) + ); + + extendsFrom(getProject(), sourceSet.getCompileClasspathConfigurationName(), other.getCompileClasspathConfigurationName()); + extendsFrom(getProject(), sourceSet.getRuntimeClasspathConfigurationName(), other.getRuntimeClasspathConfigurationName()); + } +} diff --git a/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiDataGeneration.java b/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiDataGeneration.java index 7e2bb618e..836df8569 100644 --- a/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiDataGeneration.java +++ b/src/main/java/net/fabricmc/loom/configuration/fabricapi/FabricApiDataGeneration.java @@ -25,7 +25,6 @@ package net.fabricmc.loom.configuration.fabricapi; import java.io.File; -import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -36,25 +35,24 @@ import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskContainer; import org.gradle.jvm.tasks.Jar; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.fabricapi.DataGenerationSettings; -import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; -import net.fabricmc.loom.util.fmj.FabricModJson; -import net.fabricmc.loom.util.fmj.FabricModJsonFactory; import net.fabricmc.loom.util.gradle.SourceSetHelper; -abstract class FabricApiDataGeneration { - private static final String DATAGEN_SOURCESET_NAME = "datagen"; - +public abstract class FabricApiDataGeneration extends FabricApiAbstractSourceSet { @Inject protected abstract Project getProject(); @Inject - FabricApiDataGeneration() { + public FabricApiDataGeneration() { + } + + @Override + protected String getSourceSetName() { + return "datagen"; } void configureDataGeneration(Action action) { @@ -90,39 +88,7 @@ void configureDataGeneration(Action action) { }); if (settings.getCreateSourceSet().get()) { - final boolean isClientAndSplit = extension.areEnvironmentSourceSetsSplit() && settings.getClient().get(); - - SourceSetContainer sourceSets = SourceSetHelper.getSourceSets(getProject()); - - // Create the new datagen sourceset, depend on the main or client sourceset. - SourceSet dataGenSourceSet = sourceSets.create(DATAGEN_SOURCESET_NAME, sourceSet -> { - dependsOn(sourceSet, mainSourceSet); - - if (isClientAndSplit) { - dependsOn(sourceSet, SourceSetHelper.getSourceSetByName(MinecraftSourceSets.Split.CLIENT_ONLY_SOURCE_SET_NAME, getProject())); - } - }); - - settings.getModId().convention(getProject().provider(() -> { - try { - final FabricModJson fabricModJson = FabricModJsonFactory.createFromSourceSetsNullable(getProject(), dataGenSourceSet); - - if (fabricModJson == null) { - throw new RuntimeException("Could not find a fabric.mod.json file in the data source set or a value for DataGenerationSettings.getModId()"); - } - - return fabricModJson.getId(); - } catch (IOException e) { - throw new org.gradle.api.UncheckedIOException("Failed to read mod id from the datagen source set.", e); - } - })); - - extension.getMods().create(settings.getModId().get(), mod -> { - // Create a classpath group for this mod. Assume that the main sourceset is already in a group. - mod.sourceSet(DATAGEN_SOURCESET_NAME); - }); - - extension.createRemapConfigurations(sourceSets.getByName(DATAGEN_SOURCESET_NAME)); + configureSourceSet(settings.getModId(), settings.getClient().get()); } if (settings.getCreateRunConfiguration().get()) { @@ -143,7 +109,7 @@ void configureDataGeneration(Action action) { } if (settings.getCreateSourceSet().get()) { - run.source(DATAGEN_SOURCESET_NAME); + run.source(getSourceSetName()); } });