Skip to content

Commit 64e7855

Browse files
LlamaLad7modmuss50
authored andcommitted
Fix: Soft-remap inferred accessor and invoker names.
1 parent 0bbcbe4 commit 64e7855

File tree

5 files changed

+79
-237
lines changed

5 files changed

+79
-237
lines changed

src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/HardTargetMixinMethodVisitor.java

-6
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
3131
import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant;
3232
import net.fabricmc.tinyremapper.extension.mixin.common.data.MxMember;
33-
import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.AccessorAnnotationVisitor;
34-
import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.InvokerAnnotationVisitor;
3533
import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.OverwriteAnnotationVisitor;
3634
import net.fabricmc.tinyremapper.extension.mixin.hard.annotation.ShadowAnnotationVisitor;
3735

@@ -57,10 +55,6 @@ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
5755
av = new ShadowAnnotationVisitor(data, av, method, targets);
5856
} else if (Annotation.OVERWRITE.equals(descriptor)) {
5957
av = new OverwriteAnnotationVisitor(data, av, method, targets);
60-
} else if (Annotation.ACCESSOR.equals(descriptor)) {
61-
av = new AccessorAnnotationVisitor(data, av, method, targets);
62-
} else if (Annotation.INVOKER.equals(descriptor)) {
63-
av = new InvokerAnnotationVisitor(data, av, method, targets);
6458
}
6559

6660
return av;

src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/AccessorAnnotationVisitor.java

-121
This file was deleted.

src/main/java/net/fabricmc/tinyremapper/extension/mixin/hard/annotation/InvokerAnnotationVisitor.java

-106
This file was deleted.

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/AccessorAnnotationVisitor.java

+37-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.objectweb.asm.AnnotationVisitor;
2727

28+
import net.fabricmc.tinyremapper.extension.mixin.common.StringUtility;
2829
import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement;
2930
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
3031
import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant;
@@ -38,9 +39,12 @@
3839
public class AccessorAnnotationVisitor extends AnnotationVisitor {
3940
private final CommonData data;
4041

42+
private final MxMember method;
4143
private final List<String> targets;
4244
private final String fieldDesc;
4345

46+
private boolean isSoftTarget;
47+
4448
private static final Pattern GETTER_PATTERN = Pattern.compile("(?<=\\(\\)).*");
4549
private static final Pattern SETTER_PATTERN = Pattern.compile("(?<=\\().*(?=\\)V)");
4650

@@ -50,6 +54,7 @@ public AccessorAnnotationVisitor(CommonData data, AnnotationVisitor delegate, Mx
5054
this.data = Objects.requireNonNull(data);
5155
Objects.requireNonNull(method);
5256

57+
this.method = method;
5358
this.targets = Objects.requireNonNull(targets);
5459

5560
Matcher getterMatcher = GETTER_PATTERN.matcher(method.getDesc());
@@ -67,11 +72,41 @@ public AccessorAnnotationVisitor(CommonData data, AnnotationVisitor delegate, Mx
6772
@Override
6873
public void visit(String name, Object value) {
6974
if (name.equals(AnnotationElement.VALUE)) {
75+
isSoftTarget = true;
7076
String fieldName = Objects.requireNonNull((String) value);
71-
72-
value = new NamedMappable(data, fieldName, fieldDesc, targets).result();
77+
setAnnotationValue(fieldName);
78+
return;
7379
}
7480

7581
super.visit(name, value);
7682
}
83+
84+
@Override
85+
public void visitEnd() {
86+
if (!isSoftTarget) {
87+
setAnnotationValue(inferFieldName());
88+
}
89+
90+
super.visitEnd();
91+
}
92+
93+
private void setAnnotationValue(String fieldName) {
94+
super.visit(AnnotationElement.VALUE, new NamedMappable(data, fieldName, fieldDesc, targets).result());
95+
}
96+
97+
private String inferFieldName() {
98+
String prefix;
99+
100+
if (method.getName().startsWith("get")) {
101+
prefix = "get";
102+
} else if (method.getName().startsWith("set")) {
103+
prefix = "set";
104+
} else if (method.getName().startsWith("is")) {
105+
prefix = "is";
106+
} else {
107+
throw new RuntimeException(String.format("%s does not start with get, set or is.", method.getName()));
108+
}
109+
110+
return StringUtility.removeCamelPrefix(prefix, method.getName());
111+
}
77112
}

src/main/java/net/fabricmc/tinyremapper/extension/mixin/soft/annotation/InvokerAnnotationVisitor.java

+42-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.objectweb.asm.AnnotationVisitor;
2525

26+
import net.fabricmc.tinyremapper.extension.mixin.common.StringUtility;
2627
import net.fabricmc.tinyremapper.extension.mixin.common.data.AnnotationElement;
2728
import net.fabricmc.tinyremapper.extension.mixin.common.data.CommonData;
2829
import net.fabricmc.tinyremapper.extension.mixin.common.data.Constant;
@@ -39,6 +40,8 @@ public class InvokerAnnotationVisitor extends AnnotationVisitor {
3940

4041
private final List<String> targets;
4142

43+
private boolean isSoftTarget;
44+
4245
public InvokerAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxMember method, List<String> targets) {
4346
super(Constant.ASM_VERSION, Objects.requireNonNull(delegate));
4447

@@ -51,12 +54,49 @@ public InvokerAnnotationVisitor(CommonData data, AnnotationVisitor delegate, MxM
5154
@Override
5255
public void visit(String name, Object value) {
5356
if (name.equals(AnnotationElement.VALUE)) {
57+
isSoftTarget = true;
5458
String methodName = Objects.requireNonNull((String) value);
55-
String methodDesc = method.getDesc();
5659

57-
value = new NamedMappable(data, methodName, methodDesc, targets).result();
60+
setAnnotationValue(methodName);
61+
return;
5862
}
5963

6064
super.visit(name, value);
6165
}
66+
67+
@Override
68+
public void visitEnd() {
69+
if (!isSoftTarget) {
70+
String inferredName = inferMethodName();
71+
72+
if (inferredName != null) {
73+
setAnnotationValue(inferredName);
74+
}
75+
}
76+
77+
super.visitEnd();
78+
}
79+
80+
private void setAnnotationValue(String methodName) {
81+
super.visit(AnnotationElement.VALUE, new NamedMappable(data, methodName, method.getDesc(), targets).result());
82+
}
83+
84+
private String inferMethodName() {
85+
if (method.getName().startsWith("new") || method.getName().startsWith("create")) {
86+
// The rest of the name isn't important, leave it as-is
87+
return null;
88+
}
89+
90+
String prefix;
91+
92+
if (method.getName().startsWith("call")) {
93+
prefix = "call";
94+
} else if (method.getName().startsWith("invoke")) {
95+
prefix = "invoke";
96+
} else {
97+
throw new RuntimeException(String.format("%s does not start with call or invoke.", method.getName()));
98+
}
99+
100+
return StringUtility.removeCamelPrefix(prefix, method.getName());
101+
}
62102
}

0 commit comments

Comments
 (0)