1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.dependency.analyzer.asm;
20
21 import org.objectweb.asm.AnnotationVisitor;
22 import org.objectweb.asm.ClassVisitor;
23 import org.objectweb.asm.FieldVisitor;
24 import org.objectweb.asm.MethodVisitor;
25 import org.objectweb.asm.Opcodes;
26 import org.objectweb.asm.Type;
27 import org.objectweb.asm.signature.SignatureReader;
28 import org.objectweb.asm.signature.SignatureVisitor;
29
30
31
32
33
34
35
36 public class DefaultClassVisitor extends ClassVisitor {
37 private final ResultCollector resultCollector;
38
39 private final SignatureVisitor signatureVisitor;
40
41 private final AnnotationVisitor annotationVisitor;
42
43 private final FieldVisitor fieldVisitor;
44
45 private final MethodVisitor methodVisitor;
46
47 private final String usedByClass;
48
49
50
51
52
53
54
55
56
57
58 public DefaultClassVisitor(
59 SignatureVisitor signatureVisitor,
60 AnnotationVisitor annotationVisitor,
61 FieldVisitor fieldVisitor,
62 MethodVisitor methodVisitor,
63 ResultCollector resultCollector,
64 String usedByClass) {
65 super(Opcodes.ASM9);
66 this.signatureVisitor = signatureVisitor;
67 this.annotationVisitor = annotationVisitor;
68 this.fieldVisitor = fieldVisitor;
69 this.methodVisitor = methodVisitor;
70 this.resultCollector = resultCollector;
71 this.usedByClass = usedByClass;
72 }
73
74
75
76
77
78
79
80
81
82
83
84 @Override
85 public void visit(
86 final int version,
87 final int access,
88 final String name,
89 final String signature,
90 final String superName,
91 final String[] interfaces) {
92 if (signature == null) {
93 resultCollector.addName(usedByClass, superName);
94 resultCollector.addNames(usedByClass, interfaces);
95 } else {
96 addSignature(signature);
97 }
98 }
99
100
101 @Override
102 public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
103 resultCollector.addDesc(usedByClass, desc);
104
105 return annotationVisitor;
106 }
107
108
109 @Override
110 public FieldVisitor visitField(
111 final int access, final String name, final String desc, final String signature, final Object value) {
112 if (signature == null) {
113 resultCollector.addDesc(usedByClass, desc);
114 } else {
115 addTypeSignature(signature);
116 }
117
118 if (value instanceof Type) {
119 resultCollector.addType(usedByClass, (Type) value);
120 }
121
122 return fieldVisitor;
123 }
124
125
126
127
128
129
130
131
132
133
134
135 @Override
136 public MethodVisitor visitMethod(
137 final int access, final String name, final String desc, final String signature, final String[] exceptions) {
138 if (signature == null) {
139 resultCollector.addMethodDesc(usedByClass, desc);
140 } else {
141 addSignature(signature);
142 }
143
144 resultCollector.addNames(usedByClass, exceptions);
145
146 return methodVisitor;
147 }
148
149
150 @Override
151 public void visitNestHost(final String nestHost) {
152 resultCollector.addName(usedByClass, nestHost);
153 }
154
155
156 @Override
157 public void visitNestMember(final String nestMember) {
158 resultCollector.addName(usedByClass, nestMember);
159 }
160
161 private void addSignature(final String signature) {
162 if (signature != null) {
163 new SignatureReader(signature).accept(signatureVisitor);
164 }
165 }
166
167 private void addTypeSignature(final String signature) {
168 if (signature != null) {
169 new SignatureReader(signature).acceptType(signatureVisitor);
170 }
171 }
172 }