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      @Override
81      public void visit(
82              final int version,
83              final int access,
84              final String name,
85              final String signature,
86              final String superName,
87              final String[] interfaces) {
88          if (signature == null) {
89              resultCollector.addName(superName);
90              resultCollector.addNames(interfaces);
91          } else {
92              addSignature(signature);
93          }
94      }
95  
96      /** {@inheritDoc} */
97      @Override
98      public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
99          resultCollector.addDesc(desc);
100 
101         return annotationVisitor;
102     }
103 
104     /** {@inheritDoc} */
105     @Override
106     public FieldVisitor visitField(
107             final int access, final String name, final String desc, final String signature, final Object value) {
108         if (signature == null) {
109             resultCollector.addDesc(desc);
110         } else {
111             addTypeSignature(signature);
112         }
113 
114         if (value instanceof Type) {
115             resultCollector.addType((Type) value);
116         }
117 
118         return fieldVisitor;
119     }
120 
121     /**
122      * <p>visitMethod.</p>
123      *
124      * @param access a int.
125      * @param name a {@link java.lang.String} object.
126      * @param desc a {@link java.lang.String} object.
127      * @param signature a {@link java.lang.String} object.
128      * @param exceptions an array of {@link java.lang.String} objects.
129      * @return a {@link org.objectweb.asm.MethodVisitor} object.
130      */
131     @Override
132     public MethodVisitor visitMethod(
133             final int access, final String name, final String desc, final String signature, final String[] exceptions) {
134         if (signature == null) {
135             resultCollector.addMethodDesc(desc);
136         } else {
137             addSignature(signature);
138         }
139 
140         resultCollector.addNames(exceptions);
141 
142         return methodVisitor;
143     }
144 
145     /** {@inheritDoc} */
146     @Override
147     public void visitNestHost(final String nestHost) {
148         resultCollector.addName(nestHost);
149     }
150 
151     /** {@inheritDoc} */
152     @Override
153     public void visitNestMember(final String nestMember) {
154         resultCollector.addName(nestMember);
155     }
156 
157     private void addSignature(final String signature) {
158         if (signature != null) {
159             new SignatureReader(signature).accept(signatureVisitor);
160         }
161     }
162 
163     private void addTypeSignature(final String signature) {
164         if (signature != null) {
165             new SignatureReader(signature).acceptType(signatureVisitor);
166         }
167     }
168 }