diff options
author | Juuxel <6596629+Juuxel@users.noreply.github.com> | 2021-09-20 19:10:50 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-21 00:10:50 +0800 |
commit | 979a9d488285ff25573e62a38a1054603f281a7c (patch) | |
tree | a844d2dbc7eb1831188ad2974d19e2e6b6c5d246 /src/main/java/net/fabricmc | |
parent | 6522a826e1adba9a55070df3d4ae38ecfcfce565 (diff) | |
download | architectury-loom-979a9d488285ff25573e62a38a1054603f281a7c.tar.gz architectury-loom-979a9d488285ff25573e62a38a1054603f281a7c.tar.bz2 architectury-loom-979a9d488285ff25573e62a38a1054603f281a7c.zip |
Move all Forge-only properties to Forge extension (#46)
Diffstat (limited to 'src/main/java/net/fabricmc')
15 files changed, 355 insertions, 281 deletions
diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index d94aeffa..c2d41460 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -128,16 +128,20 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { return getDependencyManager().getProvider(McpConfigProvider.class); } - @Override + default boolean isDataGenEnabled() { + return isForge() && !getForge().getDataGenMods().isEmpty(); + } + default boolean isForgeAndOfficial() { return isForge() && getMcpConfigProvider().isOfficial(); } - @Override default boolean isForgeAndNotOfficial() { return isForge() && !getMcpConfigProvider().isOfficial(); } + boolean supportsInclude(); + default SrgProvider getSrgProvider() { return getDependencyManager().getProvider(SrgProvider.class); } diff --git a/src/main/java/net/fabricmc/loom/api/ForgeExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/ForgeExtensionAPI.java index 7cfc639c..a2dbd80b 100644 --- a/src/main/java/net/fabricmc/loom/api/ForgeExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/ForgeExtensionAPI.java @@ -24,13 +24,19 @@ package net.fabricmc.loom.api; +import java.util.List; + +import org.gradle.api.Action; +import org.gradle.api.NamedDomainObjectContainer; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.provider.Property; import org.gradle.api.provider.SetProperty; +import org.jetbrains.annotations.ApiStatus; /** * This is the forge extension api available exposed to build scripts. */ -// TODO: Move other forge-related configuration here +@ApiStatus.NonExtendable public interface ForgeExtensionAPI { /** * If true, {@linkplain LoomGradleExtensionAPI#getAccessWidenerPath() the project access widener file} @@ -48,4 +54,89 @@ public interface ForgeExtensionAPI { * @return the property */ SetProperty<String> getExtraAccessWideners(); + + /** + * A collection of all project access transformers. + * The collection should only contain AT files, and not directories or other files. + * + * <p>If this collection is empty, Loom tries to resolve the AT from the default path + * ({@code META-INF/accesstransformer.cfg} in the {@code main} source set). + * + * @return the collection of AT files + */ + ConfigurableFileCollection getAccessTransformers(); + + /** + * Adds a {@linkplain #getAccessTransformers() project access transformer}. + * + * @param file the file, evaluated as per {@link org.gradle.api.Project#file(Object)} + */ + void accessTransformer(Object file); + + /** + * A set of all mixin configs related to source set resource roots. + * All mixin configs must be added to this property so that they apply in a dev environment. + * + * @return the property + */ + SetProperty<String> getMixinConfigs(); + + /** + * Adds mixin config files to {@link #getMixinConfigs() mixinConfigs}. + * + * @param mixinConfigs the mixin config file paths relative to resource roots + */ + void mixinConfigs(String... mixinConfigs); + + /** + * If true, upstream Mixin from Sponge will be replaced with Fabric's fork. + * This is enabled by default. + * + * @return the property + */ + Property<Boolean> getUseFabricMixin(); + + /** + * A list of mod IDs for mods applied for data generation. + * The returned list is unmodifiable but not immutable - it will reflect changes done with + * {@link #dataGen(Action)}. + * + * @return the list + */ + List<String> getDataGenMods(); + + /** + * Applies data generation settings. + * + * @param action the action to configure data generation + */ + void dataGen(Action<DataGenConsumer> action); + + /** + * Data generation config. + */ + @ApiStatus.NonExtendable + interface DataGenConsumer { + /** + * Adds mod IDs applied for data generation. + * + * @param modIds the mod IDs + */ + void mod(String... modIds); + } + + /** + * Configures local mods. + * + * @param action the configuration action + */ + void localMods(Action<NamedDomainObjectContainer<ForgeLocalMod>> action); + + /** + * The container of local mods applied to run configs. + * + * @return the container + * @see ForgeLocalMod + */ + NamedDomainObjectContainer<ForgeLocalMod> getLocalMods(); } diff --git a/src/main/java/net/fabricmc/loom/api/ForgeLocalMod.java b/src/main/java/net/fabricmc/loom/api/ForgeLocalMod.java new file mode 100644 index 00000000..b722eb9e --- /dev/null +++ b/src/main/java/net/fabricmc/loom/api/ForgeLocalMod.java @@ -0,0 +1,88 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2021 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.api; + +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.gradle.api.Named; +import org.gradle.api.Project; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; + +/** + * Data for a mod built from project files in a dev environment. + * This data is only used for run config generation (FML needs the paths to mod files). + */ +public class ForgeLocalMod implements Named { + private final Project project; + private final String name; + private final List<Supplier<SourceSet>> sourceSets; + + /** + * Constructs a local mod. + * + * @param project the project using this mod + * @param name the unique name of this local mod (does not have to correspond to a mod ID) + * @param sourceSets the list of source set suppliers corresponding to this mod; must be mutable + */ + public ForgeLocalMod(Project project, String name, List<Supplier<SourceSet>> sourceSets) { + this.project = project; + this.name = name; + this.sourceSets = sourceSets; + } + + /** + * Adds source sets to this local mod. + * + * <p>The source sets are resolved like this: + * <ul> + * <li>a {@link SourceSet} is used as is</li> + * <li>all other objects will be converted to source set names with {@link String#valueOf(Object)} and + * fetched with {@code sourceSets.findByName(name)}</li> + * </ul> + * + * @param sourceSets the source sets + */ + public void add(Object... sourceSets) { + for (Object sourceSet : sourceSets) { + if (sourceSet instanceof SourceSet) { + this.sourceSets.add(() -> (SourceSet) sourceSet); + } else { + this.sourceSets.add(() -> project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName(String.valueOf(sourceSet))); + } + } + } + + @Override + public String getName() { + return name; + } + + public Stream<SourceSet> getSourceSets() { + return sourceSets.stream().map(Supplier::get); + } +} diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index b9f3b02e..01101461 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -26,7 +26,6 @@ package net.fabricmc.loom.api; import java.io.File; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import org.gradle.api.Action; @@ -45,7 +44,6 @@ import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; import net.fabricmc.loom.configuration.ide.RunConfig; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; -import net.fabricmc.loom.configuration.mods.forge.ForgeLocalMod; import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.ModPlatform; @@ -232,12 +230,6 @@ public interface LoomGradleExtensionAPI { return getPlatform().get() == ModPlatform.FORGE; } - boolean isForgeAndOfficial(); - - boolean isForgeAndNotOfficial(); - - boolean supportsInclude(); - void setGenerateSrgTiny(Boolean generateSrgTiny); boolean shouldGenerateSrgTiny(); @@ -246,49 +238,20 @@ public interface LoomGradleExtensionAPI { NamedDomainObjectContainer<LaunchProviderSettings> getLaunchConfigs(); - List<String> getDataGenMods(); - - default boolean isDataGenEnabled() { - return isForge() && !getDataGenMods().isEmpty(); - } - - void localMods(Action<NamedDomainObjectContainer<ForgeLocalMod>> action); - - NamedDomainObjectContainer<ForgeLocalMod> getForgeLocalMods(); - - void dataGen(Action<DataGenConsumer> action); - - interface DataGenConsumer { - void mod(String... modIds); - } - default void addTaskBeforeRun(String task) { this.getTasksBeforeRun().add(task); } List<String> getTasksBeforeRun(); - void mixinConfig(String... config); - - List<String> getMixinConfigs(); - - void accessTransformer(Object file); - - Set<File> getAccessTransformers(); - - boolean isUseFabricMixin(); - - void setUseFabricMixin(boolean useFabricMixin); - List<Consumer<RunConfig>> getSettingsPostEdit(); /** * Gets the Forge extension used to configure Forge details. - * Note that (for now) some Forge configuration is instead in this interface - - * this is due to change in the future. * * @return the Forge extension * @throws UnsupportedOperationException if running on another platform + * @see #isForge() */ ForgeExtensionAPI getForge(); diff --git a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java index 285f71cc..dd235062 100644 --- a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.configuration; import java.io.IOException; +import java.util.Set; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; @@ -36,7 +37,6 @@ import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.PublishArtifact; import org.gradle.api.artifacts.dsl.ArtifactHandler; import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.provider.Property; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Jar; import org.jetbrains.annotations.ApiStatus; @@ -48,6 +48,7 @@ import net.fabricmc.loom.task.AbstractLoomTask; import net.fabricmc.loom.task.RemapAllSourcesTask; import net.fabricmc.loom.task.RemapJarTask; import net.fabricmc.loom.task.RemapSourcesJarTask; +import net.fabricmc.loom.util.PropertyUtil; import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.aw2at.Aw2At; @@ -117,9 +118,13 @@ public class RemapConfiguration { } if (extension.isForge()) { - ((Jar) jarTask).manifest(manifest -> { - manifest.attributes(ImmutableMap.of("MixinConfigs", String.join(",", extension.getMixinConfigs()))); - }); + Set<String> mixinConfigs = PropertyUtil.getAndFinalize(extension.getForge().getMixinConfigs()); + + if (!mixinConfigs.isEmpty()) { + ((Jar) jarTask).manifest(manifest -> { + manifest.attributes(ImmutableMap.of("MixinConfigs", String.join(",", mixinConfigs))); + }); + } } if (isDefaultRemap) { @@ -130,10 +135,9 @@ public class RemapConfiguration { project.getArtifacts().add("archives", remapJarTask); if (extension.isForge()) { - Property<Boolean> convertAws = extension.getForge().getConvertAccessWideners(); - convertAws.finalizeValue(); + boolean convertAws = PropertyUtil.getAndFinalize(extension.getForge().getConvertAccessWideners()); - if (convertAws.get()) { + if (convertAws) { Aw2At.setup(project, remapJarTask); remapJarTask.getRemapAccessWidener().set(false); } diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/forge/ForgeLocalMod.java b/src/main/java/net/fabricmc/loom/configuration/mods/forge/ForgeLocalMod.java deleted file mode 100644 index ce5ff0e1..00000000 --- a/src/main/java/net/fabricmc/loom/configuration/mods/forge/ForgeLocalMod.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.fabricmc.loom.configuration.mods.forge; - -import java.util.List; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import org.gradle.api.Named; -import org.gradle.api.Project; -import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.tasks.SourceSet; - -public class ForgeLocalMod implements Named { - private final Project project; - private final String name; - private final List<Supplier<SourceSet>> sourceSets; - - public ForgeLocalMod(Project project, String name, List<Supplier<SourceSet>> sourceSets) { - this.project = project; - this.name = name; - this.sourceSets = sourceSets; - } - - public void add(Object... sourceSets) { - for (Object sourceSet : sourceSets) { - if (sourceSet instanceof SourceSet) { - this.sourceSets.add(() -> (SourceSet) sourceSet); - } else { - this.sourceSets.add(() -> project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName(String.valueOf(sourceSet))); - } - } - } - - @Override - public String getName() { - return name; - } - - public Stream<SourceSet> getSourceSets() { - return sourceSets.stream().map(Supplier::get); - } -}
\ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java index 2fb2c5fa..4da78eb1 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/LaunchProvider.java @@ -34,6 +34,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.StringJoiner; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -47,6 +48,7 @@ import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.PropertyUtil; public class LaunchProvider extends DependencyProvider { public LaunchProvider(Project project) { @@ -78,21 +80,21 @@ public class LaunchProvider extends DependencyProvider { .argument("data", "--all") .argument("data", "--mod") - .argument("data", String.join(",", getExtension().getDataGenMods())) + .argument("data", String.join(",", getExtension().getForge().getDataGenMods())) .argument("data", "--output") .argument("data", getProject().file("src/generated/resources").getAbsolutePath()) .property("mixin.env.remapRefMap", "true"); - if (getExtension().isUseFabricMixin()) { + if (PropertyUtil.getAndFinalize(getExtension().getForge().getUseFabricMixin())) { launchConfig.property("mixin.forgeloom.inject.mappings.srg-named", getExtension().getMappingsProvider().mixinTinyMappingsWithSrg.toAbsolutePath().toString()); } else { launchConfig.property("net.minecraftforge.gradle.GradleStart.srg.srg-mcp", getExtension().getMappingsProvider().srgToNamedSrg.toAbsolutePath().toString()); } - List<String> mixinConfigs = getExtension().getMixinConfigs(); + Set<String> mixinConfigs = PropertyUtil.getAndFinalize(getExtension().getForge().getMixinConfigs()); - if (mixinConfigs != null) { + if (!mixinConfigs.isEmpty()) { for (String config : mixinConfigs) { launchConfig.argument("-mixin.config"); launchConfig.argument(config); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeProvider.java index cd626652..9e1e4a7a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeProvider.java @@ -63,7 +63,7 @@ public class ForgeProvider extends DependencyProvider { public File getProjectCache() { if (projectCache == null) { - projectCache = new File(getDirectories().getRootProjectPersistentCache(), getMinecraftProvider().minecraftVersion() + "/forge/" + getExtension().getForgeProvider().getVersion().getCombined() + "/project-" + getProject().getPath().replace(':', '@')); + projectCache = new File(getDirectories().getRootProjectPersistentCache(), getMinecraftProvider().minecraftVersion() + "/forge/" + getExtension().getForgeProvider().getVersion().getCombined() + "/project-" + getProject().getPath().replace(':', '@')); projectCache.mkdirs(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java index 8cadbe2f..ed5e3e89 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/ForgeUserdevProvider.java @@ -62,10 +62,11 @@ import org.gradle.api.provider.Provider; import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; -import net.fabricmc.loom.configuration.mods.forge.ForgeLocalMod; +import net.fabricmc.loom.api.ForgeLocalMod; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DependencyDownloader; import net.fabricmc.loom.util.FileSystemUtil; +import net.fabricmc.loom.util.PropertyUtil; public class ForgeUserdevProvider extends DependencyProvider { private File userdevJar; @@ -114,7 +115,7 @@ public class ForgeUserdevProvider extends DependencyProvider { Dependency dep = null; if (lib.getAsString().startsWith("org.spongepowered:mixin:")) { - if (getExtension().isUseFabricMixin()) { + if (PropertyUtil.getAndFinalize(getExtension().getForge().getUseFabricMixin())) { if (lib.getAsString().contains("0.8.2")) { dep = addDependency("net.fabricmc:sponge-mixin:0.8.2+build.24", Constants.Configurations.FORGE_DEPENDENCIES); } else { @@ -258,7 +259,7 @@ public class ForgeUserdevProvider extends DependencyProvider { } else if (key.equals("source_roots")) { List<String> modClasses = new ArrayList<>(); - for (ForgeLocalMod localMod : getExtension().getForgeLocalMods()) { + for (ForgeLocalMod localMod : getExtension().getForge().getLocalMods()) { String sourceSetName = localMod.getName(); localMod.getSourceSets().flatMap(sourceSet -> Stream.concat( diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java index 44b6aadf..4bb1cd8e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java @@ -73,6 +73,7 @@ import net.minecraftforge.binarypatcher.ConsoleTool; import org.apache.commons.io.FileUtils; import org.apache.commons.io.output.NullOutputStream; import org.gradle.api.Project; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; import org.gradle.api.logging.LogLevel; import org.gradle.api.logging.Logger; @@ -145,7 +146,9 @@ public class MinecraftPatchedProvider extends DependencyProvider { public void initFiles() throws IOException { filesDirty = false; projectAtHash = new File(getDirectories().getProjectPersistentCache(), "at.sha256"); - projectAts = getExtension().getAccessTransformers(); + ConfigurableFileCollection accessTransformers = getExtension().getForge().getAccessTransformers(); + accessTransformers.finalizeValue(); + projectAts = accessTransformers.getFiles(); if (projectAts.isEmpty()) { SourceSet main = getProject().getConvention().findPlugin(JavaPluginConvention.class).getSourceSets().getByName("main"); diff --git a/src/main/java/net/fabricmc/loom/extension/ForgeExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/ForgeExtensionImpl.java index 6794b651..38f31d01 100644 --- a/src/main/java/net/fabricmc/loom/extension/ForgeExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/ForgeExtensionImpl.java @@ -24,22 +24,48 @@ package net.fabricmc.loom.extension; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import javax.inject.Inject; +import org.gradle.api.Action; +import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Project; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.provider.Property; import org.gradle.api.provider.SetProperty; +import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.ForgeExtensionAPI; +import net.fabricmc.loom.api.ForgeLocalMod; +import net.fabricmc.loom.configuration.ide.RunConfigSettings; public class ForgeExtensionImpl implements ForgeExtensionAPI { + private final LoomGradleExtension extension; private final Property<Boolean> convertAccessWideners; private final SetProperty<String> extraAccessWideners; + private final ConfigurableFileCollection accessTransformers; + private final SetProperty<String> mixinConfigs; + private final Property<Boolean> useFabricMixin; + private final List<String> dataGenMods = new ArrayList<>(); // not a property because it has custom adding logic + private final NamedDomainObjectContainer<ForgeLocalMod> localMods; @Inject - public ForgeExtensionImpl(Project project) { + public ForgeExtensionImpl(Project project, LoomGradleExtension extension) { + this.extension = extension; convertAccessWideners = project.getObjects().property(Boolean.class).convention(false); extraAccessWideners = project.getObjects().setProperty(String.class).empty(); + accessTransformers = project.getObjects().fileCollection(); + mixinConfigs = project.getObjects().setProperty(String.class).empty(); + useFabricMixin = project.getObjects().property(Boolean.class).convention(true); + localMods = project.container(ForgeLocalMod.class, + baseName -> new ForgeLocalMod(project, baseName, new ArrayList<>())); + + // Create default mod from main source set + localMods(mod -> mod.create("main").add("main")); } @Override @@ -51,4 +77,60 @@ public class ForgeExtensionImpl implements ForgeExtensionAPI { public SetProperty<String> getExtraAccessWideners() { return extraAccessWideners; } + + @Override + public ConfigurableFileCollection getAccessTransformers() { + return accessTransformers; + } + + @Override + public void accessTransformer(Object file) { + accessTransformers.from(file); + } + + @Override + public SetProperty<String> getMixinConfigs() { + return mixinConfigs; + } + + @Override + public void mixinConfigs(String... mixinConfigs) { + this.mixinConfigs.addAll(mixinConfigs); + } + + @Override + public Property<Boolean> getUseFabricMixin() { + return useFabricMixin; + } + + @Override + public List<String> getDataGenMods() { + // unmod list prevents uncontrolled additions (we want to create the run config too) + return Collections.unmodifiableList(dataGenMods); + } + + @SuppressWarnings("Convert2Lambda") + @Override + public void dataGen(Action<DataGenConsumer> action) { + action.execute(new DataGenConsumer() { + @Override + public void mod(String... modIds) { + dataGenMods.addAll(Arrays.asList(modIds)); + + if (modIds.length > 0 && extension.getRunConfigs().findByName("data") == null) { + extension.getRunConfigs().create("data", RunConfigSettings::data); + } + } + }); + } + + @Override + public void localMods(Action<NamedDomainObjectContainer<ForgeLocalMod>> action) { + action.execute(localMods); + } + + @Override + public NamedDomainObjectContainer<ForgeLocalMod> getLocalMods() { + return localMods; + } } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 46acb08c..2d31712d 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -24,15 +24,11 @@ package net.fabricmc.loom.extension; -import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Set; import java.util.function.Consumer; import com.google.common.base.Suppliers; @@ -56,7 +52,6 @@ import net.fabricmc.loom.configuration.ide.RunConfig; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; import net.fabricmc.loom.configuration.mods.ModVersionParser; -import net.fabricmc.loom.configuration.mods.forge.ForgeLocalMod; import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec; @@ -64,7 +59,6 @@ import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuil import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.ModPlatform; -import net.fabricmc.loom.util.function.LazyBool; /** * This class implements the public extension api. @@ -72,7 +66,6 @@ import net.fabricmc.loom.util.function.LazyBool; public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionAPI { private static final String FORGE_PROPERTY = "loom.forge"; private static final String PLATFORM_PROPERTY = "loom.platform"; - private static final String INCLUDE_PROPERTY = "loom.forge.include"; protected final DeprecationHelper deprecationHelper; protected final ListProperty<LoomDecompiler> decompilers; @@ -93,17 +86,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA // Architectury Loom // =================== private Provider<ModPlatform> platform; - public List<String> mixinConfigs = new ArrayList<>(); // FORGE: Passed to Minecraft - public Set<File> accessTransformers = new HashSet<>(); - public boolean useFabricMixin = true; // FORGE: Use Fabric Mixin for better refmap resolutions private boolean silentMojangMappingsLicense = false; public Boolean generateSrgTiny = null; - private final LazyBool supportsInclude; - private List<String> dataGenMods = new ArrayList<>(); private final List<String> tasksBeforeRun = Collections.synchronizedList(new ArrayList<>()); public final List<Consumer<RunConfig>> settingsPostEdit = new ArrayList<>(); private NamedDomainObjectContainer<LaunchProviderSettings> launchConfigs; - private NamedDomainObjectContainer<ForgeLocalMod> forgeLocalMods; protected LoomGradleExtensionApiImpl(Project project, LoomFiles directories) { this.runConfigs = project.container(RunConfigSettings.class, @@ -144,17 +131,8 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA return ModPlatform.FABRIC; })::get); - this.supportsInclude = new LazyBool(() -> Boolean.parseBoolean(Objects.toString(project.findProperty(INCLUDE_PROPERTY)))); this.launchConfigs = project.container(LaunchProviderSettings.class, baseName -> new LaunchProviderSettings(project, baseName)); - this.forgeLocalMods = project.container(ForgeLocalMod.class, - baseName -> new ForgeLocalMod(project, baseName, new ArrayList<>())); - - if (isForge()) { - localMods(mod -> { - mod.create("main").add("main"); - }); - } } @Override @@ -262,11 +240,6 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA } @Override - public boolean supportsInclude() { - return !isForge() || supportsInclude.getAsBoolean(); - } - - @Override public void setGenerateSrgTiny(Boolean generateSrgTiny) { this.generateSrgTiny = generateSrgTiny; } @@ -291,74 +264,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA } @Override - public List<String> getDataGenMods() { - return dataGenMods; - } - - @SuppressWarnings("Convert2Lambda") - @Override - public void localMods(Action<NamedDomainObjectContainer<ForgeLocalMod>> action) { - ModPlatform.assertPlatform(this, ModPlatform.FORGE); - action.execute(forgeLocalMods); - } - - @Override - public NamedDomainObjectContainer<ForgeLocalMod> getForgeLocalMods() { - return forgeLocalMods; - } - - @SuppressWarnings("Convert2Lambda") - @Override - public void dataGen(Action<DataGenConsumer> action) { - ModPlatform.assertPlatform(this, ModPlatform.FORGE); - action.execute(new DataGenConsumer() { - @Override - public void mod(String... modIds) { - dataGenMods.addAll(Arrays.asList(modIds)); - - if (modIds.length > 0 && getRunConfigs().findByName("data") == null) { - getRunConfigs().create("data", RunConfigSettings::data); - } - } - }); - } - - @Override public List<String> getTasksBeforeRun() { return tasksBeforeRun; } @Override - public void mixinConfig(String... config) { - mixinConfigs.addAll(Arrays.asList(config)); - } - - @Override - public List<String> getMixinConfigs() { - return mixinConfigs; - } - - @Override - public void accessTransformer(Object file) { - this.accessTransformers.add(getProject().file(file)); - } - - @Override - public Set<File> getAccessTransformers() { - return accessTransformers; - } - - @Override - public boolean isUseFabricMixin() { - return useFabricMixin; - } - - @Override - public void setUseFabricMixin(boolean useFabricMixin) { - this.useFabricMixin = useFabricMixin; - } - - @Override public List<Consumer<RunConfig>> getSettingsPostEdit() { return settingsPostEdit; } @@ -396,16 +306,6 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA } @Override - public boolean isForgeAndOfficial() { - throw new RuntimeException("Yeah... something is really wrong"); - } - - @Override - public boolean isForgeAndNotOfficial() { - throw new RuntimeException("Yeah... something is really wrong"); - } - - @Override protected String getMinecraftVersion() { throw new RuntimeException("Yeah... something is really wrong"); } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 7728bde6..9b93c066 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -50,6 +50,7 @@ import net.fabricmc.loom.configuration.LoomDependencyManager; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerFile; import net.fabricmc.loom.configuration.processors.JarProcessorManager; import net.fabricmc.loom.util.ModPlatform; +import net.fabricmc.loom.util.function.LazyBool; public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implements LoomGradleExtension { private final Project project; @@ -68,6 +69,12 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen private JarProcessorManager jarProcessorManager; private InstallerData installerData; + // +-------------------+ + // | Architectury Loom | + // +-------------------+ + private static final String INCLUDE_PROPERTY = "loom.forge.include"; + private final LazyBool supportsInclude; + public LoomGradleExtensionImpl(Project project, LoomFiles files) { super(project, files); this.project = project; @@ -75,7 +82,8 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen this.mixinApExtension = project.getObjects().newInstance(MixinExtensionImpl.class, project); this.loomFiles = files; this.unmappedMods = project.files(); - this.forgeExtension = Suppliers.memoize(() -> isForge() ? project.getObjects().newInstance(ForgeExtensionImpl.class, project) : null); + this.forgeExtension = Suppliers.memoize(() -> isForge() ? project.getObjects().newInstance(ForgeExtensionImpl.class, project, this) : null); + this.supportsInclude = new LazyBool(() -> Boolean.parseBoolean(Objects.toString(project.findProperty(INCLUDE_PROPERTY)))); } @Override @@ -200,4 +208,9 @@ public class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl implemen ModPlatform.assertPlatform(this, ModPlatform.FORGE); return forgeExtension.get(); } + + @Override + public boolean supportsInclude() { + return !isForge() || supportsInclude.getAsBoolean(); + } } diff --git a/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java b/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java index e822a5a1..36497f4f 100644 --- a/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java @@ -24,9 +24,7 @@ package net.fabricmc.loom.extension; -import java.io.File; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import org.gradle.api.Action; @@ -47,7 +45,6 @@ import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; import net.fabricmc.loom.configuration.ide.RunConfig; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; -import net.fabricmc.loom.configuration.mods.forge.ForgeLocalMod; import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.ModPlatform; @@ -187,24 +184,6 @@ public class MinecraftGradleExtension implements LoomGradleExtensionAPI { } @Override - public boolean isForgeAndOfficial() { - reportDeprecation(); - return parent.isForgeAndOfficial(); - } - - @Override - public boolean isForgeAndNotOfficial() { - reportDeprecation(); - return parent.isForgeAndNotOfficial(); - } - - @Override - public boolean supportsInclude() { - reportDeprecation(); - return parent.supportsInclude(); - } - - @Override public void setGenerateSrgTiny(Boolean generateSrgTiny) { reportDeprecation(); parent.setGenerateSrgTiny(generateSrgTiny); @@ -229,72 +208,12 @@ public class MinecraftGradleExtension implements LoomGradleExtensionAPI { } @Override - public List<String> getDataGenMods() { - reportDeprecation(); - return parent.getDataGenMods(); - } - - @Override - public void localMods(Action<NamedDomainObjectContainer<ForgeLocalMod>> action) { - reportDeprecation(); - parent.localMods(action); - } - - @Override - public NamedDomainObjectContainer<ForgeLocalMod> getForgeLocalMods() { - reportDeprecation(); - return parent.getForgeLocalMods(); - } - - @Override - public void dataGen(Action<DataGenConsumer> action) { - reportDeprecation(); - parent.dataGen(action); - } - - @Override public List<String> getTasksBeforeRun() { reportDeprecation(); return parent.getTasksBeforeRun(); } @Override - public void mixinConfig(String... config) { - reportDeprecation(); - parent.mixinConfig(config); - } - - @Override - public List<String> getMixinConfigs() { - reportDeprecation(); - return parent.getMixinConfigs(); - } - - @Override - public void accessTransformer(Object file) { - reportDeprecation(); - parent.accessTransformer(file); - } - - @Override - public Set<File> getAccessTransformers() { - reportDeprecation(); - return parent.getAccessTransformers(); - } - - @Override - public boolean isUseFabricMixin() { - reportDeprecation(); - return parent.isUseFabricMixin(); - } - - @Override - public void setUseFabricMixin(boolean useFabricMixin) { - reportDeprecation(); - parent.setUseFabricMixin(useFabricMixin); - } - - @Override public List<Consumer<RunConfig>> getSettingsPostEdit() { reportDeprecation(); return parent.getSettingsPostEdit(); diff --git a/src/main/java/net/fabricmc/loom/util/PropertyUtil.java b/src/main/java/net/fabricmc/loom/util/PropertyUtil.java new file mode 100644 index 00000000..98e85b68 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/PropertyUtil.java @@ -0,0 +1,45 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2021 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.util; + +import org.gradle.api.provider.HasConfigurableValue; +import org.gradle.api.provider.Provider; + +/** + * Working with properties. + */ +public final class PropertyUtil { + /** + * Gets a property and finalizes its value. + * + * @param property the property + * @param <T> the value type + * @return the current property value + */ + public static <T, P extends Provider<T> & HasConfigurableValue> T getAndFinalize(P property) { + property.finalizeValue(); + return property.get(); + } +} |