From 874671eb7f7e5a586fe35650de0df56abbcd938b Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 6 Jan 2022 16:03:03 +0800 Subject: [PATCH] Fix merge conflicts, it compiles, but shouldn't work Signed-off-by: shedaniel --- .github/workflows/publish.yml | 1 - .../loom/api/LoomGradleExtensionAPI.java | 2 +- .../loom/build/ModCompileRemapper.java | 4 +- .../mixin/AnnotationProcessorInvoker.java | 1 + .../build/nesting/EmptyNestedJarProvider.java | 38 ------ .../configuration/CompileConfiguration.java | 3 +- .../accesswidener/AccessWidenerFile.java | 2 +- .../InterfaceInjectionProcessor.java | 2 +- .../loom/configuration/mods/ModProcessor.java | 2 + .../providers/MinecraftProviderImpl.java | 3 +- .../providers/forge/ForgeUserdevProvider.java | 4 +- .../forge/MinecraftPatchedProvider.java | 7 +- .../minecraft/MinecraftMappedProvider.java | 56 +-------- .../minecraft/SignatureFixerApplyVisitor.java | 4 +- .../extension/LoomGradleExtensionApiImpl.java | 7 +- .../loom/extension/MixinExtensionImpl.java | 2 + .../loom/task/AbstractRemapJarTask.java | 3 +- .../task/ArchitecturyGenerateSourcesTask.java | 1 - .../net/fabricmc/loom/task/LoomTasks.java | 34 ++---- .../net/fabricmc/loom/task/RemapJarTask.java | 114 ++++++++++++++++-- .../loom/task/service/JarManifestService.java | 2 +- .../loom/task/service/MappingsService.java | 4 +- .../java/net/fabricmc/loom/util/ModUtils.java | 15 +++ .../LayeredMappingSpecBuilderTest.groovy | 1 - 24 files changed, 160 insertions(+), 152 deletions(-) delete mode 100644 src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f96f64e9..bf8cb5a7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -8,7 +8,6 @@ on: - 'dev/0.8' - 'dev/0.9' - 'dev/0.10.0' - - 'dev/0.11.0' jobs: build: diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index cd51135e..0b0d7045 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -153,7 +153,7 @@ public interface LoomGradleExtensionAPI { // =================== // Architectury Loom // =================== - ListProperty getArchGameDecompilers(); + DomainObjectCollection getArchGameDecompilers(); default void addArchDecompiler(ArchitecturyLoomDecompiler decompiler) { getArchGameDecompilers().add(decompiler); diff --git a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 17b4b7f3..df8d2931 100644 --- a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -94,7 +94,7 @@ public class ModCompileRemapper { String name = extension.isForgeAndOfficial() ? "B" + checksum.get() : artifact.getModuleVersion().getId().getName(); String version = extension.isForgeAndOfficial() ? "B" + checksum.get() : replaceIfNullOrEmpty(artifact.getModuleVersion().getId().getVersion(), () -> Checksum.truncatedSha256(artifact.getFile())); - if (!ModUtils.shouldRemapMod(artifact.getFile(), artifact.getId(), extension.isForge(), sourceConfig.getName())) { + if (!ModUtils.shouldRemapMod(project.getLogger(), artifact.getFile(), artifact.getId(), extension.isForge(), sourceConfig.getName())) { addToRegularCompile(project, regularConfig, artifact); continue; } @@ -121,7 +121,7 @@ public class ModCompileRemapper { // Create a mod dependency for each file in the file collection for (File artifact : files) { - if (!ModUtils.shouldRemapMod(artifact, artifact.getName(), extension.isForge(), sourceConfig.getName())) { + if (!ModUtils.shouldRemapMod(project.getLogger(), artifact, artifact.getName(), extension.isForge(), sourceConfig.getName())) { dependencies.add(regularConfig.getName(), project.files(artifact)); continue; } diff --git a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java index 3e2fa3ab..7ca55479 100644 --- a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java @@ -99,6 +99,7 @@ public abstract class AnnotationProcessorInvoker { } public void configureMixin() { + LoomGradleExtension extension = LoomGradleExtension.get(project); ConfigurationContainer configs = project.getConfigurations(); if (!IdeaUtils.isIdeaSync()) { diff --git a/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java b/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java deleted file mode 100644 index 8a305d49..00000000 --- a/src/main/java/net/fabricmc/loom/build/nesting/EmptyNestedJarProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.build.nesting; - -import java.io.File; -import java.util.Collection; -import java.util.Collections; - -public enum EmptyNestedJarProvider implements NestedJarProvider { - INSTANCE; - - @Override - public Collection provide() { - return Collections.emptyList(); - } -} diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index c4b09ee9..685bd41c 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -31,6 +31,7 @@ import org.gradle.api.NamedDomainObjectProvider; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.AbstractCopyTask; import org.gradle.api.tasks.SourceSet; @@ -54,7 +55,6 @@ import net.fabricmc.loom.configuration.providers.forge.SrgProvider; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.extension.MixinExtension; import net.fabricmc.loom.task.GenerateSourcesTask; -import net.fabricmc.loom.task.GenVsCodeProjectTask; import net.fabricmc.loom.task.UnpickJarTask; import net.fabricmc.loom.util.Constants; @@ -124,6 +124,7 @@ public final class CompileConfiguration { if (extension.supportsInclude()) { extension.createLazyConfiguration(Constants.Configurations.INCLUDE, configuration -> configuration.setTransitive(false)); // Dont get transitive deps } + extension.createLazyConfiguration(Constants.Configurations.MAPPING_CONSTANTS); extension.createLazyConfiguration(Constants.Configurations.NAMED_ELEMENTS, configuration -> { configuration.setCanBeConsumed(true); 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 d54d1b1a..d9e7c6c0 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerFile.java @@ -91,7 +91,7 @@ public record AccessWidenerFile( content ); } - + return null; } diff --git a/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java b/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java index 16666589..3350bbd8 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/ifaceinject/InterfaceInjectionProcessor.java @@ -44,6 +44,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import dev.architectury.tinyremapper.TinyRemapper; import org.gradle.api.Project; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -57,7 +58,6 @@ import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.Pair; import net.fabricmc.loom.util.TinyRemapperHelper; import net.fabricmc.loom.util.ZipUtils; -import net.fabricmc.tinyremapper.TinyRemapper; public class InterfaceInjectionProcessor implements JarProcessor { // Filename used to store hash of injected interfaces in processed jar file diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index 0c28cac9..d24438e4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -117,6 +117,7 @@ public class ModProcessor { private void stripNestedJars(File file) { if (!ZipUtils.contains(file.toPath(), "fabric.mod.json")) return; + // Strip out all contained jar info as we dont want loader to try and load the jars contained in dev. try { ZipUtils.transformJson(JsonObject.class, file.toPath(), Map.of("fabric.mod.json", json -> { @@ -174,6 +175,7 @@ public class ModProcessor { if (extension.isForgeAndNotOfficial()) { remapper.readClassPathAsync(mappedProvider.getForgeSrgJar().toPath()); } + remapper.readClassPathAsync(mcDeps); final Map tagMap = new HashMap<>(); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java index e1ebed95..aab3fff4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java @@ -64,8 +64,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra // The extracted server jar from the boostrap, only exists in >=21w39a public File minecraftExtractedServerJar; @Nullable - private BundleMetadata serverBundleMetadata; - private Boolean isNewerThan21w39a; + public BundleMetadata serverBundleMetadata; private File minecraftMergedJar; private File versionManifestJson; private File experimentalVersionsJson; 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 358fd110..e5b6cdfc 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 @@ -59,10 +59,10 @@ import org.gradle.api.attributes.Attribute; import org.gradle.api.file.FileSystemLocation; import org.gradle.api.provider.Provider; +import net.fabricmc.loom.api.ForgeLocalMod; import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.launch.LaunchProviderSettings; -import net.fabricmc.loom.api.ForgeLocalMod; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DependencyDownloader; import net.fabricmc.loom.util.FileSystemUtil; @@ -254,7 +254,7 @@ public class ForgeUserdevProvider extends DependencyProvider { } else if (key.equals("assets_root")) { string = new File(getDirectories().getUserCache(), "assets").getAbsolutePath(); } else if (key.equals("natives")) { - string = getMinecraftProvider().nativesDir().getAbsolutePath(); + string = getExtension().getFiles().getNativesDirectory(getProject()).getAbsolutePath(); } else if (key.equals("source_roots")) { List modClasses = new ArrayList<>(); 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 fadf7d33..aef22063 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 @@ -57,6 +57,7 @@ import java.util.jar.Manifest; import java.util.regex.Pattern; import java.util.stream.Stream; +import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableList; @@ -338,7 +339,7 @@ public class MinecraftPatchedProvider extends DependencyProvider { private void createSrgJars(Logger logger) throws Exception { MinecraftProviderImpl minecraftProvider = getExtension().getMinecraftProvider(); - produceSrgJar(getExtension().isForgeAndOfficial(), minecraftProvider.minecraftClientJar.toPath(), minecraftProvider.getMinecraftServerJar().toPath()); + produceSrgJar(getExtension().isForgeAndOfficial(), minecraftProvider.minecraftClientJar.toPath(), MoreObjects.firstNonNull(minecraftProvider.minecraftExtractedServerJar, minecraftProvider.minecraftServerJar).toPath()); } private void produceSrgJar(boolean official, Path clientJar, Path serverJar) throws IOException { @@ -480,7 +481,7 @@ public class MinecraftPatchedProvider extends DependencyProvider { private void accessTransformForge(Logger logger) throws Exception { MinecraftProviderImpl minecraftProvider = getExtension().getMinecraftProvider(); List toDelete = new ArrayList<>(); - String atDependency = Constants.Dependencies.ACCESS_TRANSFORMERS + (minecraftProvider.isNewerThan21w39a() ? Constants.Dependencies.Versions.ACCESS_TRANSFORMERS_NEW : Constants.Dependencies.Versions.ACCESS_TRANSFORMERS); + String atDependency = Constants.Dependencies.ACCESS_TRANSFORMERS + (minecraftProvider.serverBundleMetadata != null ? Constants.Dependencies.Versions.ACCESS_TRANSFORMERS_NEW : Constants.Dependencies.Versions.ACCESS_TRANSFORMERS); FileCollection classpath = DependencyDownloader.download(getProject(), atDependency); Stopwatch stopwatch = Stopwatch.createStarted(); @@ -653,7 +654,7 @@ public class MinecraftPatchedProvider extends DependencyProvider { // Copy resources MinecraftProviderImpl minecraftProvider = getExtension().getMinecraftProvider(); copyNonClassFiles(minecraftProvider.minecraftClientJar, minecraftMergedPatchedSrgJar); - copyNonClassFiles(minecraftProvider.getMinecraftServerJar(), minecraftMergedPatchedSrgJar); + copyNonClassFiles(MoreObjects.firstNonNull(minecraftProvider.minecraftExtractedServerJar, minecraftProvider.minecraftServerJar), minecraftMergedPatchedSrgJar); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java index ec003995..fbfd276a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java @@ -30,13 +30,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Objects; import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import com.google.common.base.Stopwatch; @@ -45,13 +41,10 @@ import dev.architectury.tinyremapper.InputTag; import dev.architectury.tinyremapper.NonClassCopyMode; import dev.architectury.tinyremapper.OutputConsumerPath; import dev.architectury.tinyremapper.TinyRemapper; -import dev.architectury.tinyremapper.api.TrClass; import org.apache.commons.lang3.mutable.Mutable; import org.apache.commons.lang3.tuple.Triple; import org.gradle.api.Project; import org.jetbrains.annotations.Nullable; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.commons.Remapper; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.DependencyProvider; @@ -274,7 +267,6 @@ public class MinecraftMappedProvider extends DependencyProvider { InputTag vanillaTag = remapper.createInputTag(); InputTag forgeTag = remapper.createInputTag(); Stopwatch stopwatch = Stopwatch.createStarted(); - final boolean fixSignatures = getExtension().getMappingsProvider().getSignatureFixes() != null; getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); remapper.readInputs(vanillaTag, vanilla.input); @@ -287,53 +279,7 @@ public class MinecraftMappedProvider extends DependencyProvider { if (!MappingsNamespace.INTERMEDIARY.toString().equals(toM)) mappings.setValue(null); postApply.clear(); - // Bit ugly but whatever, the whole issue is a bit ugly :) - AtomicReference> remappedSignatures = new AtomicReference<>(); - - if (fixSignatures) { - postApply.add(new TinyRemapper.ApplyVisitorProvider() { - @Override - public ClassVisitor insertApplyVisitor(TrClass cls, ClassVisitor next) { - return new ClassVisitor(Constants.ASM_VERSION, next) { - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - Map signatureFixes = Objects.requireNonNull(remappedSignatures.get(), "Could not get remapped signatures"); - - if (signature == null) { - signature = signatureFixes.getOrDefault(name, null); - - if (signature != null) { - getProject().getLogger().info("Replaced signature for {} with {}", name, signature); - } - } - - super.visit(version, access, name, signature, superName, interfaces); - } - }; - } - }); - - if (MappingsNamespace.INTERMEDIARY.toString().equals(toM)) { - // No need to remap, as these are already intermediary - remappedSignatures.set(getExtension().getMappingsProvider().getSignatureFixes()); - } else { - // Remap the sig fixes from intermediary to the target namespace - final Map remapped = new HashMap<>(); - final TinyRemapper sigTinyRemapper = TinyRemapperHelper.getTinyRemapper(getProject(), fromM, toM); - final Remapper sigAsmRemapper = sigTinyRemapper.getRemapper(); - - // Remap the class names and the signatures using a new tiny remapper instance. - for (Map.Entry entry : getExtension().getMappingsProvider().getSignatureFixes().entrySet()) { - remapped.put( - sigAsmRemapper.map(entry.getKey()), - sigAsmRemapper.mapSignature(entry.getValue(), false) - ); - } - - sigTinyRemapper.finish(); - remappedSignatures.set(remapped); - } - } + postApply.add(new SignatureFixerApplyVisitor(SignatureFixerApplyVisitor.getRemappedSignatures(MappingsNamespace.INTERMEDIARY.toString().equals(toM), getExtension().getMappingsProvider(), getProject(), toM))); OutputRemappingHandler.remap(remapper, vanilla.assets, output, null, vanillaTag); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SignatureFixerApplyVisitor.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SignatureFixerApplyVisitor.java index 0ebff346..3138b582 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SignatureFixerApplyVisitor.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SignatureFixerApplyVisitor.java @@ -29,6 +29,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import dev.architectury.tinyremapper.TinyRemapper; +import dev.architectury.tinyremapper.api.TrClass; import org.gradle.api.Project; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.commons.Remapper; @@ -37,8 +39,6 @@ import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.TinyRemapperHelper; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.tinyremapper.api.TrClass; public record SignatureFixerApplyVisitor(Map signatureFixes) implements TinyRemapper.ApplyVisitorProvider { @Override diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 04dfdd8c..7279a70a 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -89,7 +89,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA // =================== // Architectury Loom // =================== - private final ListProperty archDecompilers; + private final DomainObjectCollection archDecompilers; private Provider platform; private boolean silentMojangMappingsLicense = false; public Boolean generateSrgTiny = null; @@ -142,8 +142,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA })::get); this.launchConfigs = project.container(LaunchProviderSettings.class, baseName -> new LaunchProviderSettings(project, baseName)); - this.archDecompilers = project.getObjects().listProperty(ArchitecturyLoomDecompiler.class) - .empty(); + this.archDecompilers = project.getObjects().domainObjectSet(ArchitecturyLoomDecompiler.class); } @Override @@ -300,7 +299,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA } @Override - public ListProperty getArchGameDecompilers() { + public DomainObjectCollection getArchGameDecompilers() { return archDecompilers; } diff --git a/src/main/java/net/fabricmc/loom/extension/MixinExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/MixinExtensionImpl.java index 6e0b7204..ca9639ca 100644 --- a/src/main/java/net/fabricmc/loom/extension/MixinExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/MixinExtensionImpl.java @@ -38,6 +38,7 @@ import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.UnknownTaskException; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.plugins.BasePluginConvention; import org.gradle.api.plugins.BasePluginExtension; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; @@ -72,6 +73,7 @@ public class MixinExtensionImpl extends MixinExtensionApiImpl implements MixinEx if (project.getRootProject() != project) { defaultRefmapName = project.getConvention().getPlugin(BasePluginConvention.class).getArchivesBaseName() + "-" + project.getPath().replaceFirst(":", "").replace(':', '_') + "-refmap.json"; } + project.getLogger().info("Could not find refmap definition, will be using default name: " + defaultRefmapName); return defaultRefmapName; } diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java index af022a8b..dcde70b1 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRemapJarTask.java @@ -43,6 +43,7 @@ import org.gradle.workers.WorkQueue; import org.gradle.workers.WorkerExecutor; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; +import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.ZipReprocessorUtil; public abstract class AbstractRemapJarTask extends Jar { @@ -64,7 +65,7 @@ public abstract class AbstractRemapJarTask extends Jar { @Inject public AbstractRemapJarTask() { getSourceNamespace().convention(MappingsNamespace.NAMED.toString()).finalizeValueOnRead(); - getTargetNamespace().convention(MappingsNamespace.INTERMEDIARY.toString()).finalizeValueOnRead(); + getTargetNamespace().convention(SourceRemapper.intermediary(getProject())).finalizeValueOnRead(); } public final

void submitWork(Class> workAction, Action

action) { diff --git a/src/main/java/net/fabricmc/loom/task/ArchitecturyGenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/ArchitecturyGenerateSourcesTask.java index 402cee1e..0ff32f28 100644 --- a/src/main/java/net/fabricmc/loom/task/ArchitecturyGenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/ArchitecturyGenerateSourcesTask.java @@ -33,7 +33,6 @@ import javax.inject.Inject; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.MapProperty; -import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index 3479dbd0..23c4b9b9 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -89,19 +89,6 @@ public final class LoomTasks { t.dependsOn("downloadAssets"); t.setGroup(Constants.TaskGroup.IDE); }); - - tasks.register("genIntelliJRuns", AbstractLoomTask.class, t -> { - t.setDescription("Generates IntelliJ IDEA launch configurations."); - t.dependsOn("downloadAssets"); - t.setGroup("ide"); - t.doLast(task -> { - try { - SetupIntelijRunConfigs.generate(task.getProject(), true); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }); - }); } private static void registerRunTasks(TaskContainer tasks, Project project) { @@ -148,19 +135,14 @@ public final class LoomTasks { }); }); - for (ArchitecturyLoomDecompiler decompiler : extension.getArchGameDecompilers().get()) { - String taskName = "genSourcesWith" + decompiler.name(); - // Decompiler will be passed to the constructor of ArchitecturyGenerateSourcesTask - tasks.register(taskName, ArchitecturyGenerateSourcesTask.class, decompiler).configure(task -> { - task.setDescription("Decompile minecraft using %s.".formatted(decompiler.name())); - task.setGroup(Constants.TaskGroup.FABRIC); - task.getInputJar().set(inputJar); - - if (mappingsProvider.hasUnpickDefinitions()) { - task.dependsOn(tasks.getByName("unpickJar")); - } - }); - } + LoomGradleExtension.get(project).getArchGameDecompilers().configureEach(decompiler -> { + String taskName = "genSourcesWith" + decompiler.name(); + // Decompiler will be passed to the constructor of ArchitecturyGenerateSourcesTask + tasks.register(taskName, ArchitecturyGenerateSourcesTask.class, decompiler).configure(task -> { + task.setDescription("Decompile minecraft using %s.".formatted(decompiler.name())); + task.setGroup(Constants.TaskGroup.FABRIC); + }); + }); tasks.register("genSources", task -> { task.setDescription("Decompile minecraft using the default decompiler."); diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index a9d357aa..2a7415f8 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -24,16 +24,24 @@ package net.fabricmc.loom.task; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.Serializable; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.FileSystem; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.jar.Manifest; import java.util.stream.Collectors; @@ -41,6 +49,13 @@ import javax.inject.Inject; import com.google.common.base.Preconditions; import com.google.gson.JsonObject; +import dev.architectury.tinyremapper.InputTag; +import dev.architectury.tinyremapper.OutputConsumerPath; +import dev.architectury.tinyremapper.TinyRemapper; +import dev.architectury.tinyremapper.TinyUtils; +import org.cadixdev.at.AccessTransformSet; +import org.cadixdev.at.io.AccessTransformFormats; +import org.cadixdev.lorenz.MappingSet; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; @@ -48,6 +63,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; +import org.gradle.api.provider.SetProperty; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.SourceSet; @@ -69,11 +85,11 @@ import net.fabricmc.loom.extension.MixinExtension; import net.fabricmc.loom.task.service.JarManifestService; import net.fabricmc.loom.task.service.MappingsService; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.FileSystemUtil; +import net.fabricmc.loom.util.LfWriter; import net.fabricmc.loom.util.ZipUtils; -import net.fabricmc.tinyremapper.InputTag; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.tinyremapper.TinyUtils; +import net.fabricmc.loom.util.aw2at.Aw2At; +import net.fabricmc.lorenztiny.TinyMappingsReader; public abstract class RemapJarTask extends AbstractRemapJarTask { private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; @@ -84,6 +100,17 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { @Input public abstract Property getAddNestedDependencies(); + /** + * Gets the jar paths to the access wideners that will be converted to ATs for Forge runtime. + * If you specify multiple files, they will be merged into one. + * + *

The specified files will be converted and removed from the final jar. + * + * @return the property containing access widener paths in the final jar + */ + @Input + public abstract SetProperty getAtAccessWideners(); + @Inject public RemapJarTask() { super(); @@ -100,7 +127,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { final LoomGradleExtension extension = LoomGradleExtension.get(getProject()); submitWork(RemapAction.class, params -> { - if (getAddNestedDependencies().get()) { + if (extension.supportsInclude() && getAddNestedDependencies().get()) { params.getNestedJars().from(getNestedJars()); } @@ -114,6 +141,14 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { if (legacyMixin) { params.getMixinMappings().from(extension.getAllMixinMappings()); setupLegacyMixinRefmapRemapping(params); + } else if (extension.isForge()) { + throw new RuntimeException("Forge must have useLegacyMixinAp enabled"); + } + + params.getForge().set(extension.isForge()); + + if (extension.isForge()) { + params.getAtAccessWideners().set(getAtAccessWideners()); } }); } @@ -175,8 +210,13 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { ConfigurableFileCollection getNestedJars(); ConfigurableFileCollection getRemapClasspath(); ConfigurableFileCollection getMixinMappings(); + ListProperty> getMappings(); + Property getForge(); + + SetProperty getAtAccessWideners(); + Property getUseMixinExtension(); record RefmapData(List mixinConfigs, String refmapName) implements Serializable { } @@ -201,7 +241,11 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { remapAccessWidener(); addRefmaps(); addNestedJars(); - modifyJarManifest(); + + if (!getParameters().getForge().get()) { + modifyJarManifest(); + } + rewriteJar(); tinyRemapper.finish(); @@ -243,6 +287,62 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { ZipUtils.replace(outputFile, accessWidenerFile.path(), remapped); } + private void convertAwToAt() throws IOException { + if (!this.getParameters().getAtAccessWideners().isPresent()) { + return; + } + + Set atAccessWideners = this.getParameters().getAtAccessWideners().get(); + + if (atAccessWideners.isEmpty()) { + return; + } + + AccessTransformSet at = AccessTransformSet.create(); + File jar = inputFile.toFile(); + + try (FileSystemUtil.Delegate fileSystem = FileSystemUtil.getJarFileSystem(jar, false)) { + FileSystem fs = fileSystem.get(); + Path atPath = fs.getPath(Constants.Forge.ACCESS_TRANSFORMER_PATH); + + if (Files.exists(atPath)) { + throw new FileAlreadyExistsException("Jar " + jar + " already contains an access transformer - cannot convert AWs!"); + } + + for (String aw : atAccessWideners) { + Path awPath = fs.getPath(aw); + + if (Files.notExists(awPath)) { + throw new NoSuchFileException("Could not find AW '" + aw + "' to convert into AT!"); + } + + try (BufferedReader reader = Files.newBufferedReader(awPath, StandardCharsets.UTF_8)) { + at.merge(Aw2At.toAccessTransformSet(reader)); + } + + Files.delete(awPath); + } + + List> providers = getParameters().getMappings().get(); + + // This is a bit of a hack, but we are going to get the first one, it should be the default one + if (providers.isEmpty()) { + throw new IllegalStateException("No mappings provider found for AW to AT conversion!"); + } + + MappingsService service = providers.get(0).get(); + + try (TinyMappingsReader reader = new TinyMappingsReader(service.getMemoryMappingTree(), service.getFromNamespace(), service.getToNamespace())) { + MappingSet mappingSet = reader.read(); + at = at.remap(mappingSet); + } + + try (Writer writer = new LfWriter(Files.newBufferedWriter(atPath))) { + AccessTransformFormats.FML.write(writer, at); + } + } + } + private static byte[] remapAccessWidener(byte[] input, Remapper asmRemapper, String targetNamespace) { int version = AccessWidenerReader.readVersion(input); @@ -313,7 +413,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { } if (getParameters().getUseMixinExtension().get()) { - builder.extension(new net.fabricmc.tinyremapper.extension.mixin.MixinExtension()); + builder.extension(new dev.architectury.tinyremapper.extension.mixin.MixinExtension()); } TinyRemapper remapper = builder.build(); diff --git a/src/main/java/net/fabricmc/loom/task/service/JarManifestService.java b/src/main/java/net/fabricmc/loom/task/service/JarManifestService.java index c80852e8..47175ba0 100644 --- a/src/main/java/net/fabricmc/loom/task/service/JarManifestService.java +++ b/src/main/java/net/fabricmc/loom/task/service/JarManifestService.java @@ -29,6 +29,7 @@ import java.util.Optional; import java.util.jar.Attributes; import java.util.jar.Manifest; +import dev.architectury.tinyremapper.TinyRemapper; import org.gradle.api.Project; import org.gradle.api.artifacts.Dependency; import org.gradle.api.provider.Property; @@ -40,7 +41,6 @@ import org.gradle.util.GradleVersion; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.util.Constants; -import net.fabricmc.tinyremapper.TinyRemapper; public abstract class JarManifestService implements BuildService { interface Params extends BuildServiceParameters { diff --git a/src/main/java/net/fabricmc/loom/task/service/MappingsService.java b/src/main/java/net/fabricmc/loom/task/service/MappingsService.java index 99cebcb7..fe96fd54 100644 --- a/src/main/java/net/fabricmc/loom/task/service/MappingsService.java +++ b/src/main/java/net/fabricmc/loom/task/service/MappingsService.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; +import dev.architectury.tinyremapper.IMappingProvider; import org.gradle.api.Project; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; @@ -40,7 +41,6 @@ import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.util.TinyRemapperHelper; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.tree.MemoryMappingTree; -import net.fabricmc.tinyremapper.IMappingProvider; public abstract class MappingsService implements BuildService, AutoCloseable { interface Params extends BuildServiceParameters { @@ -66,7 +66,7 @@ public abstract class MappingsService implements BuildService createDefault(Project project, String from, String to) { final MappingsProviderImpl mappingsProvider = LoomGradleExtension.get(project).getMappingsProvider(); final String name = mappingsProvider.getBuildServiceName("mappingsProvider", from, to); - return MappingsService.create(project, name, mappingsProvider.tinyMappings.toFile(), from, to, false); + return MappingsService.create(project, name, (from.equals("srg") || to.equals("srg")) && LoomGradleExtension.get(project).shouldGenerateSrgTiny() ? mappingsProvider.tinyMappingsWithSrg.toFile() : mappingsProvider.tinyMappings.toFile(), from, to, false); } private IMappingProvider mappingProvider = null; diff --git a/src/main/java/net/fabricmc/loom/util/ModUtils.java b/src/main/java/net/fabricmc/loom/util/ModUtils.java index d49b5188..9342c1ca 100644 --- a/src/main/java/net/fabricmc/loom/util/ModUtils.java +++ b/src/main/java/net/fabricmc/loom/util/ModUtils.java @@ -26,6 +26,8 @@ package net.fabricmc.loom.util; import java.io.File; +import org.gradle.api.logging.Logger; + public final class ModUtils { private ModUtils() { } @@ -33,4 +35,17 @@ public final class ModUtils { public static boolean isMod(File input) { return ZipUtils.contains(input.toPath(), "fabric.mod.json"); } + + public static boolean shouldRemapMod(Logger logger, File input, Object id, boolean forge, String config) { + if (ZipUtils.contains(input.toPath(), "architectury.common.marker")) return true; + if (forge && ZipUtils.contains(input.toPath(), "META-INF/mods.toml")) return true; + if (!forge && isMod(input)) return true; + + if (forge) { + logger.lifecycle(":could not find forge mod in " + config + " but forcing: {}", id); + return true; + } + + return false; + } } diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingSpecBuilderTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingSpecBuilderTest.groovy index 097ec4ae..9078342d 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingSpecBuilderTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingSpecBuilderTest.groovy @@ -31,7 +31,6 @@ import net.fabricmc.loom.configuration.providers.mappings.intermediary.Intermedi import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec import net.fabricmc.loom.util.ClosureAction -import spock.lang.Specification class LayeredMappingSpecBuilderTest extends LayeredMappingsSpecification { def "simple mojmap" () {