1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/*
2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *             of Java bytecode.
4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is free software; you can redistribute it and/or modify it
8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * under the terms of the GNU General Public License as published by the Free
9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Software Foundation; either version 2 of the License, or (at your option)
10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * any later version.
11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is distributed in the hope that it will be useful, but WITHOUT
13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * more details.
16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * You should have received a copy of the GNU General Public License along
18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * with this program; if not, write to the Free Software Foundation, Inc.,
19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard.classfile.attribute.annotation.visitor;
22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.*;
24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.Attribute;
25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.annotation.*;
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.visitor.AttributeVisitor;
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.util.SimplifiedVisitor;
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.util.*;
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/**
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This AttributeVisitor and AnnotationVisitor lets a given ElementValueVisitor
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * visit all ElementValue objects of the attributes or annotations that it
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * visits.
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @author Eric Lafortune
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class AllElementValueVisitor
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangextends      SimplifiedVisitor
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimplements   AttributeVisitor,
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             AnnotationVisitor,
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             ElementValueVisitor
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final boolean             deep;
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final ElementValueVisitor elementValueVisitor;
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new AllElementValueVisitor.
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param elementValueVisitor the AllElementValueVisitor to which visits
50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            will be delegated.
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public AllElementValueVisitor(ElementValueVisitor elementValueVisitor)
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this(false, elementValueVisitor);
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new AllElementValueVisitor.
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param deep                specifies whether the element values
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            further down the hierarchy should be
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            visited too.
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param elementValueVisitor the AllElementValueVisitor to which visits
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            will be delegated.
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public AllElementValueVisitor(boolean             deep,
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                  ElementValueVisitor elementValueVisitor)
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.deep                = deep;
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.elementValueVisitor = elementValueVisitor;
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for AttributeVisitor.
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, this);
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, field, this);
90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, method, this);
97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
99b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, this);
104b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
105b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
106b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
108b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, field, this);
111b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
112b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
113b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
114b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
116b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, method, this);
118b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
119b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
121b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
122b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
123b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
124b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
128b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
130b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the default element value.
131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotationDefaultAttribute.defaultValueAccept(clazz, this);
132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
133b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
134b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
135b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for AnnotationVisitor.
136b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Annotation annotation)
138b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
139b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
140b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
141b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
142b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Field field, Annotation annotation)
144b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
146b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
147b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
148b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
149b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Method method, Annotation annotation)
150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
152b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
153b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
154b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
155b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation)
156b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
159b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
160b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
161b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for ElementValueVisitor.
162b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
163b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
164b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
165b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitConstantElementValue(clazz, annotation, constantElementValue);
166b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
167b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
168b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
169b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
170b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
171b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitEnumConstantElementValue(clazz, annotation, enumConstantElementValue);
172b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
173b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
174b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
177b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitClassElementValue(clazz, annotation, classElementValue);
178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
179b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
180b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
181b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitAnnotationElementValue(clazz, annotation, annotationElementValue);
184b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (deep)
186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
187b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            annotationElementValue.annotationAccept(clazz, this);
188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
192b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitArrayElementValue(clazz, annotation, arrayElementValue);
195b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
196b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (deep)
197b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
198b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            arrayElementValue.elementValuesAccept(clazz, annotation, elementValueVisitor);
199b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
200b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
202