diff --git a/deob-annotations/src/main/java/dev/openrs2/deob/annotation/OriginalArg.java b/deob-annotations/src/main/java/dev/openrs2/deob/annotation/OriginalArg.java new file mode 100644 index 00000000..1b287881 --- /dev/null +++ b/deob-annotations/src/main/java/dev/openrs2/deob/annotation/OriginalArg.java @@ -0,0 +1,9 @@ +package dev.openrs2.deob.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.PARAMETER }) +public @interface OriginalArg { + int value(); +} diff --git a/deob/src/main/java/dev/openrs2/deob/transform/OriginalNameTransformer.java b/deob/src/main/java/dev/openrs2/deob/transform/OriginalNameTransformer.java index 596bdefd..b976e85a 100644 --- a/deob/src/main/java/dev/openrs2/deob/transform/OriginalNameTransformer.java +++ b/deob/src/main/java/dev/openrs2/deob/transform/OriginalNameTransformer.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import dev.openrs2.asm.Transformer; +import dev.openrs2.deob.annotation.OriginalArg; import dev.openrs2.deob.annotation.OriginalClass; import dev.openrs2.deob.annotation.OriginalMember; import org.objectweb.asm.Type; @@ -29,6 +30,12 @@ public final class OriginalNameTransformer extends Transformer { return annotation; } + private static AnnotationNode createOriginalArgAnnotation(int index) { + var annotation = new AnnotationNode(Type.getDescriptor(OriginalArg.class)); + annotation.values = List.of("value", index); + return annotation; + } + @Override public void transformClass(ClassNode clazz) { if (clazz.invisibleAnnotations == null) { @@ -45,6 +52,7 @@ public final class OriginalNameTransformer extends Transformer { field.invisibleAnnotations.add(createOriginalMemberAnnotation(clazz.name, field.name, field.desc)); } + @SuppressWarnings("unchecked") @Override public void transformMethod(ClassNode clazz, MethodNode method) { if (method.name.equals("") || method.name.equals("")) { @@ -55,5 +63,17 @@ public final class OriginalNameTransformer extends Transformer { method.invisibleAnnotations = new ArrayList<>(); } method.invisibleAnnotations.add(createOriginalMemberAnnotation(clazz.name, method.name, method.desc)); + + int args = Type.getArgumentTypes(method.desc).length; + if (method.invisibleParameterAnnotations == null) { + method.invisibleParameterAnnotations = (List[]) new List[args]; + } + for (int i = 0; i < method.invisibleParameterAnnotations.length; i++) { + var annotations = method.invisibleParameterAnnotations[i]; + if (annotations == null) { + annotations = method.invisibleParameterAnnotations[i] = new ArrayList<>(); + } + annotations.add(createOriginalArgAnnotation(i)); + } } }