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