1 package org.apache.maven.shared.dependency.analyzer.asm;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.HashSet;
23 import java.util.Set;
24
25 import org.objectweb.asm.AnnotationVisitor;
26 import org.objectweb.asm.Attribute;
27 import org.objectweb.asm.ClassVisitor;
28 import org.objectweb.asm.FieldVisitor;
29 import org.objectweb.asm.Label;
30 import org.objectweb.asm.MethodVisitor;
31 import org.objectweb.asm.Type;
32 import org.objectweb.asm.signature.SignatureReader;
33 import org.objectweb.asm.signature.SignatureVisitor;
34
35
36
37
38
39
40
41
42
43 public class DependencyVisitor
44 implements AnnotationVisitor, SignatureVisitor, ClassVisitor, FieldVisitor, MethodVisitor
45 {
46
47
48 private final Set<String> classes;
49
50
51
52 public DependencyVisitor()
53 {
54 classes = new HashSet<String>();
55 }
56
57
58
59
60
61
62
63 public void visit( final int version, final int access, final String name, final String signature,
64 final String superName, final String[] interfaces )
65 {
66 if ( signature == null )
67 {
68 addName( superName );
69 addNames( interfaces );
70 }
71 else
72 {
73 addSignature( signature );
74 }
75 }
76
77
78
79
80 public void visitSource( final String source, final String debug )
81 {
82
83 }
84
85
86
87
88 public void visitOuterClass( final String owner, final String name, final String desc )
89 {
90
91
92 }
93
94
95
96
97 public AnnotationVisitor visitAnnotation( final String desc, final boolean visible )
98 {
99 addDesc( desc );
100
101 return this;
102 }
103
104
105
106
107 public void visitAttribute( final Attribute attr )
108 {
109
110 }
111
112
113
114
115 public void visitInnerClass( final String name, final String outerName, final String innerName, final int access )
116 {
117
118
119 }
120
121
122
123
124
125 public FieldVisitor visitField( final int access, final String name, final String desc, final String signature,
126 final Object value )
127 {
128 if ( signature == null )
129 {
130 addDesc( desc );
131 }
132 else
133 {
134 addTypeSignature( signature );
135 }
136
137 if ( value instanceof Type )
138 {
139 addType( (Type) value );
140 }
141
142 return this;
143 }
144
145
146
147
148
149 public MethodVisitor visitMethod( final int access, final String name, final String desc, final String signature,
150 final String[] exceptions )
151 {
152 if ( signature == null )
153 {
154 addMethodDesc( desc );
155 }
156 else
157 {
158 addSignature( signature );
159 }
160
161 addNames( exceptions );
162
163 return this;
164 }
165
166
167
168
169
170
171 public AnnotationVisitor visitAnnotationDefault()
172 {
173 return this;
174 }
175
176
177
178
179 public AnnotationVisitor visitParameterAnnotation( final int parameter, final String desc, final boolean visible )
180 {
181 addDesc( desc );
182
183 return this;
184 }
185
186
187
188
189 public void visitCode()
190 {
191
192 }
193
194
195
196
197 public void visitFrame( final int type, final int nLocal, final Object[] local, final int nStack,
198 final Object[] stack )
199 {
200
201 }
202
203
204
205
206 public void visitInsn( final int opcode )
207 {
208
209 }
210
211
212
213
214 public void visitIntInsn( final int opcode, final int operand )
215 {
216
217 }
218
219
220
221
222 public void visitVarInsn( final int opcode, final int var )
223 {
224
225 }
226
227
228
229
230 public void visitTypeInsn( final int opcode, final String desc )
231 {
232 if ( desc.charAt( 0 ) == '[' )
233 {
234 addDesc( desc );
235 }
236 else
237 {
238 addName( desc );
239 }
240 }
241
242
243
244
245 public void visitFieldInsn( final int opcode, final String owner, final String name, final String desc )
246 {
247 addName( owner );
248
249
250
251
252
253
254 }
255
256
257
258
259 public void visitMethodInsn( final int opcode, final String owner, final String name, final String desc )
260 {
261 addName( owner );
262
263
264
265
266
267
268 }
269
270
271
272
273 public void visitJumpInsn( final int opcode, final Label label )
274 {
275
276 }
277
278
279
280
281 public void visitLabel( final Label label )
282 {
283
284 }
285
286
287
288
289 public void visitLdcInsn( final Object cst )
290 {
291 if ( cst instanceof Type )
292 {
293 addType( (Type) cst );
294 }
295 }
296
297
298
299
300 public void visitIincInsn( final int var, final int increment )
301 {
302
303 }
304
305
306
307
308
309 public void visitTableSwitchInsn( final int min, final int max, final Label dflt, final Label[] labels )
310 {
311
312 }
313
314
315
316
317
318 public void visitLookupSwitchInsn( final Label dflt, final int[] keys, final Label[] labels )
319 {
320
321 }
322
323
324
325
326 public void visitMultiANewArrayInsn( final String desc, final int dims )
327 {
328 addDesc( desc );
329 }
330
331
332
333
334
335 public void visitTryCatchBlock( final Label start, final Label end, final Label handler, final String type )
336 {
337 addName( type );
338 }
339
340
341
342
343
344 public void visitLocalVariable( final String name, final String desc, final String signature, final Label start,
345 final Label end, final int index )
346 {
347 if ( signature == null )
348 {
349 addDesc( desc );
350 }
351 else
352 {
353 addTypeSignature( signature );
354 }
355 }
356
357
358
359
360 public void visitLineNumber( final int line, final Label start )
361 {
362
363 }
364
365
366
367
368 public void visitMaxs( final int maxStack, final int maxLocals )
369 {
370
371 }
372
373
374
375
376
377
378 public void visit( final String name, final Object value )
379 {
380 if ( value instanceof Type )
381 {
382 addType( (Type) value );
383 }
384 }
385
386
387
388
389 public void visitEnum( final String name, final String desc, final String value )
390 {
391 addDesc( desc );
392 }
393
394
395
396
397 public AnnotationVisitor visitAnnotation( final String name, final String desc )
398 {
399 addDesc( desc );
400
401 return this;
402 }
403
404
405
406
407 public AnnotationVisitor visitArray( final String name )
408 {
409 return this;
410 }
411
412
413
414
415 public void visitEnd()
416 {
417
418 }
419
420
421
422
423
424
425 public void visitFormalTypeParameter( final String name )
426 {
427
428 }
429
430
431
432
433 public SignatureVisitor visitClassBound()
434 {
435 return this;
436 }
437
438
439
440
441 public SignatureVisitor visitInterfaceBound()
442 {
443 return this;
444 }
445
446
447
448
449 public SignatureVisitor visitSuperclass()
450 {
451 return this;
452 }
453
454
455
456
457 public SignatureVisitor visitInterface()
458 {
459 return this;
460 }
461
462
463
464
465 public SignatureVisitor visitParameterType()
466 {
467 return this;
468 }
469
470
471
472
473 public SignatureVisitor visitReturnType()
474 {
475 return this;
476 }
477
478
479
480
481 public SignatureVisitor visitExceptionType()
482 {
483 return this;
484 }
485
486
487
488
489 public void visitBaseType( final char descriptor )
490 {
491
492 }
493
494
495
496
497 public void visitTypeVariable( final String name )
498 {
499
500 }
501
502
503
504
505 public SignatureVisitor visitArrayType()
506 {
507 return this;
508 }
509
510
511
512
513 public void visitClassType( final String name )
514 {
515 addName( name );
516 }
517
518
519
520
521 public void visitInnerClassType( final String name )
522 {
523 addName( name );
524 }
525
526
527
528
529 public void visitTypeArgument()
530 {
531
532 }
533
534
535
536
537 public SignatureVisitor visitTypeArgument( final char wildcard )
538 {
539 return this;
540 }
541
542
543
544 public Set<String> getClasses()
545 {
546 return classes;
547 }
548
549
550
551 private void addName( String name )
552 {
553 if ( name == null )
554 {
555 return;
556 }
557
558
559 if ( name.startsWith( "[L" ) && name.endsWith( ";" ) )
560 {
561 name = name.substring( 2, name.length() - 1 );
562 }
563
564
565 name = name.replace( '/', '.' );
566
567 classes.add( name );
568 }
569
570 private void addNames( final String[] names )
571 {
572 if ( names == null )
573 {
574 return;
575 }
576
577 for ( String name : names )
578 {
579 addName( name );
580 }
581 }
582
583 private void addDesc( final String desc )
584 {
585 addType( Type.getType( desc ) );
586 }
587
588 private void addMethodDesc( final String desc )
589 {
590 addType( Type.getReturnType( desc ) );
591
592 Type[] types = Type.getArgumentTypes( desc );
593
594 for ( Type type : types )
595 {
596 addType( type );
597 }
598 }
599
600 private void addType( final Type t )
601 {
602 switch ( t.getSort() )
603 {
604 case Type.ARRAY:
605 addType( t.getElementType() );
606 break;
607
608 case Type.OBJECT:
609 addName( t.getClassName().replace( '.', '/' ) );
610 break;
611 }
612 }
613
614 private void addSignature( final String signature )
615 {
616 if ( signature != null )
617 {
618 new SignatureReader( signature ).accept( this );
619 }
620 }
621
622 private void addTypeSignature( final String signature )
623 {
624 if ( signature != null )
625 {
626 new SignatureReader( signature ).acceptType( this );
627 }
628 }
629 }