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 }