-
Notifications
You must be signed in to change notification settings - Fork 0
/
HierarchyVisitor.java
110 lines (100 loc) · 4.68 KB
/
HierarchyVisitor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package bridge.mvn;
import bridge.asm.HierarchyScanner;
import bridge.asm.TypeMap;
import org.objectweb.asm.*;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
final class HierarchyVisitor extends HierarchyScanner {
private static final String[] EMPTY = new String[0];
private final AdjustmentData adjust;
HierarchyVisitor(TypeMap types) {
super(types);
data = adjust = new AdjustmentData();
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (!visible) {
if (desc.equals("Lbridge/Adopt;")) {
return new AnnotationVisitor(Opcodes.ASM9) {
LinkedList<String> implemented;
String extended;
String signature;
boolean clean;
@Override
public void visit(String name, Object value) {
if (name.equals("clean")) {
clean = (boolean) value;
} else if (name.equals("parent")) {
extended = ((Type) value).getInternalName();
} else {
signature = value.toString();
}
}
@Override
public AnnotationVisitor visitArray(String name) {
if (implemented == null) implemented = new LinkedList<>();
return new AnnotationVisitor(Opcodes.ASM9) {
public void visit(String name, Object value) {
implemented.add(((Type) value).getInternalName());
}
};
}
@Override
public void visitEnd() {
int i;
if (implemented != null && implemented.size() != 0) {
if (!clean && HierarchyVisitor.super.implemented != null && (i = HierarchyVisitor.super.implemented.length) != 0) {
String[] array = HierarchyVisitor.super.implemented = Arrays.copyOf(HierarchyVisitor.super.implemented, i + implemented.size(), String[].class);
for (Iterator<String> it = implemented.iterator(); it.hasNext();) array[i++] = it.next();
} else {
HierarchyVisitor.super.implemented = implemented.toArray(new String[0]);
}
} else if (clean) {
HierarchyVisitor.super.implemented = EMPTY;
}
if (extended != null) {
HierarchyVisitor.super.extended = extended;
} else if (clean) {
HierarchyVisitor.super.extended = "java/lang/Object";
}
adjust.signature = signature;
adjust.adopted = true;
}
};
} else if (desc.equals("Lbridge/Synthetic;")) {
access |= Opcodes.ACC_SYNTHETIC;
return null;
}
}
return super.visitAnnotation(desc, visible);
}
@Override
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
adjust.access.put(descriptor + name, access);
return new FieldVisitor(Opcodes.ASM9, super.visitField(access, name, descriptor, signature, value)) {
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (desc.equals("Lbridge/Synthetic;")) {
adjust.access.put(descriptor + name, access | Opcodes.ACC_SYNTHETIC);
return null;
}
return super.visitAnnotation(desc, visible);
}
};
}
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
adjust.access.put(name + descriptor, access);
return new MethodVisitor(Opcodes.ASM9, super.visitMethod(access, name, descriptor, signature, exceptions)) {
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (desc.equals("Lbridge/Synthetic;")) {
adjust.access.put(name + descriptor, access | Opcodes.ACC_SYNTHETIC);
return null;
}
return super.visitAnnotation(desc, visible);
}
};
}
}