From 2838faf41d79de5db29bba333a4dc2e0c8d12ca4 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 4 Apr 2024 18:21:21 +0900 Subject: [PATCH] Fix compile errors --- .../configuration/CompileConfiguration.java | 4 +- .../minecraft/ForgeMinecraftProvider.java | 13 +-- .../MergedForgeMinecraftProvider.java | 5 +- .../SingleJarForgeMinecraftProvider.java | 93 ++++++++++++++++--- .../minecraft/MinecraftJarConfiguration.java | 20 ++-- .../minecraft/MinecraftProvider.java | 6 +- .../minecraft/SingleJarMinecraftProvider.java | 8 +- .../mapped/MojangMappedMinecraftProvider.java | 16 +++- .../mapped/SrgMinecraftProvider.java | 16 +++- .../sources/ForgeSourcesRemapper.java | 2 +- .../linemap/LineMapClassFilter.java | 64 ------------- .../decompilers/linemap/LineMapReader.java | 68 -------------- .../decompilers/linemap/LineMapVisitor.java | 92 ------------------ .../decompilers/linemap/LineMapWriter.java | 63 ------------- .../task/GenerateForgePatchedSourcesTask.java | 2 +- .../loom/task/GenerateSourcesTask.java | 43 +++++---- .../loom/test/unit/LineMapTest.groovy | 60 ------------ 17 files changed, 167 insertions(+), 408 deletions(-) delete mode 100644 src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapClassFilter.java delete mode 100644 src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapReader.java delete mode 100644 src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapVisitor.java delete mode 100644 src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapWriter.java delete mode 100644 src/test/groovy/net/fabricmc/loom/test/unit/LineMapTest.groovy diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index c855b71d6..285df7700 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -263,11 +263,11 @@ private synchronized void setupMinecraft(ConfigContext configContext) throws Exc namedMinecraftProvider.provide(provideContext); if (extension.isForge()) { - final SrgMinecraftProvider srgMinecraftProvider = jarConfiguration.getSrgMinecraftProviderBiFunction().apply(project, minecraftProvider); + final SrgMinecraftProvider srgMinecraftProvider = jarConfiguration.createSrgMinecraftProvider(project); extension.setSrgMinecraftProvider(srgMinecraftProvider); srgMinecraftProvider.provide(provideContext); } else if (extension.isNeoForge()) { - final MojangMappedMinecraftProvider mojangMappedMinecraftProvider = jarConfiguration.getMojangMappedMinecraftProviderBiFunction().apply(project, minecraftProvider); + final MojangMappedMinecraftProvider mojangMappedMinecraftProvider = jarConfiguration.createMojangMappedMinecraftProvider(project); extension.setMojangMappedMinecraftProvider(mojangMappedMinecraftProvider); mojangMappedMinecraftProvider.provide(provideContext); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/ForgeMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/ForgeMinecraftProvider.java index 9ad86a575..9c81f3911 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/ForgeMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/ForgeMinecraftProvider.java @@ -28,6 +28,7 @@ import net.fabricmc.loom.configuration.ConfigContext; import net.fabricmc.loom.configuration.providers.forge.MinecraftPatchedProvider; import net.fabricmc.loom.configuration.providers.minecraft.MergedMinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; import net.fabricmc.loom.configuration.providers.minecraft.SingleJarMinecraftProvider; /** @@ -37,15 +38,15 @@ public interface ForgeMinecraftProvider { MinecraftPatchedProvider getPatchedProvider(); - static MergedMinecraftProvider createMerged(ConfigContext context) { - return LoomGradleExtension.get(context.project()).isForgeLike() ? new MergedForgeMinecraftProvider(context) : new MergedMinecraftProvider(context); + static MergedMinecraftProvider createMerged(MinecraftMetadataProvider metadataProvider, ConfigContext context) { + return LoomGradleExtension.get(context.project()).isForgeLike() ? new MergedForgeMinecraftProvider(metadataProvider, context) : new MergedMinecraftProvider(metadataProvider, context); } - static SingleJarMinecraftProvider createServerOnly(ConfigContext context) { - return LoomGradleExtension.get(context.project()).isForgeLike() ? SingleJarForgeMinecraftProvider.server(context) : SingleJarMinecraftProvider.server(context); + static SingleJarMinecraftProvider createServerOnly(MinecraftMetadataProvider metadataProvider, ConfigContext context) { + return LoomGradleExtension.get(context.project()).isForgeLike() ? SingleJarForgeMinecraftProvider.forgeServer(metadataProvider, context) : SingleJarMinecraftProvider.server(metadataProvider, context); } - static SingleJarMinecraftProvider createClientOnly(ConfigContext context) { - return LoomGradleExtension.get(context.project()).isForgeLike() ? SingleJarForgeMinecraftProvider.client(context) : SingleJarMinecraftProvider.client(context); + static SingleJarMinecraftProvider createClientOnly(MinecraftMetadataProvider metadataProvider, ConfigContext context) { + return LoomGradleExtension.get(context.project()).isForgeLike() ? SingleJarForgeMinecraftProvider.forgeClient(metadataProvider, context) : SingleJarMinecraftProvider.client(metadataProvider, context); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/MergedForgeMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/MergedForgeMinecraftProvider.java index 04ca74c4a..362641a2e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/MergedForgeMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/MergedForgeMinecraftProvider.java @@ -31,12 +31,13 @@ import net.fabricmc.loom.configuration.ConfigContext; import net.fabricmc.loom.configuration.providers.forge.MinecraftPatchedProvider; import net.fabricmc.loom.configuration.providers.minecraft.MergedMinecraftProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; public final class MergedForgeMinecraftProvider extends MergedMinecraftProvider implements ForgeMinecraftProvider { private final MinecraftPatchedProvider patchedProvider; - public MergedForgeMinecraftProvider(ConfigContext configContext) { - super(configContext); + public MergedForgeMinecraftProvider(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + super(metadataProvider, configContext); this.patchedProvider = new MinecraftPatchedProvider(configContext.project(), this, MinecraftPatchedProvider.Type.MERGED); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/SingleJarForgeMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/SingleJarForgeMinecraftProvider.java index bdffd4ae1..0fc6d5175 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/SingleJarForgeMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/minecraft/SingleJarForgeMinecraftProvider.java @@ -27,49 +27,112 @@ import java.nio.file.Path; import java.util.List; +import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.ConfigContext; +import net.fabricmc.loom.configuration.providers.BundleMetadata; import net.fabricmc.loom.configuration.providers.forge.MinecraftPatchedProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; +import net.fabricmc.loom.configuration.providers.minecraft.SingleJarEnvType; import net.fabricmc.loom.configuration.providers.minecraft.SingleJarMinecraftProvider; -public final class SingleJarForgeMinecraftProvider extends SingleJarMinecraftProvider implements ForgeMinecraftProvider { +public abstract class SingleJarForgeMinecraftProvider extends SingleJarMinecraftProvider implements ForgeMinecraftProvider { private final MinecraftPatchedProvider patchedProvider; - - private SingleJarForgeMinecraftProvider(ConfigContext configContext, SingleJarMinecraftProvider.Environment environment) { - super(configContext, environment); + + private SingleJarForgeMinecraftProvider(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + super(metadataProvider, configContext, MappingsNamespace.OFFICIAL); this.patchedProvider = new MinecraftPatchedProvider(configContext.project(), this, provideServer() ? MinecraftPatchedProvider.Type.SERVER_ONLY : MinecraftPatchedProvider.Type.CLIENT_ONLY); } - - public static SingleJarForgeMinecraftProvider server(ConfigContext configContext) { - return new SingleJarForgeMinecraftProvider(configContext, new Server()); + + public static SingleJarForgeMinecraftProvider.Server forgeServer(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + return new SingleJarForgeMinecraftProvider.Server(metadataProvider, configContext); } - - public static SingleJarForgeMinecraftProvider client(ConfigContext configContext) { - return new SingleJarForgeMinecraftProvider(configContext, new Client()); + + public static SingleJarForgeMinecraftProvider.Client forgeClient(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + return new SingleJarForgeMinecraftProvider.Client(metadataProvider, configContext); } - + @Override protected boolean provideClient() { // the client jar is needed for client-extra which the Forge userdev launch thing always checks for return true; } - + @Override protected void processJar() throws Exception { // don't process the jar, it's created by the patched provider } - + @Override public MinecraftPatchedProvider getPatchedProvider() { return patchedProvider; } - + @Override public Path getMinecraftEnvOnlyJar() { return patchedProvider.getMinecraftPatchedJar(); } - + @Override public List getMinecraftJars() { return List.of(patchedProvider.getMinecraftPatchedJar()); } + + public static final class Server extends SingleJarForgeMinecraftProvider { + private Server(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + super(metadataProvider, configContext); + } + + @Override + public SingleJarEnvType type() { + return SingleJarEnvType.SERVER; + } + + @Override + public Path getInputJar(SingleJarMinecraftProvider provider) throws Exception { + BundleMetadata serverBundleMetadata = provider.getServerBundleMetadata(); + + if (serverBundleMetadata == null) { + return provider.getMinecraftServerJar().toPath(); + } + + provider.extractBundledServerJar(); + return provider.getMinecraftExtractedServerJar().toPath(); + } + + @Override + protected boolean provideServer() { + return true; + } + + @Override + protected boolean provideClient() { + return false; + } + } + + public static final class Client extends SingleJarForgeMinecraftProvider { + private Client(MinecraftMetadataProvider metadataProvider, ConfigContext configContext) { + super(metadataProvider, configContext); + } + + @Override + public SingleJarEnvType type() { + return SingleJarEnvType.CLIENT; + } + + @Override + public Path getInputJar(SingleJarMinecraftProvider provider) throws Exception { + return provider.getMinecraftClientJar().toPath(); + } + + @Override + protected boolean provideServer() { + return false; + } + + @Override + protected boolean provideClient() { + return true; + } + } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java index 2d10f377c..b704390eb 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftJarConfiguration.java @@ -49,6 +49,8 @@ public record MinecraftJarConfiguration< MinecraftProviderFactory minecraftProviderFactory, IntermediaryMinecraftProviderFactory intermediaryMinecraftProviderFactory, NamedMinecraftProviderFactory namedMinecraftProviderFactory, + SrgMinecraftProviderFactory srgMinecraftProviderFactory, + MojangMappedMinecraftProviderFactory mojangMappedMinecraftProviderFactory, ProcessedNamedMinecraftProviderFactory processedNamedMinecraftProviderFactory, DecompileConfigurationFactory decompileConfigurationFactory, List supportedEnvironments) { @@ -72,6 +74,8 @@ public record MinecraftJarConfiguration< LegacyMergedMinecraftProvider::new, IntermediaryMinecraftProvider.LegacyMergedImpl::new, NamedMinecraftProvider.LegacyMergedImpl::new, + SrgMinecraftProvider.LegacyMergedImpl::new, + MojangMappedMinecraftProvider.LegacyMergedImpl::new, ProcessedNamedMinecraftProvider.LegacyMergedImpl::new, SingleJarDecompileConfiguration::new, List.of("client", "server") @@ -128,6 +132,14 @@ public NamedMinecraftProvider createNamedMinecraftProvider(Project project) { return namedMinecraftProviderFactory.create(project, getMinecraftProvider(project)); } + public SrgMinecraftProvider createSrgMinecraftProvider(Project project) { + return srgMinecraftProviderFactory.create(project, getMinecraftProvider(project)); + } + + public MojangMappedMinecraftProvider createMojangMappedMinecraftProvider(Project project) { + return mojangMappedMinecraftProviderFactory.create(project, getMinecraftProvider(project)); + } + public ProcessedNamedMinecraftProvider createProcessedNamedMinecraftProvider(NamedMinecraftProvider namedMinecraftProvider, MinecraftJarProcessorManager jarProcessorManager) { return processedNamedMinecraftProviderFactory.create((N) namedMinecraftProvider, jarProcessorManager); } @@ -148,14 +160,6 @@ private Q getMappedMinecraftProvider(Project project) { return (Q) extension.getNamedMinecraftProvider(); } - public BiFunction> getSrgMinecraftProviderBiFunction() { - return srgMinecraftProviderBiFunction; - } - - public BiFunction> getMojangMappedMinecraftProviderBiFunction() { - return mojangMappedMinecraftProviderBiFunction; - } - public List getSupportedEnvironments() { return supportedEnvironments; } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java index 6276afa4d..2e69858a4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java @@ -77,7 +77,7 @@ protected boolean provideServer() { public void provide() throws Exception { if (getExtension().shouldGenerateSrgTiny() && !getExtension().isForgeLike()) { - getProject().getDependencies().add(Constants.Configurations.SRG, "de.oceanlabs.mcp:mcp_config:" + minecraftVersion); + getProject().getDependencies().add(Constants.Configurations.SRG, "de.oceanlabs.mcp:mcp_config:" + minecraftVersion()); } initFiles(); @@ -134,8 +134,8 @@ private void downloadJars() throws IOException { } } } - - protected final void extractBundledServerJar() throws IOException { + + public final void extractBundledServerJar() throws IOException { Preconditions.checkArgument(provideServer(), "Not configured to provide server jar"); Objects.requireNonNull(getServerBundleMetadata(), "Cannot bundled mc jar from none bundled server jar"); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java index aba9b57ab..d3e88b967 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/SingleJarMinecraftProvider.java @@ -36,7 +36,7 @@ import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; -public abstract sealed class SingleJarMinecraftProvider extends MinecraftProvider permits SingleJarMinecraftProvider.Server, SingleJarMinecraftProvider.Client { +public abstract class SingleJarMinecraftProvider extends MinecraftProvider { private final MappingsNamespace officialNamespace; private Path minecraftEnvOnlyJar; @@ -127,9 +127,9 @@ public MappingsNamespace getOfficialNamespace() { return officialNamespace; } - abstract SingleJarEnvType type(); - - abstract Path getInputJar(SingleJarMinecraftProvider provider) throws Exception; + protected abstract SingleJarEnvType type(); + + protected abstract Path getInputJar(SingleJarMinecraftProvider provider) throws Exception; public static final class Server extends SingleJarMinecraftProvider { private Server(MinecraftMetadataProvider metadataProvider, ConfigContext configContext, MappingsNamespace officialNamespace) { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/MojangMappedMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/MojangMappedMinecraftProvider.java index 07e91db4a..22c03edcb 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/MojangMappedMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/MojangMappedMinecraftProvider.java @@ -26,6 +26,8 @@ import java.util.List; +import net.fabricmc.loom.configuration.providers.minecraft.LegacyMergedMinecraftProvider; + import org.gradle.api.Project; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; @@ -37,7 +39,7 @@ import net.fabricmc.loom.util.SidedClassVisitor; import net.fabricmc.tinyremapper.TinyRemapper; -public abstract sealed class MojangMappedMinecraftProvider extends AbstractMappedMinecraftProvider permits MojangMappedMinecraftProvider.MergedImpl, MojangMappedMinecraftProvider.SingleJarImpl, MojangMappedMinecraftProvider.SplitImpl { +public abstract sealed class MojangMappedMinecraftProvider extends AbstractMappedMinecraftProvider permits MojangMappedMinecraftProvider.MergedImpl, MojangMappedMinecraftProvider.LegacyMergedImpl, MojangMappedMinecraftProvider.SingleJarImpl, MojangMappedMinecraftProvider.SplitImpl { public MojangMappedMinecraftProvider(Project project, M minecraftProvider) { super(project, minecraftProvider); } @@ -65,6 +67,18 @@ public List getRemappedJars() { } } + public static final class LegacyMergedImpl extends MojangMappedMinecraftProvider implements Merged { + public LegacyMergedImpl(Project project, LegacyMergedMinecraftProvider minecraftProvider) { + super(project, minecraftProvider); + } + + @Override + public List getRemappedJars() { + // The delegate providers will handle the remapping + throw new UnsupportedOperationException("LegacyMergedImpl does not support getRemappedJars"); + } + } + public static final class SplitImpl extends MojangMappedMinecraftProvider implements Split { public SplitImpl(Project project, SplitMinecraftProvider minecraftProvider) { super(project, minecraftProvider); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/SrgMinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/SrgMinecraftProvider.java index d88e5fb7e..44e2cab66 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/SrgMinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/mapped/SrgMinecraftProvider.java @@ -26,6 +26,8 @@ import java.util.List; +import net.fabricmc.loom.configuration.providers.minecraft.LegacyMergedMinecraftProvider; + import org.gradle.api.Project; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; @@ -37,7 +39,7 @@ import net.fabricmc.loom.util.SidedClassVisitor; import net.fabricmc.tinyremapper.TinyRemapper; -public abstract sealed class SrgMinecraftProvider extends AbstractMappedMinecraftProvider permits SrgMinecraftProvider.MergedImpl, SrgMinecraftProvider.SingleJarImpl, SrgMinecraftProvider.SplitImpl { +public abstract sealed class SrgMinecraftProvider extends AbstractMappedMinecraftProvider permits SrgMinecraftProvider.MergedImpl, SrgMinecraftProvider.LegacyMergedImpl, SrgMinecraftProvider.SingleJarImpl, SrgMinecraftProvider.SplitImpl { public SrgMinecraftProvider(Project project, M minecraftProvider) { super(project, minecraftProvider); } @@ -65,6 +67,18 @@ public List getRemappedJars() { } } + public static final class LegacyMergedImpl extends SrgMinecraftProvider implements Merged { + public LegacyMergedImpl(Project project, LegacyMergedMinecraftProvider minecraftProvider) { + super(project, minecraftProvider); + } + + @Override + public List getRemappedJars() { + // The delegate providers will handle the remapping + throw new UnsupportedOperationException("LegacyMergedImpl does not support getRemappedJars"); + } + } + public static final class SplitImpl extends SrgMinecraftProvider implements Split { public SplitImpl(Project project, SplitMinecraftProvider minecraftProvider) { super(project, minecraftProvider); diff --git a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java index 2715a635a..9f276f36a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java +++ b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java @@ -80,7 +80,7 @@ public static void addBaseForgeSources(Project project) throws IOException { minecraftJar = minecraftJars.get(0); } - Path sourcesJar = GenerateSourcesTask.getMappedJarFileWithSuffix("-sources.jar", minecraftJar).toPath(); + Path sourcesJar = GenerateSourcesTask.getJarFileWithSuffix("-sources.jar", minecraftJar).toPath(); if (!Files.exists(sourcesJar)) { try (var serviceManager = new ScopedSharedServiceManager()) { diff --git a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapClassFilter.java b/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapClassFilter.java deleted file mode 100644 index f0c894f25..000000000 --- a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapClassFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.decompilers.linemap; - -import java.io.IOException; -import java.util.function.Predicate; - -import org.jetbrains.annotations.Nullable; - -/** - * A line map visitor that filters entries based on the class name. - * - *

If the {@code filter} returns false for class, its declaration and - * all contained line entries will be skipped. - * - * @author Juuz - */ -public final class LineMapClassFilter extends LineMapVisitor { - private final Predicate filter; - private boolean active = true; - - public LineMapClassFilter(@Nullable LineMapVisitor next, Predicate filter) { - super(next); - this.filter = filter; - } - - @Override - public void visitClass(String name, int max, int maxDest) throws IOException { - active = filter.test(name); - - if (active) { - super.visitClass(name, max, maxDest); - } - } - - @Override - public void visitLine(int src, int dest) throws IOException { - if (active) { - super.visitLine(src, dest); - } - } -} diff --git a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapReader.java b/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapReader.java deleted file mode 100644 index 2b9f5b039..000000000 --- a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapReader.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.decompilers.linemap; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.IOException; - -/** - * A reader for line map files that in the format of {@link net.fabricmc.loom.decompilers.LineNumberRemapper}. - * {@linkplain #accept Accepts} a {@link LineMapVisitor} that processes the contents. - * - * @author Juuz - */ -public final class LineMapReader implements Closeable { - private final BufferedReader reader; - - public LineMapReader(BufferedReader reader) { - this.reader = reader; - } - - public void accept(LineMapVisitor visitor) throws IOException { - String line; - - while ((line = reader.readLine()) != null) { - if (line.isBlank()) continue; - - String[] parts = line.trim().split("\t"); - - try { - if (!line.startsWith("\t")) { - visitor.visitClass(parts[0], Integer.parseInt(parts[1]), Integer.parseInt(parts[2])); - } else { - visitor.visitLine(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); - } - } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { - throw new RuntimeException("Could not parse line: " + line, e); - } - } - } - - @Override - public void close() throws IOException { - reader.close(); - } -} diff --git a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapVisitor.java b/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapVisitor.java deleted file mode 100644 index a32abc884..000000000 --- a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapVisitor.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.decompilers.linemap; - -import java.io.IOException; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.function.UnaryOperator; - -import org.jetbrains.annotations.Nullable; - -/** - * A visitor for line mapping files that can be read with {@link net.fabricmc.loom.decompilers.LineNumberRemapper}. - * - *

Delegates by default to a {@code next} visitor if it's not null, like ASM's {@code ClassVisitor}. - * - * @author Juuz - */ -public abstract class LineMapVisitor { - private final LineMapVisitor next; - - public LineMapVisitor(@Nullable LineMapVisitor next) { - this.next = next; - } - - /** - * Visits a class declaration. - * - * @param name the internal class name (e.g. {@code a/b/C$Nested}) - * @param max the original maximum line number in the class - * @param maxDest the new maximum line number in the class - */ - public void visitClass(String name, int max, int maxDest) throws IOException { - if (next != null) { - next.visitClass(name, max, maxDest); - } - } - - /** - * Visits a line in the {@linkplain #visitClass previously visited class}. - * - * @param src the original line number - * @param dest the mapped line number - */ - public void visitLine(int src, int dest) throws IOException { - if (next != null) { - next.visitLine(src, dest); - } - } - - /** - * Processes a line mapping file using an arbitrary visitor. - * - * @param path the path to the line mapping file - * @param visitorFactory a factory that creates a "filtering" line map visitor - */ - public static void process(Path path, UnaryOperator visitorFactory) throws IOException { - StringWriter sw = new StringWriter(); - LineMapWriter writer = new LineMapWriter(sw); - LineMapVisitor visitor = visitorFactory.apply(writer); - - try (LineMapReader reader = new LineMapReader(Files.newBufferedReader(path, StandardCharsets.UTF_8))) { - reader.accept(visitor); - } - - Files.writeString(path, sw.toString(), StandardCharsets.UTF_8); - } -} diff --git a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapWriter.java b/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapWriter.java deleted file mode 100644 index bb455e78c..000000000 --- a/src/main/java/net/fabricmc/loom/decompilers/linemap/LineMapWriter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.decompilers.linemap; - -import java.io.Closeable; -import java.io.IOException; -import java.io.Writer; - -/** - * A writer for line maps in the format of {@link net.fabricmc.loom.decompilers.LineNumberRemapper}. - * - * @author Juuz - */ -public final class LineMapWriter extends LineMapVisitor implements Closeable { - private final Writer writer; - - public LineMapWriter(Writer writer) { - super(null); - this.writer = writer; - } - - @Override - public void visitClass(String name, int max, int maxDest) throws IOException { - writer.append(name) - .append('\t').append(Integer.toString(max)) - .append('\t').append(Integer.toString(maxDest)) - .append('\n'); - } - - @Override - public void visitLine(int src, int dest) throws IOException { - writer.append('\t').append(Integer.toString(src)) - .append('\t').append(Integer.toString(dest)) - .append('\n'); - } - - @Override - public void close() throws IOException { - writer.close(); - } -} diff --git a/src/main/java/net/fabricmc/loom/task/GenerateForgePatchedSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateForgePatchedSourcesTask.java index a7008464e..8bec39fe6 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateForgePatchedSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateForgePatchedSourcesTask.java @@ -82,7 +82,7 @@ public abstract class GenerateForgePatchedSourcesTask extends AbstractLoomTask { public GenerateForgePatchedSourcesTask() { getOutputs().upToDateWhen((o) -> false); - getOutputJar().fileProvider(getProject().provider(() -> GenerateSourcesTask.getMappedJarFileWithSuffix(getRuntimeJar(), "-sources.jar"))); + getOutputJar().fileProvider(getProject().provider(() -> GenerateSourcesTask.getJarFileWithSuffix(getRuntimeJar(), "-sources.jar"))); } @TaskAction diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 6071cad4e..da508638f 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -93,8 +94,6 @@ import net.fabricmc.loom.decompilers.cache.CachedData; import net.fabricmc.loom.decompilers.cache.CachedFileStoreImpl; import net.fabricmc.loom.decompilers.cache.CachedJarProcessor; -import net.fabricmc.loom.decompilers.linemap.LineMapClassFilter; -import net.fabricmc.loom.decompilers.linemap.LineMapVisitor; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.ExceptionUtil; @@ -390,6 +389,14 @@ private ClassLineNumbers runDecompileJob(Path inputJar, Path outputJar, @Nullabl getProject().getLogger().warn("Decompile worker logging disabled as Unix Domain Sockets is not supported on your operating system."); doWork(null, inputJar, outputJar, lineMapFile, existingJar); + + // Inject Forge's own sources + if (getExtension().isForgeLike()) { + try (var serviceManager = new ScopedSharedServiceManager()) { + ForgeSourcesRemapper.addForgeSources(getProject(), serviceManager, outputJar); + } + } + return readLineNumbers(lineMapFile); } @@ -409,7 +416,7 @@ private ClassLineNumbers runDecompileJob(Path inputJar, Path outputJar, @Nullabl // Inject Forge's own sources if (getExtension().isForgeLike()) { try (var serviceManager = new ScopedSharedServiceManager()) { - ForgeSourcesRemapper.addForgeSources(getProject(), serviceManager, getOutputJar().get().getAsFile().toPath()); + ForgeSourcesRemapper.addForgeSources(getProject(), serviceManager, outputJar); } } @@ -422,17 +429,19 @@ private ClassLineNumbers filterForgeLineNumbers(@Nullable ClassLineNumbers lineN return null; } - if (getParameters().getForge().get()) { - try { - // Remove Forge and NeoForge classes from linemap - // TODO: We should instead not decompile Forge's classes at all - LineMapVisitor.process(linemap, next -> new LineMapClassFilter(next, name -> { - // Skip both Forge and NeoForge classes. - return !name.startsWith("net/minecraftforge/") && !name.startsWith("net/neoforged/"); - })); - } catch (IOException e) { - throw new UncheckedIOException("Failed to process linemap", e); + if (getExtension().isForgeLike()) { + // Remove Forge and NeoForge classes from linemap + // TODO: We should instead not decompile Forge's classes at all + var lineMap = new HashMap(); + for (Map.Entry entry : lineNumbers.lineMap().entrySet()) { + String name = entry.getKey(); + if (!name.startsWith("net/minecraftforge/") && !name.startsWith("net/neoforged/")) { + lineMap.put(name, entry.getValue()); + } } + return new ClassLineNumbers(lineMap); + } else { + return lineNumbers; } } @@ -672,10 +681,6 @@ static Collection toPaths(FileCollection files) { } } - static File getMappedJarFileWithSuffix(RegularFileProperty runtimeJar, String suffix) { - return getMappedJarFileWithSuffix(suffix, runtimeJar.get().getAsFile().toPath()); - } - private Path getMappings() { Path inputMappings = getExtension().getPlatformMappingFile(); @@ -744,6 +749,10 @@ public static File getJarFileWithSuffix(String suffix, Path runtimeJar) { return new File(path.substring(0, path.length() - 4) + suffix); } + static File getJarFileWithSuffix(RegularFileProperty runtimeJar, String suffix) { + return getJarFileWithSuffix(suffix, runtimeJar.get().getAsFile().toPath()); + } + @Nullable private static ClassLineNumbers readLineNumbers(Path linemapFile) throws IOException { if (Files.notExists(linemapFile)) { diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/LineMapTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/LineMapTest.groovy deleted file mode 100644 index 08fd08efc..000000000 --- a/src/test/groovy/net/fabricmc/loom/test/unit/LineMapTest.groovy +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2022 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.test.unit - -import spock.lang.Specification - -import net.fabricmc.loom.decompilers.linemap.LineMapClassFilter -import net.fabricmc.loom.decompilers.linemap.LineMapReader -import net.fabricmc.loom.decompilers.linemap.LineMapWriter - -class LineMapTest extends Specification { - LineMapReader reader = new LineMapReader(LineMapTest.getResourceAsStream('/linemap/input.lmap').newReader('UTF-8')) - - private String readExpected(String name) { - return LineMapTest.getResourceAsStream("/linemap/${name}.lmap") - .getText('UTF-8') - .replace('\r\n', '\n') - } - - def "roundtrip"() { - when: - def sw = new StringWriter() - reader.accept(new LineMapWriter(sw)) - reader.close() - then: - sw.toString() == readExpected('simpleOutput') - } - - def "filter"() { - when: - def sw = new StringWriter() - def writer = new LineMapWriter(sw) - reader.accept(new LineMapClassFilter(writer, { it.startsWith('test/nested/') })) - reader.close() - then: - sw.toString() == readExpected('filteredOutput') - } -}