diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-11-16 16:55:36 +0100 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-11-16 16:55:36 +0100 |
| commit | af9893b59407c69d31ebd2ed513f0396ab4d2dc9 (patch) | |
| tree | f4ba1cb4e9b1ed4a9fd47f13012b142d259d9bf2 /javaplugin | |
| parent | 44c1ee97c4fc4aa860c57966d938191b08d0994e (diff) | |
| download | Firmament-af9893b59407c69d31ebd2ed513f0396ab4d2dc9.tar.gz Firmament-af9893b59407c69d31ebd2ed513f0396ab4d2dc9.tar.bz2 Firmament-af9893b59407c69d31ebd2ed513f0396ab4d2dc9.zip | |
feat: new bytecode replacement framework
Diffstat (limited to 'javaplugin')
| -rw-r--r-- | javaplugin/src/main/java/moe/nea/firmament/javaplugin/IntermediaryMethodReplacer.java | 13 | ||||
| -rw-r--r-- | javaplugin/src/main/java/moe/nea/firmament/javaplugin/MappingTree.java | 22 |
2 files changed, 24 insertions, 11 deletions
diff --git a/javaplugin/src/main/java/moe/nea/firmament/javaplugin/IntermediaryMethodReplacer.java b/javaplugin/src/main/java/moe/nea/firmament/javaplugin/IntermediaryMethodReplacer.java index cb87b20..d45563b 100644 --- a/javaplugin/src/main/java/moe/nea/firmament/javaplugin/IntermediaryMethodReplacer.java +++ b/javaplugin/src/main/java/moe/nea/firmament/javaplugin/IntermediaryMethodReplacer.java @@ -31,7 +31,7 @@ public class IntermediaryMethodReplacer extends TreeScanner<Void, Void> { public void replaceMethodName(JCTree.JCMethodInvocation node) { var select = node.getMethodSelect(); if (!(select instanceof JCTree.JCFieldAccess fieldAccess)) return; - if (!fieldAccess.name.contentEquals("methodName")) return; + if (!fieldAccess.name.contentEquals("intermediaryMethod")) return; if (!(node.args.head instanceof JCTree.JCMemberReference methodReference)) { plugin.utils.reportError(sourceFile, node, "Please provide a Class::method reference directly (and nothing else)"); return; @@ -43,14 +43,17 @@ public class IntermediaryMethodReplacer extends TreeScanner<Void, Void> { type.tsym.flatName().toString(), clearName ); - fieldAccess.name = plugin.names.fromString("id"); - node.args = List.of(plugin.treeMaker.Literal(intermediaryName)); + fieldAccess.name = plugin.names.fromString("ofMethod"); + var args = List.<JCTree.JCExpression>of(plugin.treeMaker.Literal(intermediaryName.interMethodName())); + args.tail = List.of(plugin.treeMaker.Literal(intermediaryName.interClassName())); + args.tail.tail = node.args.tail; + node.args = args; } public void replaceClassName(JCTree.JCMethodInvocation node) { var select = node.getMethodSelect(); if (!(select instanceof JCTree.JCFieldAccess fieldAccess)) return; - if (!fieldAccess.name.contentEquals("className")) return; + if (!fieldAccess.name.contentEquals("intermediaryClass")) return; if (node.getTypeArguments().size() != 1) { plugin.utils.reportError(sourceFile, node, "You need to explicitly provide the class you want the intermediary name for"); return; @@ -63,7 +66,7 @@ public class IntermediaryMethodReplacer extends TreeScanner<Void, Void> { plugin.utils.reportError(sourceFile, node, "Unknown class name " + sourceName); return; } - fieldAccess.name = plugin.names.fromString("id"); + fieldAccess.name = plugin.names.fromString("ofIntermediaryClass"); node.typeargs = List.nil(); node.args = List.of(plugin.treeMaker.Literal(mappedName)); } diff --git a/javaplugin/src/main/java/moe/nea/firmament/javaplugin/MappingTree.java b/javaplugin/src/main/java/moe/nea/firmament/javaplugin/MappingTree.java index eef5f9a..36713b6 100644 --- a/javaplugin/src/main/java/moe/nea/firmament/javaplugin/MappingTree.java +++ b/javaplugin/src/main/java/moe/nea/firmament/javaplugin/MappingTree.java @@ -18,15 +18,21 @@ public class MappingTree { if (sourceIndex < 0) throw new RuntimeException("Could not find source namespace " + sourceNamespace + " in mappings file."); this.classLookup = tinyV2File - .getClassEntries() - .stream() - .collect(Collectors.toMap(it -> it.getClassNames().get(sourceIndex), it -> it)); + .getClassEntries() + .stream() + .collect(Collectors.toMap(it -> it.getClassNames().get(sourceIndex), it -> it)); targetIndex = tinyV2File.getHeader().getNamespaces().indexOf(targetNamespace); if (targetIndex < 0) throw new RuntimeException("Could not find target namespace " + targetNamespace + " in mappings file."); } - public String resolveMethodToIntermediary(String className, String methodName) { + public record MethodCoordinate( + String interClassName, + String interMethodName + ) { + } + + public MethodCoordinate resolveMethodToIntermediary(String className, String methodName) { var classData = classLookup.get(className.replace(".", "/")); TinyMethod candidate = null; for (TinyMethod method : classData.getMethods()) { @@ -37,7 +43,11 @@ public class MappingTree { candidate = method; } } - return candidate.getMethodNames().get(targetIndex); + if (candidate == null) + throw new RuntimeException("Couldd not find candidate for method " + className + "." + methodName); + return new MethodCoordinate( + classData.getClassNames().get(targetIndex), + candidate.getMethodNames().get(targetIndex)); } public String resolveClassToIntermediary(String className) { @@ -46,6 +56,6 @@ public class MappingTree { return null; } return cls.getClassNames().get(targetIndex) - .replace("/", "."); + .replace("/", "."); } } |
