diff options
author | shedaniel <daniel@shedaniel.me> | 2021-09-24 00:36:09 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2021-09-24 02:23:42 +0800 |
commit | 9033d1e781a468ce6f3842cf26be5504e2de7099 (patch) | |
tree | 14ea31c2e8afdb3474eeb5ea53c32c475905ba0e | |
parent | 5bf22dd50df2850f37338939f2a53cfa16a8eba0 (diff) | |
download | architectury-loom-9033d1e781a468ce6f3842cf26be5504e2de7099.tar.gz architectury-loom-9033d1e781a468ce6f3842cf26be5504e2de7099.tar.bz2 architectury-loom-9033d1e781a468ce6f3842cf26be5504e2de7099.zip |
Fix #47, Fix #48
Signed-off-by: shedaniel <daniel@shedaniel.me>
12 files changed, 216 insertions, 93 deletions
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 bb3f839e..7e155ff4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -148,7 +148,7 @@ public class ModProcessor { Stopwatch stopwatch = Stopwatch.createStarted(); project.getLogger().lifecycle(":remapping " + remapList.size() + " mods (TinyRemapper, " + fromM + " -> " + toM + ")"); - MemoryMappingTree mappings = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); + MemoryMappingTree mappings = (fromM.equals("srg") || toM.equals("srg")) && extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); LoggerFilter.replaceSystemOut(); TinyRemapper remapper = TinyRemapper.newRemapper() .logger(project.getLogger()::lifecycle) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java index 13d3e62f..238bac2d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java @@ -114,7 +114,7 @@ public class FieldMigratedMappingsProvider extends MappingsProviderImpl { if (getExtension().shouldGenerateSrgTiny()) { if (Files.notExists(rawTinyMappingsWithSrg) || isRefreshDeps()) { // Merge tiny mappings with srg - SrgMerger.mergeSrg(getProject().getLogger(), this::getMojmapSrgFileIfPossible, getRawSrgFile(), rawTinyMappings, rawTinyMappingsWithSrg, true); + SrgMerger.mergeSrg(getProject().getLogger(), null, getRawSrgFile(), rawTinyMappings, rawTinyMappingsWithSrg, true); } } 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 5de6e5f3..36924802 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 @@ -96,6 +96,7 @@ import net.fabricmc.loom.util.TinyRemapperHelper; import net.fabricmc.loom.util.function.FsPathConsumer; import net.fabricmc.loom.util.srg.InnerClassRemapper; import net.fabricmc.loom.util.srg.SpecialSourceExecutor; +import net.fabricmc.loom.util.srg.SrgMerger; import net.fabricmc.mappingio.tree.MemoryMappingTree; public class MinecraftPatchedProvider extends DependencyProvider { @@ -308,7 +309,14 @@ public class MinecraftPatchedProvider extends DependencyProvider { private TinyRemapper buildRemapper(Path input) throws IOException { Path[] libraries = TinyRemapperHelper.getMinecraftDependencies(getProject()); - MemoryMappingTree mappingsWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg(); + MemoryMappingTree mappingsWithSrg; + + if (getExtension().isForgeAndOfficial()) { + mappingsWithSrg = SrgMerger.mergeSrg(getProject().getLogger(), getExtension().getMappingsProvider()::getMojmapSrgFileIfPossible, getExtension().getSrgProvider().getMergedMojangTrimmed(), getExtension().getMappingsProvider().tinyMappings, true); + } else { + mappingsWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg(); + } + TinyRemapper remapper = TinyRemapper.newRemapper() .logger(getProject().getLogger()::lifecycle) .logUnknownInvokeDynamic(false) @@ -355,7 +363,7 @@ public class MinecraftPatchedProvider extends DependencyProvider { private Path getToSrgMappings() throws IOException { if (getExtension().getSrgProvider().isTsrgV2()) { - return getExtension().getSrgProvider().getMergedMojang(); + return getExtension().getSrgProvider().getMergedMojangRaw(); } else { return getExtension().getMcpConfigProvider().getMappings(); } @@ -483,6 +491,7 @@ public class MinecraftPatchedProvider extends DependencyProvider { List<File> toDelete = new ArrayList<>(); String atDependency = Constants.Dependencies.ACCESS_TRANSFORMERS + Constants.Dependencies.Versions.ACCESS_TRANSFORMERS; FileCollection classpath = DependencyDownloader.download(getProject(), atDependency); + Stopwatch stopwatch = Stopwatch.createStarted(); logger.lifecycle(":access transforming minecraft"); @@ -537,6 +546,8 @@ public class MinecraftPatchedProvider extends DependencyProvider { for (File file : toDelete) { file.delete(); } + + logger.lifecycle(":access transformed minecraft in " + stopwatch.stop()); } public enum Environment { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/SrgProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/SrgProvider.java index 63e5cdd3..87cb1fdb 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/SrgProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/SrgProvider.java @@ -28,6 +28,7 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.io.StringReader; import java.io.UncheckedIOException; import java.net.URI; @@ -38,13 +39,20 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; +import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.output.NullOutputStream; import org.gradle.api.Project; +import org.gradle.api.logging.LogLevel; +import org.gradle.api.logging.configuration.ShowStacktrace; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext; @@ -55,14 +63,18 @@ import net.fabricmc.loom.util.srg.Tsrg2Utils; import net.fabricmc.loom.util.srg.Tsrg2Writer; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingVisitor; +import net.fabricmc.mappingio.adapter.ForwardingMappingVisitor; import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.mappingio.tree.MemoryMappingTree; public class SrgProvider extends DependencyProvider { private Path srg; private Boolean isTsrgV2; + private Path mergedMojangRaw; private Path mergedMojang; private Path mergedMojangTrimmed; + private static Path mojmapTsrg; + private static Path mojmapTsrg2; public SrgProvider(Project project) { super(project); @@ -85,7 +97,18 @@ public class SrgProvider extends DependencyProvider { } if (isTsrgV2) { - if (!Files.exists(mergedMojang) || !Files.exists(mergedMojangTrimmed) || isRefreshDeps()) { + if (!Files.exists(mergedMojangRaw) || !Files.exists(mergedMojang) || !Files.exists(mergedMojangTrimmed) || isRefreshDeps()) { + Stopwatch stopwatch = Stopwatch.createStarted(); + getProject().getLogger().lifecycle(":merging mappings (InstallerTools, srg + mojmap)"); + PrintStream out = System.out; + PrintStream err = System.err; + + if (getProject().getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) >= 0) { + System.setOut(new PrintStream(NullOutputStream.NULL_OUTPUT_STREAM)); + System.setErr(new PrintStream(NullOutputStream.NULL_OUTPUT_STREAM)); + } + + Files.deleteIfExists(mergedMojangRaw); Files.deleteIfExists(mergedMojang); net.minecraftforge.installertools.ConsoleTool.main(new String[] { "--task", @@ -93,14 +116,15 @@ public class SrgProvider extends DependencyProvider { "--left", getSrg().toAbsolutePath().toString(), "--right", - getMojmapTsrg(getProject(), getExtension()).toAbsolutePath().toString(), + getMojmapTsrg2(getProject(), getExtension()).toAbsolutePath().toString(), "--classes", "--output", - mergedMojang.toAbsolutePath().toString() + mergedMojangRaw.toAbsolutePath().toString() }); MemoryMappingTree tree = new MemoryMappingTree(); - MappingReader.read(new StringReader(FileUtils.readFileToString(mergedMojang.toFile(), StandardCharsets.UTF_8)), tree); + MappingReader.read(new StringReader(FileUtils.readFileToString(mergedMojangRaw.toFile(), StandardCharsets.UTF_8)), new FieldDescWrappingVisitor(tree)); + Files.writeString(mergedMojang, Tsrg2Writer.serialize(tree), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); for (MappingTree.ClassMapping classDef : tree.getClasses()) { for (MappingTree.MethodMapping methodDef : classDef.getMethods()) { @@ -109,13 +133,60 @@ public class SrgProvider extends DependencyProvider { } Files.writeString(mergedMojangTrimmed, Tsrg2Writer.serialize(tree), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + if (getProject().getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) >= 0) { + System.setOut(out); + System.setErr(err); + } + + getProject().getLogger().lifecycle(":merged mappings (InstallerTools, srg + mojmap) in " + stopwatch.stop()); } } } + // Read mojmap and apply field descs to the tsrg2 + private class FieldDescWrappingVisitor extends ForwardingMappingVisitor { + private final Map<FieldKey, String> fieldDescMap = new HashMap<>(); + private String lastClass; + + protected FieldDescWrappingVisitor(MappingVisitor next) throws IOException { + super(next); + MemoryMappingTree mojmap = new MemoryMappingTree(); + MappingReader.read(getMojmapTsrg2(getProject(), getExtension()), mojmap); + + for (MappingTree.ClassMapping classMapping : mojmap.getClasses()) { + for (MappingTree.FieldMapping fieldMapping : classMapping.getFields()) { + fieldDescMap.put(new FieldKey(classMapping.getSrcName(), fieldMapping.getSrcName()), fieldMapping.getSrcDesc()); + } + } + } + + @Override + public boolean visitClass(String srcName) throws IOException { + if (super.visitClass(srcName)) { + this.lastClass = srcName; + return true; + } else { + return false; + } + } + + @Override + public boolean visitField(String srcName, String srcDesc) throws IOException { + if (srcDesc == null) { + srcDesc = fieldDescMap.get(new FieldKey(lastClass, srcName)); + } + + return super.visitField(srcName, srcDesc); + } + + private record FieldKey(String owner, String name) {} + } + private void init(String version) { File dir = getMinecraftProvider().dir("srg/" + version); srg = new File(dir, "srg.tsrg").toPath(); + mergedMojangRaw = new File(dir, "srg-mojmap-merged-raw.tsrg").toPath(); mergedMojang = new File(dir, "srg-mojmap-merged.tsrg").toPath(); mergedMojangTrimmed = new File(dir, "srg-mojmap-merged-trimmed.tsrg").toPath(); } @@ -124,6 +195,12 @@ public class SrgProvider extends DependencyProvider { return srg; } + public Path getMergedMojangRaw() { + if (!isTsrgV2()) throw new IllegalStateException("May not access merged mojmap srg if not on modern Minecraft!"); + + return mergedMojangRaw; + } + public Path getMergedMojang() { if (!isTsrgV2()) throw new IllegalStateException("May not access merged mojmap srg if not on modern Minecraft!"); @@ -141,30 +218,34 @@ public class SrgProvider extends DependencyProvider { } public static Path getMojmapTsrg(Project project, LoomGradleExtension extension) throws IOException { - Path path = extension.getMinecraftProvider().dir("forge").toPath().resolve("mojmap.tsrg"); + if (mojmapTsrg != null) return mojmapTsrg; + + mojmapTsrg = extension.getMinecraftProvider().dir("forge").toPath().resolve("mojmap.tsrg"); - if (Files.notExists(path)) { - try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + if (Files.notExists(mojmapTsrg) || LoomGradlePlugin.refreshDeps) { + try (BufferedWriter writer = Files.newBufferedWriter(mojmapTsrg, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { Tsrg2Utils.writeTsrg(visitor -> visitMojmap(visitor, project), MappingsNamespace.NAMED.toString(), false, writer); } } - return path; + return mojmapTsrg; } public static Path getMojmapTsrg2(Project project, LoomGradleExtension extension) throws IOException { - Path path = extension.getMinecraftProvider().dir("forge").toPath().resolve("mojmap.tsrg2"); + if (mojmapTsrg2 != null) return mojmapTsrg2; + + mojmapTsrg2 = extension.getMinecraftProvider().dir("forge").toPath().resolve("mojmap.tsrg2"); - if (Files.notExists(path)) { - try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + if (Files.notExists(mojmapTsrg2) || LoomGradlePlugin.refreshDeps) { + try (BufferedWriter writer = Files.newBufferedWriter(mojmapTsrg2, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { MemoryMappingTree tree = new MemoryMappingTree(); visitMojmap(tree, project); writer.write(Tsrg2Writer.serialize(tree)); } } - return path; + return mojmapTsrg2; } private static void visitMojmap(MappingVisitor visitor, Project project) { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java index f55087a7..1a3d5e35 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java @@ -156,7 +156,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings if (getExtension().shouldGenerateSrgTiny()) { if (Files.notExists(tinyMappingsWithSrg) || isRefreshDeps()) { // Merge tiny mappings with srg - SrgMerger.mergeSrg(getProject().getLogger(), this::getMojmapSrgFileIfPossible, getRawSrgFile(), tinyMappings, tinyMappingsWithSrg, true); + SrgMerger.mergeSrg(getProject().getLogger(), null, getRawSrgFile(), tinyMappings, tinyMappingsWithSrg, true); } mappingTreeWithSrg = readMappings(tinyMappingsWithSrg); @@ -241,7 +241,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings return extension.getSrgProvider().getSrg(); } - protected Path getMojmapSrgFileIfPossible() { + public Path getMojmapSrgFileIfPossible() { try { LoomGradleExtension extension = getExtension(); return SrgProvider.getMojmapTsrg2(getProject(), extension); 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 5d03b971..8ddb4492 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 @@ -299,10 +299,10 @@ public class MinecraftMappedProvider extends DependencyProvider { public Set<IMappingProvider> getMappings(@Nullable Set<String> fromClassNames, String fromM, String toM, Mutable<MemoryMappingTree> mappings) throws IOException { Set<IMappingProvider> providers = new HashSet<>(); - mappings.setValue(getExtension().isForge() ? getExtension().getMappingsProvider().getMappingsWithSrg() : getExtension().getMappingsProvider().getMappings()); + mappings.setValue((true || fromM.equals("srg") || toM.equals("srg")) && getExtension().isForge() ? getExtension().getMappingsProvider().getMappingsWithSrg() : getExtension().getMappingsProvider().getMappings()); providers.add(TinyRemapperHelper.create(mappings.getValue(), fromM, toM, true)); - if (getExtension().isForge()) { + if (getExtension().isForge() && (true || fromM.equals("srg") || toM.equals("srg"))) { if (fromClassNames != null) { providers.add(InnerClassRemapper.of(fromClassNames, getExtension().getMappingsProvider().getMappingsWithSrg(), fromM, toM)); } diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index 9fb95507..722df40d 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -165,7 +165,7 @@ public class RemapJarTask extends Jar { } private ReferenceRemapper createReferenceRemapper(LoomGradleExtension extension, String from, String to) throws IOException { - MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); + MappingTree mappings = (from.equals("srg") || to.equals("srg")) && extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); return new SimpleReferenceRemapper(new SimpleReferenceRemapper.Remapper() { @Override @@ -248,7 +248,7 @@ public class RemapJarTask extends Jar { if (isMainRemapTask) { jarRemapper.addToClasspath(getRemapClasspath()); - jarRemapper.addMappings(TinyRemapperHelper.create(extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false)); + jarRemapper.addMappings(TinyRemapperHelper.create((fromM.equals("srg") || toM.equals("srg")) && extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false)); } for (File mixinMapFile : extension.getAllMixinMappings()) { @@ -403,7 +403,7 @@ public class RemapJarTask extends Jar { } private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent, String from, String to) throws IOException { - MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); + MappingTree mappings = (from.equals("srg") || to.equals("srg")) && extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); return sink -> { parent.load(new IMappingProvider.MappingAcceptor() { @@ -503,7 +503,7 @@ public class RemapJarTask extends Jar { } LoomGradleExtension extension = LoomGradleExtension.get(getProject()); - MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); + MappingTree mappings = (fromM.get().equals("srg") || toM.get().equals("srg")) && extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(); try (TinyMappingsReader reader = new TinyMappingsReader(mappings, fromM.get(), toM.get())) { MappingSet mappingSet = reader.read(); diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 5f300aec..67e50407 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -184,7 +184,7 @@ public class SourceRemapper { MappingSet mappings = extension.getOrCreateSrcMappingCache(id, () -> { try { - MemoryMappingTree m = extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); + MemoryMappingTree m = (from.equals("srg") || to.equals("srg")) && extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(); project.getLogger().info(":loading " + from + " -> " + to + " source mappings"); return new TinyMappingsReader(m, from, to).read(); } catch (Exception e) { diff --git a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java index 60f4ac3f..b9af8fb8 100644 --- a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java +++ b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java @@ -71,7 +71,7 @@ public final class TinyRemapperHelper { TinyRemapper remapper = _getTinyRemapper(project, fixRecords).getKey(); remapper.replaceMappings(ImmutableSet.of( - TinyRemapperHelper.create(extension.isForge() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(), fromM, toM, true), + TinyRemapperHelper.create((fromM.equals("srg") || toM.equals("srg")) && extension.isForge() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(), fromM, toM, true), out -> TinyRemapperHelper.JSR_TO_JETBRAINS.forEach(out::acceptClass) )); return remapper; diff --git a/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java b/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java index 135cb170..6cbb0222 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java +++ b/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java @@ -103,6 +103,7 @@ public class SpecialSourceExecutor { Path output = extension.getFiles().getProjectBuildCache().toPath().resolve(officialJar.getFileName().toString().substring(0, officialJar.getFileName().toString().length() - 4) + "-srg-output.jar"); Files.deleteIfExists(output); + stopwatch = Stopwatch.createStarted(); if (specialSource) { String[] args = new String[] { @@ -134,6 +135,8 @@ public class SpecialSourceExecutor { spec.setErrorOutput(NullOutputStream.NULL_OUTPUT_STREAM); } }).rethrowFailure().assertNormalExitValue(); + + project.getLogger().lifecycle(":remapped minecraft (SpecialSource, " + side + ", official -> srg) in " + stopwatch.stop()); } else { List<String> args = new ArrayList<>(Arrays.asList( "--jar-in", @@ -172,6 +175,8 @@ public class SpecialSourceExecutor { spec.setErrorOutput(NullOutputStream.NULL_OUTPUT_STREAM); } }).rethrowFailure().assertNormalExitValue(); + + project.getLogger().lifecycle(":remapped minecraft (Vignette, " + side + ", official -> mojang) in " + stopwatch.stop()); } Files.deleteIfExists(stripped); diff --git a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java index 024ad086..12004160 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java +++ b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2020-2021 FabricMC + * 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 @@ -35,7 +35,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -46,8 +45,8 @@ import org.gradle.api.logging.Logger; import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.util.function.CollectionUtil; +import net.fabricmc.mappingio.FlatMappingVisitor; import net.fabricmc.mappingio.MappingReader; -import net.fabricmc.mappingio.adapter.MappingDstNsReorder; import net.fabricmc.mappingio.adapter.RegularAsFlatMappingVisitor; import net.fabricmc.mappingio.format.Tiny2Writer; import net.fabricmc.mappingio.format.TsrgReader; @@ -73,9 +72,18 @@ public final class SrgMerger { * or if an element mentioned in the SRG file does not have tiny mappings */ public static void mergeSrg(Logger logger, Supplier<Path> mojmap, Path srg, Path tiny, Path out, boolean lenient) throws IOException, MappingException { + MemoryMappingTree tree = mergeSrg(logger, mojmap, srg, tiny, lenient); + + try (Tiny2Writer writer = new Tiny2Writer(Files.newBufferedWriter(out), false)) { + tree.accept(writer); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static MemoryMappingTree mergeSrg(Logger logger, Supplier<Path> mojmap, Path srg, Path tiny, boolean lenient) throws IOException, MappingException { Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs = new HashMap<>(); MemoryMappingTree arr = readSrg(srg, mojmap, addRegardlessSrgs); - addRegardlessSrgs.clear(); MemoryMappingTree foss = new MemoryMappingTree(); try (BufferedReader reader = Files.newBufferedReader(tiny)) { @@ -87,19 +95,14 @@ public final class SrgMerger { } MemoryMappingTree output = new MemoryMappingTree(); - output.visitNamespaces(foss.getSrcNamespace(), Stream.concat(foss.getDstNamespaces().stream(), Stream.of("srg")).collect(Collectors.toList())); + output.visitNamespaces(foss.getSrcNamespace(), Stream.concat(Stream.of("srg"), foss.getDstNamespaces().stream()).collect(Collectors.toList())); RegularAsFlatMappingVisitor flatMappingVisitor = new RegularAsFlatMappingVisitor(output); for (MappingTree.ClassMapping klass : arr.getClasses()) { - classToTiny(logger, addRegardlessSrgs, klass, foss, flatMappingVisitor, output, lenient); + classToTiny(logger, addRegardlessSrgs, foss, klass, output, flatMappingVisitor, lenient); } - try (Tiny2Writer writer = new Tiny2Writer(Files.newBufferedWriter(out), false)) { - MappingDstNsReorder reorder = new MappingDstNsReorder(writer, Stream.concat(Stream.of("srg"), foss.getDstNamespaces().stream()).collect(Collectors.toList())); - output.accept(reorder); - } catch (IOException e) { - e.printStackTrace(); - } + return output; } private static MemoryMappingTree readSrg(Path srg, Supplier<Path> mojmap, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs) @@ -107,20 +110,17 @@ public final class SrgMerger { try (BufferedReader reader = Files.newBufferedReader(srg)) { String content = IOUtils.toString(reader); - if (content.startsWith("tsrg2")) { - return readTsrg2(content, mojmap, addRegardlessSrgs); - } else { - MemoryMappingTree tsrg = new MemoryMappingTree(); - TsrgReader.read(new StringReader(content), tsrg); - return tsrg; + if (content.startsWith("tsrg2") && mojmap != null) { + addRegardlessSrgs(mojmap, addRegardlessSrgs); } + + MemoryMappingTree tsrg = new MemoryMappingTree(); + TsrgReader.read(new StringReader(content), tsrg); + return tsrg; } } - private static MemoryMappingTree readTsrg2(String content, Supplier<Path> mojmap, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs) - throws IOException { - MemoryMappingTree tsrg2 = new MemoryMappingTree(); - TsrgReader.read(new StringReader(content), tsrg2); + private static void addRegardlessSrgs(Supplier<Path> mojmap, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs) throws IOException { MemoryMappingTree mojmapTree = readTsrg2ToTinyTree(mojmap.get()); for (MappingTree.ClassMapping classDef : mojmapTree.getClasses()) { @@ -138,8 +138,6 @@ public final class SrgMerger { } } } - - return tsrg2; } private static MemoryMappingTree readTsrg2ToTinyTree(Path path) throws IOException { @@ -152,14 +150,13 @@ public final class SrgMerger { return tree; } - private static void classToTiny(Logger logger, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, MappingTree.ClassMapping klass, MemoryMappingTree foss, RegularAsFlatMappingVisitor flatOutput, MemoryMappingTree output, boolean lenient) + private static void classToTiny(Logger logger, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, MappingTree foss, MappingTree.ClassMapping klass, MappingTree output, FlatMappingVisitor flatOutput, boolean lenient) throws IOException { String obf = klass.getSrcName(); String srg = klass.getDstName(0); - MappingTree.ClassMapping fossClass = foss.getClass(obf); - int srgId = output.getNamespaceId("srg"); + MappingTree.ClassMapping classDef = foss.getClass(obf); - if (fossClass == null) { + if (classDef == null) { if (lenient) { return; } else { @@ -167,63 +164,92 @@ public final class SrgMerger { } } - flatOutput.visitClass(obf, output.getDstNamespaces().stream().map(ns -> - ns.equals("srg") ? srg : fossClass.getName(ns)).toArray(String[]::new)); + List<String> classNames = CollectionUtil.map( + output.getDstNamespaces(), + namespace -> "srg".equals(namespace) ? srg : classDef.getName(namespace) + ); + + flatOutput.visitClass(obf, classNames.toArray(new String[0])); for (MappingTree.MethodMapping method : klass.getMethods()) { - MappingTree.MethodMapping fossMethod = CollectionUtil.find( - fossClass.getMethods(), - m -> m.getSrcName().equals(method.getSrcName()) && m.getSrcDesc().equals(method.getSrcDesc()) + MappingTree.MethodMapping def = CollectionUtil.find( + classDef.getMethods(), + m -> m.getName("official").equals(method.getSrcName()) && m.getDesc("official").equals(method.getSrcDesc()) ).orElse(null); - if (fossMethod == null) { - if (tryMatchRegardlessSrgs(addRegardlessSrgs, obf, method)) { - flatOutput.visitMethod(obf, method.getSrcName(), method.getSrcDesc(), output.getDstNamespaces().stream().map(ns -> - ns.equals("srg") ? method.getDstName(0) : method.getSrcName()).toArray(String[]::new)); - continue; - } + if (def == null) { + if (tryMatchRegardlessSrgsMethod(addRegardlessSrgs, obf, output, flatOutput, method)) continue; if (!lenient) { throw new MappingException("Missing method: " + method.getSrcName() + " (srg: " + method.getDstName(0) + ")"); } - logger.debug("Missing method: " + method.getSrcName() + method.getSrcDesc() + " (srg: " + method.getDstName(0) + ") " + fossClass.getMethods().size() + " methods in the original class"); - continue; } - flatOutput.visitMethod(obf, fossMethod.getSrcName(), fossMethod.getSrcDesc(), output.getDstNamespaces().stream().map(ns -> - ns.equals("srg") ? method.getDstName(0) : fossMethod.getName(ns)).toArray(String[]::new)); + List<String> methodNames = CollectionUtil.map( + output.getDstNamespaces(), + namespace -> "srg".equals(namespace) ? method.getDstName(0) : def.getName(namespace) + ); - for (MappingTree.MethodArgMapping arg : fossMethod.getArgs()) { - flatOutput.visitMethodArg(obf, fossMethod.getSrcName(), fossMethod.getSrcDesc(), arg.getArgPosition(), - arg.getLvIndex(), arg.getSrcName(), output.getDstNamespaces().stream().map(ns -> - ns.equals("srg") ? arg.getName("named") : arg.getName(ns)).toArray(String[]::new)); - } + flatOutput.visitMethod(obf, def.getName("official"), def.getDesc("official"), methodNames.toArray(new String[0])); } for (MappingTree.FieldMapping field : klass.getFields()) { - MappingTree.FieldMapping fossField = CollectionUtil.find( - fossClass.getFields(), - f -> f.getSrcName().equals(field.getSrcName()) + MappingTree.FieldMapping def = CollectionUtil.find( + classDef.getFields(), + f -> f.getName("official").equals(field.getSrcName()) ).orElse(nullOrThrow(lenient, () -> new MappingException("Missing field: " + field.getSrcName() + " (srg: " + field.getDstName(0) + ")"))); - if (fossField == null) { - logger.debug("Missing field: " + field.getSrcName() + " (srg: " + field.getDstName(0) + ") " + fossClass.getFields().size() + " fields in the original class"); + if (def == null) { + if (tryMatchRegardlessSrgsField(addRegardlessSrgs, obf, output, flatOutput, field)) continue; + continue; } - flatOutput.visitField(obf, fossField.getSrcName(), fossField.getSrcDesc(), output.getDstNamespaces().stream().map(ns -> - ns.equals("srg") ? field.getDstName(0) : fossField.getName(ns)).toArray(String[]::new)); + List<String> fieldNames = CollectionUtil.map( + output.getDstNamespaces(), + namespace -> "srg".equals(namespace) ? field.getDstName(0) : def.getName(namespace) + ); + + flatOutput.visitField(obf, def.getName("official"), def.getDesc("official"), fieldNames.toArray(new String[0])); } } - private static boolean tryMatchRegardlessSrgs(Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, String obf, MappingTree.MethodMapping method) { + private static boolean tryMatchRegardlessSrgsMethod(Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, String obf, + MappingTree output, FlatMappingVisitor flatOutput, MappingTree.MethodMapping method) throws IOException { List<MappingTreeView.MemberMappingView> mutableDescriptoredList = addRegardlessSrgs.get(obf); - if (!Objects.equals(method.getDstName(0), method.getSrcName())) { + if (!method.getDstName(0).equals(method.getSrcName())) { for (MappingTreeView.MemberMappingView descriptored : MoreObjects.firstNonNull(mutableDescriptoredList, Collections.<MappingTreeView.MemberMappingView>emptyList())) { - if (descriptored instanceof MappingTreeView.MethodMappingView && descriptored.getSrcName().equals(method.getSrcName()) && descriptored.getSrcDesc().equals(method.getSrcDesc())) { + if (descriptored instanceof MappingTree.MethodMapping && descriptored.getSrcName().equals(method.getSrcName()) && descriptored.getSrcDesc().equals(method.getSrcDesc())) { + List<String> methodNames = CollectionUtil.map( + output.getDstNamespaces(), + namespace -> "srg".equals(namespace) ? method.getDstName(0) : method.getSrcName() + ); + + flatOutput.visitMethod(obf, method.getSrcName(), method.getSrcDesc(), methodNames.toArray(new String[0])); + return true; + } + } + } + + return false; + } + + private static boolean tryMatchRegardlessSrgsField(Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, String obf, + MappingTree output, FlatMappingVisitor flatOutput, MappingTree.FieldMapping field) throws IOException { + List<MappingTreeView.MemberMappingView> mutableDescriptoredList = addRegardlessSrgs.get(obf); + + if (!field.getDstName(0).equals(field.getSrcName())) { + for (MappingTreeView.MemberMappingView descriptored : MoreObjects.firstNonNull(mutableDescriptoredList, Collections.<MappingTreeView.MemberMappingView>emptyList())) { + if (descriptored instanceof MappingTree.FieldMapping && descriptored.getSrcName().equals(field.getSrcName())) { + List<String> fieldNames = CollectionUtil.map( + output.getDstNamespaces(), + namespace -> "srg".equals(namespace) ? field.getDstName(0) : field.getSrcName() + ); + + flatOutput.visitField(obf, field.getSrcName(), field.getSrcDesc(), fieldNames.toArray(new String[0])); return true; } } @@ -240,4 +266,4 @@ public final class SrgMerger { throw exception.get(); } } -} +}
\ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java index 96c28e30..7463e447 100644 --- a/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java +++ b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java @@ -48,39 +48,39 @@ public class Tsrg2Writer { } private static void writeClass(List<String> namespaces, MappingTree.ClassMapping def, StringBuilder builder) { - writeMapped(false, namespaces, def, builder); + writeMapped(null, namespaces, def, builder); for (MappingTree.MethodMapping method : def.getMethods()) { writeMethod(namespaces, method, builder); } for (MappingTree.FieldMapping field : def.getFields()) { - writeMapped(true, namespaces, field, builder); + writeMapped('\t', namespaces, field, builder); } } private static void writeMethod(List<String> namespaces, MappingTree.MethodMapping def, StringBuilder builder) { - writeMapped(true, namespaces, def, builder); + writeMapped('\t', namespaces, def, builder); for (MappingTree.MethodArgMapping arg : def.getArgs()) { builder.append("\t\t").append(arg.getLvIndex()); - writeMapped(true, namespaces, arg, builder); + writeMapped(' ', namespaces, arg, builder); } } private static void writeField(List<String> namespaces, MappingTree.FieldMapping def, StringBuilder builder) { - writeMapped(true, namespaces, def, builder); + writeMapped('\t', namespaces, def, builder); } - private static void writeMapped(boolean needFirst, List<String> namespaces, MappingTreeView.ElementMappingView mapped, StringBuilder builder) { + private static void writeMapped(Character first, List<String> namespaces, MappingTreeView.ElementMappingView mapped, StringBuilder builder) { String[] names = namespaces.stream().map(mapped::getName).toArray(String[]::new); for (int i = 0; i < names.length; ++i) { String name = names[i]; if (i == 0) { - if (needFirst) { - builder.append('\t'); + if (first != null) { + builder.append(first); } } else { builder.append(' '); |