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