From 5f379e4f426951d55f0ac4889c5207f80afcf86c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 1 Nov 2021 13:43:03 +0000 Subject: Make CFR the default decompiler (#527) * Make CFR the default decompiler Expose decompiler options * Remove convention, default value is an empty map. * Checkstyle.. --- .../api/decompilers/DecompilationMetadata.java | 3 +- .../loom/decompilers/cfr/LoomCFRDecompiler.java | 8 ++++-- .../fernflower/FabricFernFlowerDecompiler.java | 23 +++++++++------ .../fabricmc/loom/task/GenerateSourcesTask.java | 12 +++++++- .../java/net/fabricmc/loom/task/LoomTasks.java | 33 ++++++++++++++-------- 5 files changed, 55 insertions(+), 24 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/net/fabricmc/loom/api/decompilers/DecompilationMetadata.java b/src/main/java/net/fabricmc/loom/api/decompilers/DecompilationMetadata.java index a4f6dcfa..191a045b 100644 --- a/src/main/java/net/fabricmc/loom/api/decompilers/DecompilationMetadata.java +++ b/src/main/java/net/fabricmc/loom/api/decompilers/DecompilationMetadata.java @@ -26,8 +26,9 @@ package net.fabricmc.loom.api.decompilers; import java.nio.file.Path; import java.util.Collection; +import java.util.Map; import net.fabricmc.loom.util.IOStringConsumer; -public record DecompilationMetadata(int numberOfThreads, Path javaDocs, Collection libraries, IOStringConsumer logger) { +public record DecompilationMetadata(int numberOfThreads, Path javaDocs, Collection libraries, IOStringConsumer logger, Map options) { } diff --git a/src/main/java/net/fabricmc/loom/decompilers/cfr/LoomCFRDecompiler.java b/src/main/java/net/fabricmc/loom/decompilers/cfr/LoomCFRDecompiler.java index bbfb0be2..cb715139 100644 --- a/src/main/java/net/fabricmc/loom/decompilers/cfr/LoomCFRDecompiler.java +++ b/src/main/java/net/fabricmc/loom/decompilers/cfr/LoomCFRDecompiler.java @@ -32,6 +32,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; @@ -64,7 +65,10 @@ public class LoomCFRDecompiler implements LoomDecompiler { @Override public void decompile(Path compiledJar, Path sourcesDestination, Path linemapDestination, DecompilationMetadata metaData) { final String path = compiledJar.toAbsolutePath().toString(); - final Options options = OptionsImpl.getFactory().create(DECOMPILE_OPTIONS); + final Map allOptions = new HashMap<>(DECOMPILE_OPTIONS); + allOptions.putAll(metaData.options()); + + final Options options = OptionsImpl.getFactory().create(allOptions); ClassFileSourceImpl classFileSource = new ClassFileSourceImpl(options); @@ -138,7 +142,7 @@ public class LoomCFRDecompiler implements LoomDecompiler { decompiler.decompile(Paths.get("input.jar"), Paths.get("output-sources.jar"), lineMap, - new DecompilationMetadata(4, null, Collections.emptyList(), null) + new DecompilationMetadata(4, null, Collections.emptyList(), null, Collections.emptyMap()) ); LineNumberRemapper lineNumberRemapper = new LineNumberRemapper(); diff --git a/src/main/java/net/fabricmc/loom/decompilers/fernflower/FabricFernFlowerDecompiler.java b/src/main/java/net/fabricmc/loom/decompilers/fernflower/FabricFernFlowerDecompiler.java index c3009448..9ad8111e 100644 --- a/src/main/java/net/fabricmc/loom/decompilers/fernflower/FabricFernFlowerDecompiler.java +++ b/src/main/java/net/fabricmc/loom/decompilers/fernflower/FabricFernFlowerDecompiler.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.decompilers.fernflower; import java.nio.file.Path; +import java.util.HashMap; import java.util.Map; import org.jetbrains.java.decompiler.main.Fernflower; @@ -38,21 +39,25 @@ import net.fabricmc.loom.api.decompilers.LoomDecompiler; public final class FabricFernFlowerDecompiler implements LoomDecompiler { @Override public String name() { - return "FabricFlower"; // Or something else? + return "FernFlower"; } @Override public void decompile(Path compiledJar, Path sourcesDestination, Path linemapDestination, DecompilationMetadata metaData) { - Map options = Map.of( - IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1", - IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1", - IFernflowerPreferences.REMOVE_SYNTHETIC, "1", - IFernflowerPreferences.LOG_LEVEL, "trace", - IFernflowerPreferences.THREADS, String.valueOf(metaData.numberOfThreads()), - IFernflowerPreferences.INDENT_STRING, "\t", - IFabricJavadocProvider.PROPERTY_NAME, new TinyJavadocProvider(metaData.javaDocs().toFile()) + final Map options = new HashMap<>( + Map.of( + IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES, "1", + IFernflowerPreferences.BYTECODE_SOURCE_MAPPING, "1", + IFernflowerPreferences.REMOVE_SYNTHETIC, "1", + IFernflowerPreferences.LOG_LEVEL, "trace", + IFernflowerPreferences.THREADS, String.valueOf(metaData.numberOfThreads()), + IFernflowerPreferences.INDENT_STRING, "\t", + IFabricJavadocProvider.PROPERTY_NAME, new TinyJavadocProvider(metaData.javaDocs().toFile()) + ) ); + options.putAll(metaData.options()); + IResultSaver saver = new ThreadSafeResultSaver(sourcesDestination::toFile, linemapDestination::toFile); Fernflower ff = new Fernflower(FernFlowerUtils::getBytecode, saver, options, new FernflowerLogger(metaData.logger())); diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index c8057ff1..9a127d86 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -43,6 +43,7 @@ import javax.inject.Inject; import org.gradle.api.file.ConfigurableFileCollection; 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; @@ -83,6 +84,9 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { @Input public abstract Property getMaxMemory(); + @Input + public abstract MapProperty getOptions(); + @Inject public abstract WorkerExecutor getWorkerExecutor(); @@ -98,6 +102,7 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { getOutputs().upToDateWhen((o) -> false); getMaxMemory().convention(4096L).finalizeValueOnRead(); + getOptions().finalizeValueOnRead(); } @TaskAction @@ -134,6 +139,8 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { workQueue.submit(DecompileAction.class, params -> { params.getDecompilerClass().set(decompiler.getClass().getCanonicalName()); + params.getOptions().set(getOptions()); + params.getInputJar().set(getInputJar()); params.getRuntimeJar().set(getExtension().getMappingsProvider().mappedProvider.getMappedJar()); params.getSourcesDestinationJar().set(getMappedJarFileWithSuffix("-sources.jar")); @@ -182,6 +189,8 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { public interface DecompileParams extends WorkParameters { Property getDecompilerClass(); + MapProperty getOptions(); + RegularFileProperty getInputJar(); RegularFileProperty getRuntimeJar(); RegularFileProperty getSourcesDestinationJar(); @@ -231,7 +240,8 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { Runtime.getRuntime().availableProcessors(), getParameters().getMappings().get().getAsFile().toPath(), getLibraries(), - logger + logger, + getParameters().getOptions().get() ); decompiler.decompile( diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index 8847741e..e914046f 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -34,7 +34,6 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.decompilers.LoomDecompiler; import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; -import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; import net.fabricmc.loom.util.Constants; public final class LoomTasks { @@ -129,7 +128,7 @@ public final class LoomTasks { return; } - File inputJar = mappingsProvider.mappedProvider.getMappedJar(); + File mappedJar = mappingsProvider.mappedProvider.getMappedJar(); if (mappingsProvider.hasUnpickDefinitions()) { File outputJar = mappingsProvider.mappedProvider.getUnpickedJar(); @@ -140,21 +139,33 @@ public final class LoomTasks { unpickJarTask.getOutputJar().set(outputJar); }); - inputJar = outputJar; + mappedJar = outputJar; } + final File inputJar = mappedJar; + extension.getGameDecompilers().finalizeValue(); for (LoomDecompiler decompiler : extension.getGameDecompilers().get()) { - String taskName = decompiler instanceof FabricFernFlowerDecompiler ? "genSources" : "genSourcesWith" + decompiler.name(); - // decompiler will be passed to the constructor of GenerateSourcesTask - GenerateSourcesTask generateSourcesTask = tasks.register(taskName, GenerateSourcesTask.class, decompiler).get(); - generateSourcesTask.getInputJar().set(inputJar); - - if (mappingsProvider.hasUnpickDefinitions()) { - generateSourcesTask.dependsOn(tasks.getByName("unpickJar")); - } + String taskName = "genSourcesWith" + decompiler.name(); + // Decompiler will be passed to the constructor of GenerateSourcesTask + tasks.register(taskName, GenerateSourcesTask.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")); + } + }); } + + tasks.register("genSources", task -> { + task.setDescription("Decompile minecraft using the default decompiler."); + task.setGroup(Constants.TaskGroup.FABRIC); + + task.dependsOn(project.getTasks().getByName("genSourcesWithCfr")); + }); }); } } -- cgit From a91b75c05c686e447d7c7614a918a682cc0b9d60 Mon Sep 17 00:00:00 2001 From: Cat Core <34719527+arthurbambou@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:47:28 +0100 Subject: Allow to set custom intermediary url again (#528) * allow to set custom intermediary url again * apply suggestions * add some javadoc --- src/main/java/net/fabricmc/loom/LoomGradleExtension.java | 3 +-- src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java | 7 +++++++ .../net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java | 8 ++++++++ .../net/fabricmc/loom/extension/MinecraftGradleExtension.java | 6 ++++++ 4 files changed, 22 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index e9624aa0..060a094b 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -99,8 +99,7 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { } default String getIntermediaryUrl(String minecraftVersion) { - // TODO reimplement a way to change this, was never really supported api anyway - return String.format("https://maven.fabricmc.net/net/fabricmc/intermediary/%1$s/intermediary-%1$s-v2.jar", minecraftVersion); + return String.format(this.getIntermediaryUrl().get(), minecraftVersion); } @Override diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index 4020ecdc..2fd46276 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -211,4 +211,11 @@ public interface LoomGradleExtensionAPI { * @return the property controlling the transitive access wideners */ Property getEnableTransitiveAccessWideners(); + + /** + * Use "%1$s" as a placeholder for the minecraft version. + * + * @return the intermediary url template + */ + Property getIntermediaryUrl(); } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 4e7c9f3d..f833e52e 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -61,6 +61,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected final Property customManifest; protected final Property setupRemappedVariants; protected final Property transitiveAccessWideners; + protected final Property intermediary; private final ModVersionParser versionParser; @@ -85,6 +86,8 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.transitiveAccessWideners = project.getObjects().property(Boolean.class) .convention(true); this.transitiveAccessWideners.finalizeValueOnRead(); + this.intermediary = project.getObjects().property(String.class) + .convention("https://maven.fabricmc.net/net/fabricmc/intermediary/%1$s/intermediary-%1$s-v2.jar"); this.versionParser = new ModVersionParser(project); @@ -173,6 +176,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected abstract LoomFiles getFiles(); + @Override + public Property getIntermediaryUrl() { + return intermediary; + } + @Override public void disableDeprecatedPomGeneration(MavenPublication publication) { net.fabricmc.loom.configuration.MavenPublication.excludePublication(publication); diff --git a/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java b/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java index 4d1e3952..4ffea879 100644 --- a/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/extension/MinecraftGradleExtension.java @@ -156,4 +156,10 @@ public class MinecraftGradleExtension implements LoomGradleExtensionAPI { reportDeprecation(); throw new UnsupportedOperationException(); } + + @Override + public Property getIntermediaryUrl() { + reportDeprecation(); + return parent.getIntermediaryUrl(); + } } -- cgit From cb5c009e1a8978f86e1ce0a0f872ddc20686ae6d Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 1 Nov 2021 18:30:42 +0000 Subject: Fix missing blank line between javadoc and params --- .../loom/decompilers/cfr/CFRObfuscationMapping.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/net/fabricmc/loom/decompilers/cfr/CFRObfuscationMapping.java b/src/main/java/net/fabricmc/loom/decompilers/cfr/CFRObfuscationMapping.java index c8baa2a7..aae26019 100644 --- a/src/main/java/net/fabricmc/loom/decompilers/cfr/CFRObfuscationMapping.java +++ b/src/main/java/net/fabricmc/loom/decompilers/cfr/CFRObfuscationMapping.java @@ -30,6 +30,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.LinkedList; import java.util.List; @@ -126,6 +127,10 @@ public class CFRObfuscationMapping extends NullMapping { } } + if (comment != null && !recordComponentDocs.isEmpty()) { + print(" * "); + } + for (String componentDoc : recordComponentDocs) { print(" * ").print(componentDoc).newln(); } @@ -154,13 +159,23 @@ public class CFRObfuscationMapping extends NullMapping { lines.addAll(Arrays.asList(comment.split("\\R"))); } - for (MappingTree.MethodArgMapping arg : mapping.getArgs()) { + final Collection methodArgs = mapping.getArgs(); + final List params = new ArrayList<>(); + + for (MappingTree.MethodArgMapping arg : methodArgs) { String argComment = arg.getComment(); if (argComment != null) { - lines.addAll(Arrays.asList(("@param " + arg.getSrcName() + " " + argComment).split("\\R"))); + params.addAll(Arrays.asList(("@param " + arg.getSrcName() + " " + argComment).split("\\R"))); } } + + // Add a blank line between params and the comment. + if (!lines.isEmpty() && !params.isEmpty()) { + lines.add(""); + } + + lines.addAll(params); } if (!lines.isEmpty()) { -- cgit