ReferencedClassVisitor.java revision db267bc191f906f55eaef21a27110cce2ec57fdf
1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21package proguard.classfile.visitor;
22
23import proguard.classfile.*;
24import proguard.classfile.attribute.*;
25import proguard.classfile.attribute.annotation.*;
26import proguard.classfile.attribute.annotation.visitor.*;
27import proguard.classfile.attribute.visitor.*;
28import proguard.classfile.constant.*;
29import proguard.classfile.constant.visitor.ConstantVisitor;
30import proguard.classfile.util.SimplifiedVisitor;
31
32/**
33 * This ClassVisitor, MemberVisitor, ConstantVisitor, AttributeVisitor, etc.
34 * lets a given ClassVisitor visit all the referenced classes of the elements
35 * that it visits. Only downstream elements are considered (in order to avoid
36 * loops and repeated visits).
37 *
38 * @author Eric Lafortune
39 */
40public class ReferencedClassVisitor
41extends      SimplifiedVisitor
42implements   ClassVisitor,
43             MemberVisitor,
44             ConstantVisitor,
45             AttributeVisitor,
46             LocalVariableInfoVisitor,
47             LocalVariableTypeInfoVisitor,
48             AnnotationVisitor,
49             ElementValueVisitor
50{
51    private final ClassVisitor classVisitor;
52
53
54    public ReferencedClassVisitor(ClassVisitor classVisitor)
55    {
56        this.classVisitor = classVisitor;
57    }
58
59
60    // Implementations for ClassVisitor.
61
62    public void visitProgramClass(ProgramClass programClass)
63    {
64        // Visit the constant pool entries.
65        programClass.constantPoolEntriesAccept(this);
66
67        // Visit the fields and methods.
68        programClass.fieldsAccept(this);
69        programClass.methodsAccept(this);
70
71        // Visit the attributes.
72        programClass.attributesAccept(this);
73    }
74
75
76    public void visitLibraryClass(LibraryClass libraryClass)
77    {
78        // Visit the superclass and interfaces.
79        libraryClass.superClassAccept(classVisitor);
80        libraryClass.interfacesAccept(classVisitor);
81
82        // Visit the fields and methods.
83        libraryClass.fieldsAccept(this);
84        libraryClass.methodsAccept(this);
85    }
86
87
88    // Implementations for MemberVisitor.
89
90    public void visitProgramMember(ProgramClass programClass, ProgramMember programMember)
91    {
92        // Let the visitor visit the classes referenced in the descriptor string.
93        programMember.referencedClassesAccept(classVisitor);
94
95        // Visit the attributes.
96        programMember.attributesAccept(programClass, this);
97    }
98
99
100    public void visitLibraryMember(LibraryClass programClass, LibraryMember libraryMember)
101    {
102        // Let the visitor visit the classes referenced in the descriptor string.
103        libraryMember.referencedClassesAccept(classVisitor);
104    }
105
106
107    // Implementations for ConstantVisitor.
108
109    public void visitAnyConstant(Clazz clazz, Constant constant) {}
110
111
112    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
113    {
114        // Let the visitor visit the class referenced in the string constant.
115        stringConstant.referencedClassAccept(classVisitor);
116    }
117
118
119    public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
120    {
121        // Let the visitor visit the class referenced in the reference constant.
122        refConstant.referencedClassAccept(classVisitor);
123    }
124
125
126    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
127    {
128        // Let the visitor visit the class referenced in the class constant.
129        classConstant.referencedClassAccept(classVisitor);
130    }
131
132
133    // Implementations for AttributeVisitor.
134
135    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
136
137
138    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
139    {
140        // Let the visitor visit the class of the enclosing method.
141        enclosingMethodAttribute.referencedClassAccept(classVisitor);
142    }
143
144
145    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
146    {
147        // Visit the attributes of the code attribute.
148        codeAttribute.attributesAccept(clazz, method, this);
149    }
150
151
152    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
153    {
154        // Visit the local variables.
155        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
156    }
157
158
159    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
160    {
161        // Visit the local variable types.
162        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
163    }
164
165
166    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
167    {
168        // Let the visitor visit the classes referenced in the signature string.
169        signatureAttribute.referencedClassesAccept(classVisitor);
170    }
171
172
173    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
174    {
175        // Visit the annotations.
176        annotationsAttribute.annotationsAccept(clazz, this);
177    }
178
179
180    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
181    {
182        // Visit the parameter annotations.
183        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
184    }
185
186
187    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
188    {
189        // Visit the default element value.
190        annotationDefaultAttribute.defaultValueAccept(clazz, this);
191    }
192
193
194    // Implementations for LocalVariableInfoVisitor.
195
196    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
197    {
198        // Let the visitor visit the class referenced in the local variable.
199        localVariableInfo.referencedClassAccept(classVisitor);
200    }
201
202
203    // Implementations for LocalVariableTypeInfoVisitor.
204
205    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
206    {
207        // Let the visitor visit the classes referenced in the local variable type.
208        localVariableTypeInfo.referencedClassesAccept(classVisitor);
209    }
210
211
212    // Implementations for AnnotationVisitor.
213
214    public void visitAnnotation(Clazz clazz, Annotation annotation)
215    {
216        // Let the visitor visit the classes referenced in the annotation.
217        annotation.referencedClassesAccept(classVisitor);
218
219        // Visit the element values.
220        annotation.elementValuesAccept(clazz, this);
221    }
222
223
224    // Implementations for ElementValueVisitor.
225
226    public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue) {}
227
228
229    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
230    {
231        // Let the visitor visit the classes referenced in the constant element value.
232        enumConstantElementValue.referencedClassesAccept(classVisitor);
233    }
234
235
236    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
237    {
238        // Let the visitor visit the classes referenced in the class element value.
239        classElementValue.referencedClassesAccept(classVisitor);
240    }
241
242
243    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
244    {
245        // Visit the element values.
246        arrayElementValue.elementValuesAccept(clazz, annotation, this);
247    }
248}
249