diff options
author | shedaniel <daniel@shedaniel.me> | 2021-05-01 19:40:27 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2021-05-01 19:40:27 +0800 |
commit | 77e71acd99b735e3f4fea3b15149c2f351c1cdb8 (patch) | |
tree | 6ec17ee58269adc5a3411493a2ea695420ad7c92 /src/main/java/net/fabricmc/loom | |
parent | c28fe56870a6bf5d49e5b704e96e84072d8d68f5 (diff) | |
download | architectury-loom-77e71acd99b735e3f4fea3b15149c2f351c1cdb8.tar.gz architectury-loom-77e71acd99b735e3f4fea3b15149c2f351c1cdb8.tar.bz2 architectury-loom-77e71acd99b735e3f4fea3b15149c2f351c1cdb8.zip |
a
Diffstat (limited to 'src/main/java/net/fabricmc/loom')
20 files changed, 222 insertions, 96 deletions
diff --git a/src/main/java/net/fabricmc/loom/build/JarRemapper.java b/src/main/java/net/fabricmc/loom/build/JarRemapper.java index 6c7f0179..116fb135 100644 --- a/src/main/java/net/fabricmc/loom/build/JarRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/JarRemapper.java @@ -35,16 +35,16 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import dev.architectury.tinyremapper.IMappingProvider; +import dev.architectury.tinyremapper.InputTag; +import dev.architectury.tinyremapper.OutputConsumerPath; +import dev.architectury.tinyremapper.TinyRemapper; import org.gradle.api.Action; import org.gradle.api.Project; import org.objectweb.asm.commons.Remapper; import net.fabricmc.loom.util.LoggerFilter; import net.fabricmc.stitch.util.Pair; -import net.fabricmc.tinyremapper.IMappingProvider; -import net.fabricmc.tinyremapper.InputTag; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; public class JarRemapper { private final List<IMappingProvider> mappingProviders = new ArrayList<>(); diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java index 42f0e7bf..79695d45 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java @@ -38,6 +38,7 @@ import java.util.zip.ZipEntry; import com.google.gson.Gson; 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; @@ -58,7 +59,6 @@ import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; -import net.fabricmc.tinyremapper.TinyRemapper; public class AccessWidenerJarProcessor implements JarProcessor { private AccessWidener accessWidener = new AccessWidener(); 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 990c042c..90c71683 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -45,7 +45,11 @@ import java.util.jar.Manifest; import java.util.stream.Collectors; import java.util.zip.ZipEntry; +import com.google.common.base.Stopwatch; import com.google.gson.JsonObject; +import dev.architectury.tinyremapper.InputTag; +import dev.architectury.tinyremapper.OutputConsumerPath; +import dev.architectury.tinyremapper.TinyRemapper; import org.apache.commons.io.IOUtils; import org.gradle.api.Project; import org.objectweb.asm.commons.Remapper; @@ -69,9 +73,6 @@ import net.fabricmc.loom.util.TinyRemapperMappingsHelper; import net.fabricmc.loom.util.srg.AtRemapper; import net.fabricmc.loom.util.srg.CoreModClassRemapper; import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.InputTag; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; public class ModProcessor { public static void processMods(Project project, List<ModDependencyInfo> processList) throws IOException { @@ -150,6 +151,7 @@ public class ModProcessor { List<ModDependencyInfo> remapList = processList.stream().filter(ModDependencyInfo::requiresRemapping).collect(Collectors.toList()); + Stopwatch stopwatch = Stopwatch.createStarted(); project.getLogger().lifecycle(":remapping " + remapList.size() + " mods (TinyRemapper, " + fromM + " -> " + toM + ")"); TinyTree mappings = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); @@ -201,6 +203,7 @@ public class ModProcessor { } remapper.finish(); + project.getLogger().lifecycle(":remapped " + remapList.size() + " mods (TinyRemapper, " + fromM + " -> " + toM + ") in " + stopwatch.stop()); for (ModDependencyInfo info : remapList) { outputConsumerMap.get(info).close(); 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 b53154d1..170f2b65 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 @@ -55,6 +55,8 @@ import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonParser; import de.oceanlabs.mcp.mcinjector.adaptors.ParameterAnnotationFixer; +import dev.architectury.tinyremapper.OutputConsumerPath; +import dev.architectury.tinyremapper.TinyRemapper; import net.minecraftforge.accesstransformer.AccessTransformerEngine; import net.minecraftforge.accesstransformer.TransformerProcessor; import net.minecraftforge.accesstransformer.parser.AccessTransformerList; @@ -88,8 +90,6 @@ import net.fabricmc.loom.util.function.FsPathConsumer; import net.fabricmc.loom.util.srg.InnerClassRemapper; import net.fabricmc.loom.util.srg.SpecialSourceExecutor; import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; public class MinecraftPatchedProvider extends DependencyProvider { private final MappingsProvider mappingsProvider; 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 994f9577..3be5e9f8 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 @@ -42,13 +42,14 @@ import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.jar.Attributes; import java.util.jar.Manifest; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; +import dev.architectury.tinyremapper.IMappingProvider; +import dev.architectury.tinyremapper.TinyRemapper; import org.gradle.api.Project; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.ClassReader; @@ -70,8 +71,6 @@ import net.fabricmc.loom.util.srg.AtRemapper; import net.fabricmc.loom.util.srg.CoreModClassRemapper; import net.fabricmc.loom.util.srg.InnerClassRemapper; import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.IMappingProvider; -import net.fabricmc.tinyremapper.TinyRemapper; public class MinecraftMappedProvider extends DependencyProvider { private static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>() @@ -158,9 +157,37 @@ public class MinecraftMappedProvider extends DependencyProvider { remapper.prepareClasses(); remapper.readInputs(input); - Files.copy(input, outputMapped, StandardCopyOption.REPLACE_EXISTING); + Path tmpAssets = Files.createTempFile("tmpAssets", null); + Files.deleteIfExists(tmpAssets); + tmpAssets.toFile().deleteOnExit(); + + try (FileSystemUtil.FileSystemDelegate inputFs = FileSystemUtil.getJarFileSystem(input, false)) { + ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter(); + + try (FileSystemUtil.FileSystemDelegate assetsFs = FileSystemUtil.getJarFileSystem(tmpAssets, true)) { + for (Path path : (Iterable<? extends Path>) Files.walk(inputFs.get().getPath("/"))::iterator) { + if (Files.isRegularFile(path) && !path.getFileName().toString().endsWith(".class")) { + Path p = assetsFs.get().getPath(path.toString()); + + if (p.getParent() != null) { + Files.createDirectories(p.getParent()); + } + + taskCompleter.add(() -> { + Files.copy(path, p); + }); + } + } + + taskCompleter.complete(); + } + } + + Files.copy(tmpAssets, outputMapped, StandardCopyOption.REPLACE_EXISTING); FileSystemUtil.FileSystemDelegate systemMapped = FileSystemUtil.getJarFileSystem(outputMapped, true); - ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter(); + ThreadingUtils.TaskCompleter mappedRemapper = ThreadingUtils.taskCompleter().onComplete(stopwatch -> { + getProject().getLogger().lifecycle(":remapped minecraft (AsmRemapper, intermediary -> named) in " + stopwatch); + }); MappingsCompiled compiledMapped = new MappingsCompiled(getMappings(input, "intermediary", "named")); for (String toM : getExtension().isForge() ? Arrays.asList("intermediary", "srg") : Collections.singletonList("intermediary")) { @@ -169,15 +196,15 @@ public class MinecraftMappedProvider extends DependencyProvider { getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); remapper.replaceMappings(getMappings(input, fromM, toM)); - OutputRemappingHandler.remap(remapper, input, output, toM.equals("intermediary") ? (path, bytes) -> { + OutputRemappingHandler.remap(remapper, tmpAssets, output, toM.equals("intermediary") ? (path, bytes) -> { try { - Path fsPath = systemMapped.get().getPath(compiledMapped.mapClass(path) + ".class"); + Path fsPath = systemMapped.get().getPath(compiledMapped.map(path) + ".class"); if (fsPath.getParent() != null) { Files.createDirectories(fsPath.getParent()); } - taskCompleter.add(() -> { + mappedRemapper.add(() -> { ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassRemapper classRemapper = new CompiledMappedClassRemapper(writer, compiledMapped); new ClassReader(bytes).accept(classRemapper, ClassReader.EXPAND_FRAMES); @@ -187,10 +214,9 @@ public class MinecraftMappedProvider extends DependencyProvider { } catch (IOException e) { throw new UncheckedIOException(e); } - } : (path, bytes) -> { - }); + } : null); - getProject().getLogger().info(":remapped minecraft (TinyRemapper, " + fromM + " -> " + toM + ") in " + stopwatch); + getProject().getLogger().lifecycle(":remapped minecraft (TinyRemapper, " + fromM + " -> " + toM + ") in " + stopwatch); if (getExtension().isForge() && !"srg".equals(toM)) { getProject().getLogger().info(":running forge finalising tasks"); @@ -231,7 +257,7 @@ public class MinecraftMappedProvider extends DependencyProvider { remapper.finish(); getProject().getLogger().lifecycle(":remapping minecraft (AsmRemapper, intermediary -> named)"); - taskCompleter.complete(); + mappedRemapper.complete(); systemMapped.close(); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/CompiledMappedClassRemapper.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/CompiledMappedClassRemapper.java index eff9af23..e9b484f4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/CompiledMappedClassRemapper.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/CompiledMappedClassRemapper.java @@ -1,51 +1,50 @@ package net.fabricmc.loom.configuration.providers.minecraft.tr; +import java.util.HashMap; + +import dev.architectury.tinyremapper.AsmClassRemapper; import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.commons.ClassRemapper; import org.objectweb.asm.commons.MethodRemapper; -import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.tree.MethodNode; public class CompiledMappedClassRemapper extends ClassRemapper { private final MappingsCompiled compiled; - private String lastMethodName; + private String lastName; + private MethodNode lastMethod; public CompiledMappedClassRemapper(ClassVisitor classVisitor, MappingsCompiled compiled) { - super(Opcodes.ASM9, classVisitor, new Remapper() { - @Override - public String map(String internalName) { - return compiled.mapClass(internalName); - } - - @Override - public String mapFieldName(String owner, String name, String descriptor) { - return compiled.mapField(name); - } - - @Override - public String mapMethodName(String owner, String name, String descriptor) { - return compiled.mapMethod(name); - } - }); + super(Opcodes.ASM9, classVisitor, compiled); this.compiled = compiled; } @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + lastName = name; + this.compiled.lastSuperClass = superName; + this.compiled.lastInterfaces = interfaces; + super.visit(version, access, name, signature, superName, interfaces); + } + + @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { - lastMethodName = name; + lastMethod = new MethodNode(api, access, name, descriptor, signature, exceptions); return super.visitMethod(access, name, descriptor, signature, exceptions); } @Override protected MethodVisitor createMethodRemapper(MethodVisitor methodVisitor) { - return new MethodRemapper(api, methodVisitor, remapper) { + return new MethodRemapper(api, lastMethod, remapper) { @Override - public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) { - super.visitLocalVariable(compiled.mapMethodArg(lastMethodName, index, name), - descriptor, signature, start, end, index); + public void visitEnd() { + lastMethod.localVariables = null; + lastMethod.parameters = null; + AsmClassRemapper.AsmMethodRemapper.processLocals(compiled, lastName, lastMethod, false, true, new HashMap<>()); + lastMethod.visitEnd(); + lastMethod.accept(methodVisitor); } }; } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MappingsCompiled.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MappingsCompiled.java index 9f5f96d6..c4ebb67e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MappingsCompiled.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MappingsCompiled.java @@ -4,19 +4,25 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import net.fabricmc.tinyremapper.IMappingProvider; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import dev.architectury.tinyremapper.IMappingProvider; +import dev.architectury.tinyremapper.MethodRemapperProvider; +import org.objectweb.asm.commons.Remapper; -public class MappingsCompiled { +public class MappingsCompiled extends Remapper implements MethodRemapperProvider { private final Map<String, String> classes; private final Map<String, String> fields; private final Map<String, String> methods; - private final Map<String, String> methodArgs; + private final Table<String, Integer, String> methodArgs; + String lastSuperClass; + String[] lastInterfaces; public MappingsCompiled(Set<IMappingProvider> mappings) { this.classes = new HashMap<>(); this.fields = new HashMap<>(); this.methods = new HashMap<>(); - this.methodArgs = new HashMap<>(); + this.methodArgs = HashBasedTable.create(); for (IMappingProvider mapping : mappings) { mapping.load(new IMappingProvider.MappingAcceptor() { @@ -32,7 +38,7 @@ public class MappingsCompiled { @Override public void acceptMethodArg(IMappingProvider.Member method, int lvIndex, String dstName) { - methodArgs.put(method.name + "|" + lvIndex, dstName); + methodArgs.put(method.owner + "|" + method.name, lvIndex, dstName); } @Override @@ -47,19 +53,55 @@ public class MappingsCompiled { } } - public String mapClass(String name) { + @Override + public String map(String name) { return classes.getOrDefault(name, name); } + @Override + public String mapFieldName(String owner, String name, String descriptor) { + return mapField(name); + } + public String mapField(String name) { return fields.getOrDefault(name, name); } + @Override + public String mapMethodName(String owner, String name, String descriptor) { + return mapMethod(name); + } + public String mapMethod(String name) { return methods.getOrDefault(name, name); } - public String mapMethodArg(String methodName, int lvIndex, String def) { - return methodArgs.getOrDefault(methodName + "|" + lvIndex, def); + public String mapMethodArg(String methodOwner, String methodName, int lvIndex, String def) { + String arg = methodArgs.get(methodOwner + "|" + methodName, lvIndex); + if (arg != null) return arg; + + if (lastSuperClass != null) { + arg = methodArgs.get(lastSuperClass + "|" + methodName, lvIndex); + if (arg != null) return arg; + } + + if (lastInterfaces != null) { + for (String lastInterface : lastInterfaces) { + arg = methodArgs.get(lastInterface + "|" + methodName, lvIndex); + if (arg != null) return arg; + } + } + + return def; + } + + @Override + public String mapMethodVar(String methodOwner, String methodName, String methodDesc, int lvIndex, int startOpIdx, int asmIndex, String name) { + return name; + } + + @Override + public String mapMethodArg(String methodOwner, String methodName, String methodDesc, int lvIndex, String name) { + return mapMethodArg(methodOwner, methodName, lvIndex, name); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java new file mode 100644 index 00000000..44af6b2c --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/MercuryUtils.java @@ -0,0 +1,18 @@ +package net.fabricmc.loom.configuration.providers.minecraft.tr; + +import org.cadixdev.mercury.Mercury; + +public class MercuryUtils { + public static Mercury copyMercury(Mercury mercury) { + Mercury copy = new Mercury(); + copy.getClassPath().addAll(mercury.getClassPath()); + copy.getContext().putAll(mercury.getContext()); + copy.getProcessors().addAll(mercury.getProcessors()); + copy.setEncoding(mercury.getEncoding()); + copy.setFlexibleAnonymousClassMemberLookups(mercury.isFlexibleAnonymousClassMemberLookups()); + copy.setGracefulClasspathChecks(mercury.isGracefulClasspathChecks()); + copy.setGracefulJavadocClasspathChecks(mercury.isGracefulJavadocClasspathChecks()); + copy.setSourceCompatibility(mercury.getSourceCompatibility()); + return copy; + } +} diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java index de0a71e3..d3a6c69d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/tr/OutputRemappingHandler.java @@ -8,19 +8,25 @@ import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; import java.util.function.BiConsumer; +import dev.architectury.tinyremapper.InputTag; +import dev.architectury.tinyremapper.TinyRemapper; + import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.FileSystemUtil.FileSystemDelegate; import net.fabricmc.loom.util.ThreadingUtils; -import net.fabricmc.tinyremapper.TinyRemapper; public class OutputRemappingHandler { - public static void remap(TinyRemapper remapper, Path input, Path output) throws IOException { - remap(remapper, input, output, (path, bytes) -> { + public static void remap(TinyRemapper remapper, Path assets, Path output) throws IOException { + remap(remapper, assets, output, (path, bytes) -> { }); } - public static void remap(TinyRemapper remapper, Path input, Path output, BiConsumer<String, byte[]> then) throws IOException { - Files.copy(input, output, StandardCopyOption.REPLACE_EXISTING); + public static void remap(TinyRemapper remapper, Path assets, Path output, BiConsumer<String, byte[]> then) throws IOException { + remap(remapper, assets, output, then, (InputTag[]) null); + } + + public static void remap(TinyRemapper remapper, Path assets, Path output, BiConsumer<String, byte[]> then, InputTag... inputTags) throws IOException { + Files.copy(assets, output, StandardCopyOption.REPLACE_EXISTING); try (FileSystemDelegate system = FileSystemUtil.getJarFileSystem(output, true)) { ThreadingUtils.TaskCompleter taskCompleter = ThreadingUtils.taskCompleter(); @@ -39,11 +45,13 @@ public class OutputRemappingHandler { Files.write(fsPath, bytes, StandardOpenOption.CREATE); }); - then.accept(path, bytes); + if (then != null) { + then.accept(path, bytes); + } } catch (IOException e) { throw new UncheckedIOException(e); } - }); + }, inputTags); taskCompleter.complete(); } diff --git a/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java b/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java index 9dada304..e1f4db16 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java @@ -28,10 +28,11 @@ import org.gradle.api.DefaultTask; import org.gradle.api.tasks.Internal; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; public abstract class AbstractLoomTask extends DefaultTask { public AbstractLoomTask() { - setGroup("fabric"); + setGroup(Constants.TASK_CATEGORY); } @Internal diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 34f2dac8..111d074a 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -35,13 +35,14 @@ import org.gradle.api.Project; import org.gradle.api.tasks.JavaExec; import net.fabricmc.loom.configuration.ide.RunConfig; +import net.fabricmc.loom.util.Constants; public abstract class AbstractRunTask extends JavaExec { private final RunConfig config; public AbstractRunTask(Function<Project, RunConfig> configProvider) { super(); - setGroup("fabric"); + setGroup(Constants.TASK_CATEGORY); this.config = configProvider.apply(getProject()); setClasspath(config.sourceSet.getRuntimeClasspath()); diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 25d6fe47..eb028d40 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -56,7 +56,6 @@ public class GenerateSourcesTask extends AbstractLoomTask { public GenerateSourcesTask(LoomDecompiler decompiler) { this.decompiler = decompiler; - setGroup("fabric"); getOutputs().upToDateWhen((o) -> false); } diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index 1b1de6a7..f61ec8f3 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -35,6 +35,7 @@ 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; +import net.fabricmc.loom.util.Constants; public final class LoomTasks { private LoomTasks() { @@ -50,7 +51,7 @@ public final class LoomTasks { tasks.register("remapJar", RemapJarTask.class, t -> { t.setDescription("Remaps the built project jar to intermediary mappings."); - t.setGroup("fabric"); + t.setGroup(Constants.TASK_CATEGORY); }); tasks.register("downloadAssets", DownloadAssetsTask.class, t -> t.setDescription("Downloads required assets for Fabric.")); @@ -97,7 +98,6 @@ public final class LoomTasks { tasks.register(taskName, RunGameTask.class, config).configure(t -> { t.setDescription("Starts the '" + config.getConfigName() + "' run configuration"); - t.setGroup("fabric"); if (config.getEnvironment().equals("client")) { t.dependsOn("downloadAssets"); diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index cf03e57c..723c6ec4 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -39,21 +39,24 @@ import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import me.shedaniel.architectury.refmapremapper.RefmapRemapper; -import me.shedaniel.architectury.refmapremapper.remapper.MappingsRemapper; -import me.shedaniel.architectury.refmapremapper.remapper.ReferenceRemapper; -import me.shedaniel.architectury.refmapremapper.remapper.Remapper; -import me.shedaniel.architectury.refmapremapper.remapper.SimpleReferenceRemapper; +import dev.architectury.refmapremapper.RefmapRemapper; +import dev.architectury.refmapremapper.remapper.MappingsRemapper; +import dev.architectury.refmapremapper.remapper.ReferenceRemapper; +import dev.architectury.refmapremapper.remapper.Remapper; +import dev.architectury.refmapremapper.remapper.SimpleReferenceRemapper; +import dev.architectury.tinyremapper.IMappingProvider; +import dev.architectury.tinyremapper.TinyRemapper; +import dev.architectury.tinyremapper.TinyUtils; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; @@ -72,27 +75,23 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.build.JarRemapper; import net.fabricmc.loom.build.MixinRefmapHelper; import net.fabricmc.loom.build.nesting.EmptyNestedJarProvider; -import net.fabricmc.loom.build.nesting.NestedJarPathProvider; import net.fabricmc.loom.build.nesting.JarNester; import net.fabricmc.loom.build.nesting.MergedNestedJarProvider; import net.fabricmc.loom.build.nesting.NestedDependencyProvider; +import net.fabricmc.loom.build.nesting.NestedJarPathProvider; import net.fabricmc.loom.build.nesting.NestedJarProvider; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.TinyRemapperMappingsHelper; -import net.fabricmc.loom.util.gradle.GradleSupport; import net.fabricmc.loom.util.ZipReprocessorUtil; +import net.fabricmc.loom.util.gradle.GradleSupport; import net.fabricmc.mapping.tree.ClassDef; import net.fabricmc.mapping.tree.FieldDef; import net.fabricmc.mapping.tree.MethodDef; import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.stitch.util.Pair; -import net.fabricmc.tinyremapper.IMappingProvider; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.tinyremapper.TinyUtils; public class RemapJarTask extends Jar { private final RegularFileProperty input; diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index cc33b6fe..046a2759 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -40,6 +40,7 @@ public class Constants { public static final String VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; + public static final String TASK_CATEGORY = "loom"; public static final int ASM_VERSION = Opcodes.ASM9; diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index f9573bf5..22ba7f70 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Set; import java.util.function.Consumer; +import com.google.common.base.Stopwatch; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.mercury.Mercury; import org.cadixdev.mercury.remapper.MercuryRemapper; @@ -45,7 +46,7 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.configuration.providers.LaunchProvider; import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; -import net.fabricmc.loom.util.gradle.ProgressLogger; +import net.fabricmc.loom.configuration.providers.minecraft.tr.MercuryUtils; import net.fabricmc.lorenztiny.TinyMappingsReader; import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.stitch.util.StitchUtil; @@ -54,7 +55,7 @@ public class SourceRemapper { private final Project project; private String from; private String to; - private final List<Consumer<ProgressLogger>> remapTasks = new ArrayList<>(); + private final List<Consumer<Mercury>> remapTasks = new ArrayList<>(); private Mercury mercury; @@ -80,10 +81,9 @@ public class SourceRemapper { } public void scheduleRemapSources(File source, File destination, boolean reproducibleFileOrder, boolean preserveFileTimestamps) { - remapTasks.add((logger) -> { + remapTasks.add((mercury) -> { try { - logger.progress("remapping sources - " + source.getName()); - remapSourcesInner(source, destination); + remapSourcesInner(mercury, source, destination); ZipReprocessorUtil.reprocessZip(destination, reproducibleFileOrder, preserveFileTimestamps); // Set the remapped sources creation date to match the sources if we're likely succeeded in making it @@ -101,22 +101,21 @@ public class SourceRemapper { return; } - project.getLogger().lifecycle(":remapping sources"); + Stopwatch stopwatch = Stopwatch.createStarted(); + project.getLogger().lifecycle(":remapping " + remapTasks.size() + " sources"); - ProgressLogger progressLogger = ProgressLogger.getProgressFactory(project, SourceRemapper.class.getName()); - progressLogger.start("Remapping dependency sources", "sources"); - - remapTasks.forEach(consumer -> consumer.accept(progressLogger)); + Mercury mercury = getMercuryInstance(); + ThreadingUtils.run(remapTasks, consumer -> consumer.accept(MercuryUtils.copyMercury(mercury))); - progressLogger.completed(); + project.getLogger().lifecycle(":remapped " + remapTasks.size() + " sources in " + stopwatch.stop()); // TODO: FIXME - WORKAROUND https://github.com/FabricMC/fabric-loom/issues/45 System.gc(); } - private void remapSourcesInner(File source, File destination) throws Exception { + private void remapSourcesInner(Mercury mercury, File source, File destination) throws Exception { + Stopwatch stopwatch = Stopwatch.createStarted(); project.getLogger().info(":remapping source jar " + source.getName() + " from " + from + " to " + to); - Mercury mercury = getMercuryInstance(); if (source.equals(destination)) { if (source.isDirectory()) { @@ -166,6 +165,8 @@ public class SourceRemapper { if (isSrcTmp) { Files.walkFileTree(srcPath, new DeletingFileVisitor()); } + + project.getLogger().info(":remapped source jar " + source.getName() + " from " + from + " to " + to + " in " + stopwatch.stop()); } private Mercury getMercuryInstance() { diff --git a/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java b/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java index 79b67929..f0c9ff9c 100644 --- a/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java +++ b/src/main/java/net/fabricmc/loom/util/ThreadingUtils.java @@ -34,9 +34,12 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import com.google.common.base.Stopwatch; + public class ThreadingUtils { public static <T> void run(Collection<T> values, UnsafeConsumer<T> action) { run(values.stream() @@ -128,10 +131,16 @@ public class ThreadingUtils { } public static class TaskCompleter { + Stopwatch stopwatch = Stopwatch.createUnstarted(); List<CompletableFuture<?>> tasks = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + List<Consumer<Stopwatch>> completionListener = new ArrayList<>(); public TaskCompleter add(UnsafeRunnable job) { + if (!stopwatch.isRunning()) { + stopwatch.start(); + } + tasks.add(CompletableFuture.runAsync(() -> { try { job.run(); @@ -139,6 +148,12 @@ public class ThreadingUtils { throw new RuntimeException(throwable); } }, service)); + + return this; + } + + public TaskCompleter onComplete(Consumer<Stopwatch> consumer) { + completionListener.add(consumer); return this; } @@ -146,6 +161,11 @@ public class ThreadingUtils { try { CompletableFuture.allOf(tasks.toArray(new CompletableFuture[0])).get(); service.shutdownNow(); + stopwatch.stop(); + + for (Consumer<Stopwatch> consumer : completionListener) { + consumer.accept(stopwatch); + } } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } diff --git a/src/main/java/net/fabricmc/loom/util/TinyRemapperMappingsHelper.java b/src/main/java/net/fabricmc/loom/util/TinyRemapperMappingsHelper.java index b9964020..92e5bf94 100644 --- a/src/main/java/net/fabricmc/loom/util/TinyRemapperMappingsHelper.java +++ b/src/main/java/net/fabricmc/loom/util/TinyRemapperMappingsHelper.java @@ -24,13 +24,14 @@ package net.fabricmc.loom.util; +import dev.architectury.tinyremapper.IMappingProvider; + import net.fabricmc.mapping.tree.ClassDef; import net.fabricmc.mapping.tree.FieldDef; import net.fabricmc.mapping.tree.LocalVariableDef; import net.fabricmc.mapping.tree.MethodDef; import net.fabricmc.mapping.tree.ParameterDef; import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.IMappingProvider; public class TinyRemapperMappingsHelper { private TinyRemapperMappingsHelper() { } diff --git a/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java index d0bc7864..021410b6 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java @@ -32,11 +32,12 @@ import java.util.Map; import java.util.function.BiConsumer; import java.util.stream.Collectors; +import dev.architectury.tinyremapper.IMappingProvider; + import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.FileSystemUtil.FileSystemDelegate; import net.fabricmc.mapping.tree.ClassDef; import net.fabricmc.mapping.tree.TinyTree; -import net.fabricmc.tinyremapper.IMappingProvider; public class InnerClassRemapper { public static IMappingProvider of(Path fromJar, TinyTree mappingsWithSrg, String from, String to) throws IOException { diff --git a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java index 7639eb00..777a9007 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java +++ b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java @@ -39,7 +39,8 @@ import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; -import au.com.bytecode.opencsv.CSVReader; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.lorenz.io.srg.tsrg.TSrgReader; import org.cadixdev.lorenz.model.ClassMapping; @@ -71,7 +72,12 @@ public class MCPReader { Map<String, String> intermediaryToMCPMap = createIntermediaryToMCPMap(intermediaryTiny, srgTokens); Map<String, String[]> intermediaryToDocsMap = new HashMap<>(); Map<String, Map<Integer, String>> intermediaryToParamsMap = new HashMap<>(); - injectMcp(mcpJar, intermediaryToMCPMap, intermediaryToDocsMap, intermediaryToParamsMap); + + try { + injectMcp(mcpJar, intermediaryToMCPMap, intermediaryToDocsMap, intermediaryToParamsMap); + } catch (CsvValidationException e) { + throw new RuntimeException(e); + } mergeTokensIntoIntermediary(intermediaryTiny, intermediaryToMCPMap, intermediaryToDocsMap, intermediaryToParamsMap); return intermediaryTiny; @@ -186,7 +192,7 @@ public class MCPReader { } private void injectMcp(Path mcpJar, Map<String, String> intermediaryToSrgMap, Map<String, String[]> intermediaryToDocsMap, Map<String, Map<Integer, String>> intermediaryToParamsMap) - throws IOException { + throws IOException, CsvValidationException { Map<String, List<String>> srgToIntermediary = inverseMap(intermediaryToSrgMap); Map<String, List<String>> simpleSrgToIntermediary = new HashMap<>(); Pattern methodPattern = Pattern.compile("(func_\\d*)_.*"); |