diff options
Diffstat (limited to 'javaplugin')
3 files changed, 25 insertions, 11 deletions
diff --git a/javaplugin/build.gradle.kts b/javaplugin/build.gradle.kts index 6982a5a..dc461bc 100644 --- a/javaplugin/build.gradle.kts +++ b/javaplugin/build.gradle.kts @@ -1,6 +1,7 @@ plugins { java idea + id("firmament.common") } dependencies { implementation("net.fabricmc:stitch:0.6.2") 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("/", "."); } } |
