1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.shrink;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.Attribute;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AttributeVisitor;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This AttributeVisitor recursively marks all necessary annotation information
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * in the attributes that it visits.
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see UsageMarker
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class AnnotationUsageMarker
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   AttributeVisitor,
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AnnotationVisitor,
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ElementValueVisitor,
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ClassVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final UsageMarker usageMarker;
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Fields acting as a return parameters for several methods.
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean attributeUsed;
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean annotationUsed;
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private boolean allClassesUsed;
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean methodUsed;
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new AnnotationUsageMarker.
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param usageMarker the usage marker that is used to mark the classes
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                    and class members.
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public AnnotationUsageMarker(UsageMarker usageMarker)
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.usageMarker = usageMarker;
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the necessary annotation information.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        attributeUsed = false;
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationsAttribute.annotationsAccept(clazz, this);
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (attributeUsed)
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // We got a positive used flag, so some annotation is being used.
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark this attribute as being used as well.
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            usageMarker.markAsUsed(annotationsAttribute);
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, annotationsAttribute.u2attributeNameIndex);
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the necessary annotation information.
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        attributeUsed = false;
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (attributeUsed)
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // We got a positive used flag, so some annotation is being used.
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark this attribute as being used as well.
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            usageMarker.markAsUsed(parameterAnnotationsAttribute);
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the necessary annotation information in any annotation elements.
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationDefaultAttribute.defaultValueAccept(clazz, this);
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Always mark annotation defaults.
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        usageMarker.markAsUsed(annotationDefaultAttribute);
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex);
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AnnotationVisitor.
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotation(Clazz clazz, Annotation annotation)
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedClassUsed(annotation))
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the annotation as being used.
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            usageMarker.markAsUsed(annotation);
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, annotation.u2typeIndex);
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the necessary element values.
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotation.elementValuesAccept(clazz, this);
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // The return values.
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationUsed = true;
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            attributeUsed  = true;
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ElementValueVisitor.
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedMethodUsed(constantElementValue))
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the element value as being used.
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            usageMarker.markAsUsed(constantElementValue);
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, constantElementValue.u2elementNameIndex);
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, constantElementValue.u2constantValueIndex);
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedMethodUsed(enumConstantElementValue))
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Check the referenced classes.
162b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            allClassesUsed = true;
163b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            enumConstantElementValue.referencedClassesAccept(this);
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (allClassesUsed)
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the element value as being used.
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                usageMarker.markAsUsed(enumConstantElementValue);
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(clazz, enumConstantElementValue.u2elementNameIndex);
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(clazz, enumConstantElementValue.u2typeNameIndex);
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(clazz, enumConstantElementValue.u2constantNameIndex);
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedMethodUsed(classElementValue))
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Mark the element value as being used.
183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            usageMarker.markAsUsed(classElementValue);
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            markConstant(clazz, classElementValue.u2elementNameIndex);
186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            markConstant(clazz, classElementValue.u2classInfoIndex);
1879f606f95f03a75961498803e24bee6799a7c0885Ying Wang
188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Mark the referenced classes, since they can be retrieved from
189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // the annotation and then used.
190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // TODO: This could mark more annotation methods, affecting other annotations.
191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            classElementValue.referencedClassesAccept(usageMarker);
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedMethodUsed(annotationElementValue))
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean oldAnnotationUsed = annotationUsed;
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Check and mark the contained annotation.
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationUsed = false;
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationElementValue.annotationAccept(clazz, this);
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (annotationUsed)
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the element value as being used.
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                usageMarker.markAsUsed(annotationElementValue);
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(clazz, annotationElementValue.u2elementNameIndex);
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotationUsed = oldAnnotationUsed;
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (isReferencedMethodUsed(arrayElementValue))
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Check and mark the contained element values.
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            arrayElementValue.elementValuesAccept(clazz, annotation, this);
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
226b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Mark the element value as being used.
227b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            usageMarker.markAsUsed(arrayElementValue);
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
229b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            markConstant(clazz, arrayElementValue.u2elementNameIndex);
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant)
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        usageMarker.markAsUsed(constant);
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Is the class constant marked as being used?
245b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (!usageMarker.isUsed(classConstant))
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Check the referenced class.
248b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            allClassesUsed = true;
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            classConstant.referencedClassAccept(this);
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Is the referenced class marked as being used?
252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (allClassesUsed)
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the class constant and its Utf8 constant.
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                usageMarker.markAsUsed(classConstant);
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(clazz, classConstant.u2nameIndex);
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
267b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        allClassesUsed &= usageMarker.isUsed(programClass);
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        methodUsed = usageMarker.isUsed(programMethod);
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMethod(LibraryClass LibraryClass, LibraryMethod libraryMethod)
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the annotation class has been marked as being used.
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean isReferencedClassUsed(Annotation annotation)
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Check if the referenced class is being used.
297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        allClassesUsed = true;
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.referencedClassAccept(this);
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return allClassesUsed;
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the annotation method has been marked as being used.
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean isReferencedMethodUsed(ElementValue elementValue)
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Check if the referenced method is being used.
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        methodUsed = true;
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        elementValue.referencedMethodAccept(this);
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return methodUsed;
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the specified constant pool entry.
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void markConstant(Clazz clazz, int index)
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (index > 0)
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            clazz.constantPoolEntryAccept(index, this);
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
328