aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorJonas Herzig <jonas@spark-squared.com>2022-05-10 11:22:10 +0200
committerJonas Herzig <jonas@spark-squared.com>2022-05-10 11:22:10 +0200
commit8d369f2013363ff64b24f43138257d7f31b37796 (patch)
tree44e6f2abd305ebac2c48586f05a0f0e5d6d3f85b /src/main/java
parentc13dc23b0cad655f6df821fa6bfdd04fb93ddf1a (diff)
downloadarchitectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.tar.gz
architectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.tar.bz2
architectury-loom-8d369f2013363ff64b24f43138257d7f31b37796.zip
Fixup line numbers in forge source
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java42
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;
+ }
+ });
+ }
}