diff options
author | Jonas Herzig <jonas@spark-squared.com> | 2022-05-10 11:22:10 +0200 |
---|---|---|
committer | Jonas Herzig <jonas@spark-squared.com> | 2022-05-10 11:22:10 +0200 |
commit | 8d369f2013363ff64b24f43138257d7f31b37796 (patch) | |
tree | 44e6f2abd305ebac2c48586f05a0f0e5d6d3f85b /src | |
parent | c13dc23b0cad655f6df821fa6bfdd04fb93ddf1a (diff) | |
download | architectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.tar.gz architectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.tar.bz2 architectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.zip |
Fixup line numbers in forge source
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java index 5b523153..6456f882 100644 --- a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java +++ b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java @@ -28,9 +28,12 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.UncheckedIOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -39,6 +42,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.apache.commons.io.output.NullOutputStream; import org.cadixdev.lorenz.MappingSet; @@ -229,6 +233,7 @@ public class ForgeSourcesRemapper { try (FileSystemUtil.Delegate outputFs = FileSystemUtil.getJarFileSystem(tmpOutput, true)) { Path outputFsRoot = outputFs.get().getPath("/"); mercury.rewrite(tmpInput, outputFsRoot); + fixupLineNumbers(tmpInput, outputFsRoot); } catch (Exception e) { project.getLogger().warn("Could not remap " + tmpInput + " fully!", e); } @@ -256,4 +261,41 @@ public class ForgeSourcesRemapper { taskCompleter.complete(); return sources; } + + /** + * Mercury re-organizes imports during remapping, which can result in mismatching line information when debugging. + * This method works around the issue by forcefully re-aligning the output files with the input files by inserting + * empty lines or joining multiple lines into one. + */ + private static void fixupLineNumbers(Path srcRoot, Path outRoot) throws IOException { + Files.walkFileTree(srcRoot, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path srcPath, BasicFileAttributes attrs) throws IOException { + Path outPath = outRoot.resolve(srcRoot.relativize(srcPath).toString()); + List<String> src = Files.readAllLines(srcPath); + List<String> out = Files.readAllLines(outPath); + int lastSrc = IntStream.range(0, src.size()).filter(i -> src.get(i).startsWith("import")).max().orElse(0); + int lastOut = IntStream.range(0, out.size()).filter(i -> out.get(i).startsWith("import")).max().orElse(0); + + if (lastSrc == lastOut) { + return FileVisitResult.CONTINUE; + } + + while (lastOut < lastSrc) { + out.add(lastOut + 1, ""); + lastOut++; + } + + while (lastSrc < lastOut && lastOut > 0) { + out.set(lastOut - 1, out.get(lastOut - 1) + out.get(lastOut)); + out.remove(lastOut); + lastOut--; + } + + Files.write(outPath, out); + + return FileVisitResult.CONTINUE; + } + }); + } } |