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