diff options
author | modmuss50 <modmuss50@gmail.com> | 2021-03-25 19:03:35 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-25 19:03:35 +0000 |
commit | 759cac2e6b0f9b8ecfc707472b27985e0591adb8 (patch) | |
tree | ca31167905638e09a55334018ddbdac74f560f1a /src/main/java/net/fabricmc/loom/task | |
parent | 43a6b0f65fa468b57a63795c62ce4f48e05b7eb2 (diff) | |
download | architectury-loom-759cac2e6b0f9b8ecfc707472b27985e0591adb8.tar.gz architectury-loom-759cac2e6b0f9b8ecfc707472b27985e0591adb8.tar.bz2 architectury-loom-759cac2e6b0f9b8ecfc707472b27985e0591adb8.zip |
Constant unpicking (#328)
* Start adding constant unpicking
* Update to use unpick cli
* Fix build?
* Fix?
* Fix log spam when unpicking
* Improve unpick tests
Diffstat (limited to 'src/main/java/net/fabricmc/loom/task')
3 files changed, 168 insertions, 14 deletions
diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 7c5862e4..25d6fe47 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -35,6 +35,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; +import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; import net.fabricmc.loom.LoomGradleExtension; @@ -49,6 +50,8 @@ import net.fabricmc.stitch.util.StitchUtil; public class GenerateSourcesTask extends AbstractLoomTask { public final LoomDecompiler decompiler; + private File inputJar; + @Inject public GenerateSourcesTask(LoomDecompiler decompiler) { this.decompiler = decompiler; @@ -65,26 +68,18 @@ public class GenerateSourcesTask extends AbstractLoomTask { .stream().map(File::toPath).collect(Collectors.toSet()); DecompilationMetadata metadata = new DecompilationMetadata(threads, javaDocs, libraries); - Path compiledJar = getExtension().getMappingsProvider().mappedProvider.getMappedJar().toPath(); + Path runtimeJar = getExtension().getMappingsProvider().mappedProvider.getMappedJar().toPath(); Path sourcesDestination = getMappedJarFileWithSuffix("-sources.jar").toPath(); Path linemap = getMappedJarFileWithSuffix("-sources.lmap").toPath(); - decompiler.decompile(compiledJar, sourcesDestination, linemap, metadata); + decompiler.decompile(inputJar.toPath(), sourcesDestination, linemap, metadata); if (Files.exists(linemap)) { Path linemappedJarDestination = getMappedJarFileWithSuffix("-linemapped.jar").toPath(); - remapLineNumbers(compiledJar, linemap, linemappedJarDestination); - - // In order for IDEs to recognize the new line mappings, we need to overwrite the existing compiled jar - // with the linemapped one. In the name of not destroying the existing jar, we will copy it to somewhere else. - Path unlinemappedJar = getMappedJarFileWithSuffix("-unlinemapped.jar").toPath(); + // Line map the actually jar used to run the game, not the one used to decompile + remapLineNumbers(runtimeJar, linemap, linemappedJarDestination); - // The second time genSources is ran, we want to keep the existing unlinemapped jar. - if (!Files.exists(unlinemappedJar)) { - Files.copy(compiledJar, unlinemappedJar); - } - - Files.copy(linemappedJarDestination, compiledJar, StandardCopyOption.REPLACE_EXISTING); + Files.copy(linemappedJarDestination, runtimeJar, StandardCopyOption.REPLACE_EXISTING); Files.delete(linemappedJarDestination); } } @@ -117,4 +112,14 @@ public class GenerateSourcesTask extends AbstractLoomTask { return new File(path.substring(0, path.length() - 4) + suffix); } + + @InputFile + public File getInputJar() { + return inputJar; + } + + public GenerateSourcesTask setInputJar(File inputJar) { + this.inputJar = inputJar; + return this; + } } diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index 198f92e6..1b1de6a7 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -24,6 +24,8 @@ package net.fabricmc.loom.task; +import java.io.File; + import com.google.common.base.Preconditions; import org.gradle.api.Project; import org.gradle.api.tasks.TaskContainer; @@ -31,6 +33,7 @@ import org.gradle.api.tasks.TaskContainer; 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.MappingsProvider; import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; public final class LoomTasks { @@ -110,10 +113,30 @@ public final class LoomTasks { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); project.afterEvaluate(p -> { + MappingsProvider mappingsProvider = extension.getMappingsProvider(); + File inputJar = mappingsProvider.mappedProvider.getMappedJar(); + + if (mappingsProvider.hasUnpickDefinitions()) { + File outputJar = mappingsProvider.mappedProvider.getUnpickedJar(); + + tasks.register("unpickJar", UnpickJarTask.class, unpickJarTask -> { + unpickJarTask.setUnpickDefinition(mappingsProvider.getUnpickDefinitionsFile()); + unpickJarTask.setInputJar(mappingsProvider.mappedProvider.getMappedJar()); + unpickJarTask.setOutputJar(outputJar); + }); + + inputJar = outputJar; + } + for (LoomDecompiler decompiler : extension.getDecompilers()) { String taskName = decompiler instanceof FabricFernFlowerDecompiler ? "genSources" : "genSourcesWith" + decompiler.name(); // decompiler will be passed to the constructor of GenerateSourcesTask - tasks.register(taskName, GenerateSourcesTask.class, decompiler); + GenerateSourcesTask generateSourcesTask = tasks.register(taskName, GenerateSourcesTask.class, decompiler).get(); + generateSourcesTask.setInputJar(inputJar); + + if (mappingsProvider.hasUnpickDefinitions()) { + generateSourcesTask.dependsOn(tasks.getByName("unpickJar")); + } } }); } diff --git a/src/main/java/net/fabricmc/loom/task/UnpickJarTask.java b/src/main/java/net/fabricmc/loom/task/UnpickJarTask.java new file mode 100644 index 00000000..e27d2ff2 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/UnpickJarTask.java @@ -0,0 +1,126 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 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.task; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; + +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.OutputFile; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.providers.LaunchProvider; +import net.fabricmc.loom.util.Constants; + +public class UnpickJarTask extends JavaExec { + File inputJar; + File unpickDefinition; + + File outputJar; + + public UnpickJarTask() { + getOutputs().upToDateWhen(e -> false); + classpath(getProject().getConfigurations().getByName(Constants.Configurations.UNPICK_CLASSPATH)); + setMain("daomephsta.unpick.cli.Main"); + } + + @Override + public void exec() { + fileArg(getInputJar(), getOutputJar(), getUnpickDefinition()); + fileArg(getConstantJar()); + + // Classpath + fileArg(getExtension().getMinecraftMappedProvider().getMappedJar()); + fileArg(getMinecraftDependencies()); + + writeUnpickLogConfig(); + systemProperty("java.util.logging.config.file", getExtension().getUnpickLoggingConfigFile().getAbsolutePath()); + + super.exec(); + } + + private void writeUnpickLogConfig() { + try (InputStream is = LaunchProvider.class.getClassLoader().getResourceAsStream("unpick-logging.properties")) { + Files.deleteIfExists(getExtension().getUnpickLoggingConfigFile().toPath()); + Files.copy(is, getExtension().getUnpickLoggingConfigFile().toPath()); + } catch (IOException e) { + throw new RuntimeException("Failed to copy unpick logging config", e); + } + } + + private File[] getMinecraftDependencies() { + return getProject().getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES) + .resolve().toArray(new File[0]); + } + + private File getConstantJar() { + return getProject().getConfigurations().getByName(Constants.Configurations.MAPPING_CONSTANTS).getSingleFile(); + } + + @InputFile + public File getInputJar() { + return inputJar; + } + + public UnpickJarTask setInputJar(File inputJar) { + this.inputJar = inputJar; + return this; + } + + @InputFile + public File getUnpickDefinition() { + return unpickDefinition; + } + + public UnpickJarTask setUnpickDefinition(File unpickDefinition) { + this.unpickDefinition = unpickDefinition; + return this; + } + + @OutputFile + public File getOutputJar() { + return outputJar; + } + + public UnpickJarTask setOutputJar(File outputJar) { + this.outputJar = outputJar; + return this; + } + + private void fileArg(File... files) { + for (File file : files) { + args(file.getAbsolutePath()); + } + } + + @Internal + protected LoomGradleExtension getExtension() { + return getProject().getExtensions().getByType(LoomGradleExtension.class); + } +} |