View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Computes the set of classes referenced by visited code.
32   * Inspired by <code>org.objectweb.asm.depend.DependencyVisitor</code> in the ASM dependencies example.
33   *
34   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
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      /**
48       * <p>Constructor for DefaultClassVisitor.</p>
49       *
50       * @param signatureVisitor a {@link org.objectweb.asm.signature.SignatureVisitor} object.
51       * @param annotationVisitor a {@link org.objectweb.asm.AnnotationVisitor} object.
52       * @param fieldVisitor a {@link org.objectweb.asm.FieldVisitor} object.
53       * @param methodVisitor a {@link org.objectweb.asm.MethodVisitor} object.
54       * @param resultCollector a {@link org.apache.maven.shared.dependency.analyzer.asm.ResultCollector} object.
55       */
56      public DefaultClassVisitor(
57              SignatureVisitor signatureVisitor,
58              AnnotationVisitor annotationVisitor,
59              FieldVisitor fieldVisitor,
60              MethodVisitor methodVisitor,
61              ResultCollector resultCollector) {
62          super(Opcodes.ASM9);
63          this.signatureVisitor = signatureVisitor;
64          this.annotationVisitor = annotationVisitor;
65          this.fieldVisitor = fieldVisitor;
66          this.methodVisitor = methodVisitor;
67          this.resultCollector = resultCollector;
68      }
69  
70      /**
71       * <p>visit.</p>
72       *
73       * @param version a int.
74       * @param access a int.
75       * @param name a {@link java.lang.String} object.
76       * @param signature a {@link java.lang.String} object.
77       * @param superName a {@link java.lang.String} object.
78       * @param interfaces an array of {@link java.lang.String} objects.
79       */
80      public void visit(
81              final int version,
82              final int access,
83              final String name,
84              final String signature,
85              final String superName,
86              final String[] interfaces) {
87          if (signature == null) {
88              resultCollector.addName(superName);
89              resultCollector.addNames(interfaces);
90          } else {
91              addSignature(signature);
92          }
93      }
94  
95      /** {@inheritDoc} */
96      public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
97          resultCollector.addDesc(desc);
98  
99          return annotationVisitor;
100     }
101 
102     /** {@inheritDoc} */
103     public FieldVisitor visitField(
104             final int access, final String name, final String desc, final String signature, final Object value) {
105         if (signature == null) {
106             resultCollector.addDesc(desc);
107         } else {
108             addTypeSignature(signature);
109         }
110 
111         if (value instanceof Type) {
112             resultCollector.addType((Type) value);
113         }
114 
115         return fieldVisitor;
116     }
117 
118     /**
119      * <p>visitMethod.</p>
120      *
121      * @param access a int.
122      * @param name a {@link java.lang.String} object.
123      * @param desc a {@link java.lang.String} object.
124      * @param signature a {@link java.lang.String} object.
125      * @param exceptions an array of {@link java.lang.String} objects.
126      * @return a {@link org.objectweb.asm.MethodVisitor} object.
127      */
128     public MethodVisitor visitMethod(
129             final int access, final String name, final String desc, final String signature, final String[] exceptions) {
130         if (signature == null) {
131             resultCollector.addMethodDesc(desc);
132         } else {
133             addSignature(signature);
134         }
135 
136         resultCollector.addNames(exceptions);
137 
138         return methodVisitor;
139     }
140 
141     /** {@inheritDoc} */
142     public void visitNestHost(final String nestHost) {
143         resultCollector.addName(nestHost);
144     }
145 
146     /** {@inheritDoc} */
147     public void visitNestMember(final String nestMember) {
148         resultCollector.addName(nestMember);
149     }
150 
151     private void addSignature(final String signature) {
152         if (signature != null) {
153             new SignatureReader(signature).accept(signatureVisitor);
154         }
155     }
156 
157     private void addTypeSignature(final String signature) {
158         if (signature != null) {
159             new SignatureReader(signature).acceptType(signatureVisitor);
160         }
161     }
162 }