Skip to content

Commit 79db668

Browse files
committed
better support to not remap stuff that doesn't match
1 parent 11ea04b commit 79db668

File tree

1 file changed

+57
-8
lines changed

1 file changed

+57
-8
lines changed

src/main/java/xyz/wagyourtail/unimined/jarmodagent/transformer/RefmapSupportingTransformManager.java

+57-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package xyz.wagyourtail.unimined.jarmodagent.transformer;
22

33
import net.lenni0451.classtransform.TransformerManager;
4+
import net.lenni0451.classtransform.mappings.annotation.AnnotationRemap;
45
import net.lenni0451.classtransform.utils.ASMUtils;
56
import net.lenni0451.classtransform.utils.tree.IClassProvider;
67
import org.objectweb.asm.*;
@@ -9,8 +10,10 @@
910

1011
import java.io.File;
1112
import java.io.IOException;
13+
import java.lang.reflect.Method;
1214
import java.nio.file.Files;
1315
import java.util.HashMap;
16+
import java.util.HashSet;
1417
import java.util.Map;
1518
import java.util.Set;
1619

@@ -63,7 +66,7 @@ protected AnnotationStringRemappingClassVisitor(int api, ClassVisitor classVisit
6366
@Override
6467
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
6568
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
66-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
69+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false);
6770
}
6871

6972
@Override
@@ -73,7 +76,7 @@ public FieldVisitor visitField(int access, String name, String descriptor, Strin
7376
@Override
7477
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
7578
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
76-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
79+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false);
7780
}
7881
};
7982
}
@@ -85,30 +88,76 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
8588
@Override
8689
public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
8790
AnnotationVisitor av = super.visitAnnotation(descriptor, visible);
88-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
91+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false);
8992
}
9093

9194
@Override
9295
public AnnotationVisitor visitParameterAnnotation(int parameter, String descriptor, boolean visible) {
9396
AnnotationVisitor av = super.visitParameterAnnotation(parameter, descriptor, visible);
94-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
97+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false);
9598
}
9699
};
97100
}
98101
}
99102

100103
public static class RemappingAnnotationVisitor extends AnnotationVisitor {
104+
private static final Set<String> failed = new HashSet<>();
105+
101106
Map<String, String> refmap;
107+
boolean allowNullNameRemap;
108+
Class<?> annotationType;
109+
102110

103-
protected RemappingAnnotationVisitor(int api, AnnotationVisitor annotationVisitor, Map<String, String> refmap) {
111+
protected RemappingAnnotationVisitor(int api, AnnotationVisitor annotationVisitor, Map<String, String> refmap, String descriptor, boolean allowNullNameRemap) {
104112
super(api, annotationVisitor);
105113
this.refmap = refmap;
114+
this.allowNullNameRemap = allowNullNameRemap;
115+
try {
116+
if (descriptor != null) {
117+
if (descriptor.startsWith("L")) descriptor = descriptor.substring(1);
118+
if (descriptor.endsWith(";")) descriptor = descriptor.substring(0, descriptor.length() - 1);
119+
this.annotationType = Class.forName(descriptor.replace('/', '.'));
120+
}
121+
} catch (ClassNotFoundException e) {
122+
if (failed.add(descriptor)) {
123+
System.err.println("[JarModAgent] Failed to find annotation class " + descriptor);
124+
}
125+
}
126+
JarModder.debug("remapping annotation " + descriptor);
127+
}
128+
129+
public boolean testName(String name) {
130+
if (name == null) {
131+
if (allowNullNameRemap) {
132+
return true;
133+
} else {
134+
name = "value";
135+
}
136+
}
137+
if (annotationType != null) {
138+
try {
139+
Method m = annotationType.getDeclaredMethod(name);
140+
if (m.getAnnotation(AnnotationRemap.class) == null) {
141+
JarModder.debug("not remapping " + name + " because it doesn't have @AnnotationRemap");
142+
return false;
143+
}
144+
} catch (NoSuchMethodException e) {
145+
throw new RuntimeException(e);
146+
}
147+
} else {
148+
return false;
149+
}
150+
return true;
106151
}
107152

108153
@Override
109154
public void visit(String name, Object value) {
155+
if (!testName(name)) {
156+
super.visit(name, value);
157+
return;
158+
}
110159
if (value instanceof String) {
111-
System.out.println("remapping \"" + name + "\" \"" + value + "\" to \"" + refmap.getOrDefault(value, (String) value) + "\"");
160+
JarModder.debug("remapping \"" + name + "\" \"" + value + "\" to \"" + refmap.getOrDefault(value, (String) value) + "\"");
112161
super.visit(name, refmap.getOrDefault(value, (String) value));
113162
} else {
114163
super.visit(name, value);
@@ -118,13 +167,13 @@ public void visit(String name, Object value) {
118167
@Override
119168
public AnnotationVisitor visitAnnotation(String name, String descriptor) {
120169
AnnotationVisitor av = super.visitAnnotation(name, descriptor);
121-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
170+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, descriptor, false);
122171
}
123172

124173
@Override
125174
public AnnotationVisitor visitArray(String name) {
126175
AnnotationVisitor av = super.visitArray(name);
127-
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap);
176+
return av == null ? null : new RemappingAnnotationVisitor(api, av, refmap, null, true);
128177
}
129178
}
130179
}

0 commit comments

Comments
 (0)