1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59f606f95f03a75961498803e24bee6799a7c0885Ying Wang * Copyright (c) 2002-2009 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.classfile; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AttributeVisitor; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This Clazz is a compact representation of the essential data in a Java class. 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class LibraryClass implements Clazz 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int u2accessFlags; 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String thisClassName; 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String superClassName; 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String[] interfaceNames; 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public LibraryField[] fields; 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public LibraryMethod[] methods; 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * An extra field pointing to the superclass of this class. 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This field is filled out by the {@link ClassSuperHierarchyInitializer}. 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Clazz superClass; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * An extra field pointing to the interfaces of this class. 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This field is filled out by the {@link ClassSuperHierarchyInitializer}. 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Clazz[] interfaceClasses; 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * An extra field pointing to the subclasses of this class. 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This field is filled out by the {@link ClassSubHierarchyInitializer}. 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Clazz[] subClasses; 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * An extra field in which visitors can store information. 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Object visitorInfo; 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates an empty LibraryClass. 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public LibraryClass() {} 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether this library class is visible to the outside world. 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean isVisible() 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return (u2accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0; 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Clazz. 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getAccessFlags() 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return u2accessFlags; 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getName() 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return thisClassName; 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getSuperName() 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This may be java/lang/Object, in which case there is no super. 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return superClassName; 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getInterfaceCount() 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return interfaceClasses.length; 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getInterfaceName(int index) 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return interfaceNames[index]; 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getTag(int constantIndex) 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getString(int constantIndex) 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getStringString(int constantIndex) 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getClassName(int constantIndex) 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getName(int constantIndex) 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getType(int constantIndex) 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool"); 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void addSubClass(Clazz clazz) 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (subClasses == null) 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato subClasses = new Clazz[1]; 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Copy the old elements into new larger array. 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz[] temp = new Clazz[subClasses.length+1]; 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(subClasses, 0, temp, 0, subClasses.length); 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato subClasses = temp; 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato subClasses[subClasses.length-1] = clazz; 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Clazz getSuperClass() 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return superClass; 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Clazz getInterface(int index) 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return interfaceClasses[index]; 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean extends_(Clazz clazz) 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (this.equals(clazz)) 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return superClass != null && 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato superClass.extends_(clazz); 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean extendsOrImplements(Clazz clazz) 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (this.equals(clazz)) 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (superClass != null && 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato superClass.extendsOrImplements(clazz)) 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClasses != null) 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < interfaceClasses.length; index++) 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz interfaceClass = interfaceClasses[index]; 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClass != null && 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaceClass.extendsOrImplements(clazz)) 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Field findField(String name, String descriptor) 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < fields.length; index++) 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field field = fields[index]; 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (field != null && 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (name == null || field.getName(this).equals(name)) && 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (descriptor == null || field.getDescriptor(this).equals(descriptor))) 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return field; 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return null; 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Method findMethod(String name, String descriptor) 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < methods.length; index++) 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method method = methods[index]; 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (method != null && 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (name == null || method.getName(this).equals(name)) && 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (descriptor == null || method.getDescriptor(this).equals(descriptor))) 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return method; 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return null; 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void accept(ClassVisitor classVisitor) 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classVisitor.visitLibraryClass(this); 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void hierarchyAccept(boolean visitThisClass, 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean visitSuperClass, 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean visitInterfaces, 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean visitSubclasses, 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassVisitor classVisitor) 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // First visit the current classfile. 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (visitThisClass) 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accept(classVisitor); 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Then visit its superclass, recursively. 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (visitSuperClass) 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (superClass != null) 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato superClass.hierarchyAccept(true, 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato visitInterfaces, 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classVisitor); 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Then visit its interfaces, recursively. 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (visitInterfaces) 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Visit the interfaces of the superclasses, if we haven't done so yet. 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!visitSuperClass) 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (superClass != null) 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato superClass.hierarchyAccept(false, 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classVisitor); 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Visit the interfaces. 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClasses != null) 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < interfaceClasses.length; index++) 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz interfaceClass = interfaceClasses[index]; 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClass != null) 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaceClass.hierarchyAccept(true, 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classVisitor); 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Then visit its subclasses, recursively. 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (visitSubclasses) 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (subClasses != null) 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < subClasses.length; index++) 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato subClasses[index].hierarchyAccept(true, 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classVisitor); 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Lets the given class visitor visit the superclass, if it is known. 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVisitor the <code>ClassVisitor</code> that will visit the 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * superclass. 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void superClassAccept(ClassVisitor classVisitor) 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (superClass != null) 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato superClass.accept(classVisitor); 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Lets the given class visitor visit all known direct interfaces. 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVisitor the <code>ClassVisitor</code> that will visit the 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * interfaces. 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void interfacesAccept(ClassVisitor classVisitor) 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClasses != null) 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < interfaceClasses.length; index++) 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz interfaceClass = interfaceClasses[index]; 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaceClass != null) 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaceClass.accept(classVisitor); 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void subclassesAccept(ClassVisitor classVisitor) 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (subClasses != null) 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < subClasses.length; index++) 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato subClasses[index].accept(classVisitor); 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void constantPoolEntriesAccept(ConstantVisitor constantVisitor) 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This class doesn't keep references to its constant pool entries. 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor) 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This class doesn't keep references to its constant pool entries. 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void thisClassConstantAccept(ConstantVisitor constantVisitor) 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This class doesn't keep references to its constant pool entries. 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void superClassConstantAccept(ConstantVisitor constantVisitor) 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This class doesn't keep references to its constant pool entries. 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void interfaceConstantsAccept(ConstantVisitor constantVisitor) 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This class doesn't keep references to its constant pool entries. 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void fieldsAccept(MemberVisitor memberVisitor) 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < fields.length; index++) 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field field = fields[index]; 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (field != null) 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato field.accept(this, memberVisitor); 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor) 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field field = findField(name, descriptor); 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (field != null) 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato field.accept(this, memberVisitor); 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void methodsAccept(MemberVisitor memberVisitor) 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < methods.length; index++) 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method method = methods[index]; 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (method != null) 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato method.accept(this, memberVisitor); 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor) 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method method = findMethod(name, descriptor); 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (method != null) 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato method.accept(this, memberVisitor); 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean mayHaveImplementations(Method method) 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 && 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (method == null || 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((method.getAccessFlags() & (ClassConstants.INTERNAL_ACC_PRIVATE | 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassConstants.INTERNAL_ACC_STATIC | 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassConstants.INTERNAL_ACC_FINAL)) == 0 && 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato !method.getName(this).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT))); 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void attributesAccept(AttributeVisitor attributeVisitor) 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store attributes"); 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for VisitorAccepter. 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Object getVisitorInfo() 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return visitorInfo; 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setVisitorInfo(Object visitorInfo) 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.visitorInfo = visitorInfo; 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Object. 484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString() 486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return "LibraryClass("+getName()+")"; 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 490