1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/*
2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *             of Java bytecode.
4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 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.*;
242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.*;
25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.annotation.*;
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.visitor.AttributeVisitor;
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.util.SimplifiedVisitor;
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/**
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This AttributeVisitor and AnnotationVisitor lets a given ElementValueVisitor
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * visit all ElementValue objects of the attributes or annotations that it
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * visits.
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @author Eric Lafortune
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class AllElementValueVisitor
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangextends      SimplifiedVisitor
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimplements   AttributeVisitor,
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             AnnotationVisitor,
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             ElementValueVisitor
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final boolean             deep;
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final ElementValueVisitor elementValueVisitor;
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new AllElementValueVisitor.
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param elementValueVisitor the AllElementValueVisitor to which visits
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            will be delegated.
50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public AllElementValueVisitor(ElementValueVisitor elementValueVisitor)
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this(false, elementValueVisitor);
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new AllElementValueVisitor.
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param deep                specifies whether the element values
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            further down the hierarchy should be
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            visited too.
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @param elementValueVisitor the AllElementValueVisitor to which visits
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     *                            will be delegated.
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public AllElementValueVisitor(boolean             deep,
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                  ElementValueVisitor elementValueVisitor)
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.deep                = deep;
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.elementValueVisitor = elementValueVisitor;
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for AttributeVisitor.
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, this);
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, field, this);
89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeVisibleAnnotationsAttribute.annotationsAccept(clazz, method, this);
96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
99b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, this);
103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
104b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
105b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
106b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
108b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, field, this);
110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
111b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
112b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
113b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
114b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
116b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        runtimeInvisibleAnnotationsAttribute.annotationsAccept(clazz, method, this);
117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
118b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
119b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
121b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
122b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the annotations.
123b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
124b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
128b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Visit the default element value.
130b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotationDefaultAttribute.defaultValueAccept(clazz, this);
131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
133b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
134b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for AnnotationVisitor.
135b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
136b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Annotation annotation)
137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
138b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
139b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
140b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
141b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
142b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Field field, Annotation annotation)
143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
144b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
146b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
147b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
148b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Method method, Annotation annotation)
149b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
152b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
153b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
154b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation)
155b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
156b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        annotation.elementValuesAccept(clazz, this);
157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
159b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation)
1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        annotation.elementValuesAccept(clazz, this);
1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
166b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // Implementations for ElementValueVisitor.
167b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
168b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
169b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
170b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitConstantElementValue(clazz, annotation, constantElementValue);
171b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
172b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
173b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
174b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitEnumConstantElementValue(clazz, annotation, enumConstantElementValue);
177b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
179b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
180b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
181b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitClassElementValue(clazz, annotation, classElementValue);
183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
184b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
187b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitAnnotationElementValue(clazz, annotation, annotationElementValue);
189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (deep)
191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
192b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            annotationElementValue.annotationAccept(clazz, this);
193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
195b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
196b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
197b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
198b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
199b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        elementValueVisitor.visitArrayElementValue(clazz, annotation, arrayElementValue);
200b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (deep)
202b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            arrayElementValue.elementValuesAccept(clazz, annotation, elementValueVisitor);
204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
207