1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 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.util;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor initializes the references of all classes that
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * it visits.
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <p>
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * All class constant pool entries get direct references to the corresponding
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * classes. These references make it more convenient to travel up and across
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * the class hierarchy.
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <p>
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * All field and method reference constant pool entries get direct references
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * to the corresponding classes, fields, and methods.
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <p>
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * All name and type constant pool entries get a list of direct references to
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * the classes listed in the type.
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <p>
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This visitor optionally prints warnings if some items can't be found.
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <p>
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * The class hierarchy must be initialized before using this visitor.
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ClassReferenceInitializer
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AttributeVisitor,
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableInfoVisitor,
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableTypeInfoVisitor,
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AnnotationVisitor,
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ElementValueVisitor
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ClassPool      programClassPool;
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ClassPool      libraryClassPool;
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final WarningPrinter missingClassWarningPrinter;
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final WarningPrinter missingMemberWarningPrinter;
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final WarningPrinter dependencyWarningPrinter;
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final MemberFinder memberFinder = new MemberFinder();
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new ClassReferenceInitializer that initializes the references
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * of all visited class files, optionally printing warnings if some classes
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * or class members can't be found or if they are in the program class pool.
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ClassReferenceInitializer(ClassPool      programClassPool,
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     ClassPool      libraryClassPool,
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     WarningPrinter missingClassWarningPrinter,
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     WarningPrinter missingMemberWarningPrinter,
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     WarningPrinter dependencyWarningPrinter)
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.programClassPool            = programClassPool;
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.libraryClassPool            = libraryClassPool;
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.missingClassWarningPrinter  = missingClassWarningPrinter;
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.missingMemberWarningPrinter = missingMemberWarningPrinter;
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.dependencyWarningPrinter    = dependencyWarningPrinter;
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the constant pool entries.
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.constantPoolEntriesAccept(this);
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize all fields and methods.
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the attributes.
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize all fields and methods.
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.fieldsAccept(this);
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.methodsAccept(this);
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramField(ProgramClass programClass, ProgramField programField)
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.referencedClass =
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClass(programClass.getName(),
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                programField.getDescriptor(programClass));
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the attributes.
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.attributesAccept(programClass, this);
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.referencedClasses =
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(programClass.getName(),
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  programMethod.getDescriptor(programClass));
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the attributes.
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.attributesAccept(programClass, this);
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField)
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryField.referencedClass =
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClass(libraryClass.getName(),
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                libraryField.getDescriptor(libraryClass));
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod)
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryMethod.referencedClasses =
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(libraryClass.getName(),
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  libraryMethod.getDescriptor(libraryClass));
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant) {}
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Fill out the String class.
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        stringConstant.javaLangStringClass =
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findClass(clazz.getName(), ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING);
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String className = refConstant.getClassName(clazz);
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // See if we can find the referenced class.
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Unresolved references are assumed to refer to library classes
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // that will not change anyway.
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz referencedClass = findClass(clazz.getName(), className);
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass != null &&
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            !ClassUtil.isInternalArrayType(className))
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String name = refConstant.getName(clazz);
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String type = refConstant.getType(clazz);
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean isFieldRef = refConstant.getTag() == ClassConstants.CONSTANT_Fieldref;
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // See if we can find the referenced class member somewhere in the
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // hierarchy.
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedMember = memberFinder.findMember(clazz,
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                   referencedClass,
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                   name,
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                   type,
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                   isFieldRef);
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedClass  = memberFinder.correspondingClass();
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (refConstant.referencedMember == null)
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // We've haven't found the class member anywhere in the hierarchy.
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                missingMemberWarningPrinter.print(clazz.getName(),
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  className,
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  "Warning: " +
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  ClassUtil.externalClassName(clazz.getName()) +
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  ": can't find referenced " +
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  (isFieldRef ?
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      "field '"  + ClassUtil.externalFullFieldDescription(0, name, type) :
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      "method '" + ClassUtil.externalFullMethodDescription(className, 0, name, type)) +
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  "' in class " +
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  ClassUtil.externalClassName(className));
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String className = clazz.getName();
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Fill out the referenced class.
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classConstant.referencedClass =
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findClass(className, classConstant.getName(clazz));
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Fill out the Class class.
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classConstant.javaLangClassClass =
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findClass(className, ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS);
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String className          = clazz.getName();
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String enclosingClassName = enclosingMethodAttribute.getClassName(clazz);
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // See if we can find the referenced class.
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz referencedClass = findClass(className, enclosingClassName);
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass == null)
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // We couldn't find the enclosing class.
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            missingClassWarningPrinter.print(className,
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             enclosingClassName,
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             "Warning: " +
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             ClassUtil.externalClassName(className) +
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             ": can't find enclosing class " +
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             ClassUtil.externalClassName(enclosingClassName));
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return;
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Make sure there is actually an enclosed method.
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (enclosingMethodAttribute.u2nameAndTypeIndex == 0)
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return;
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String name = enclosingMethodAttribute.getName(clazz);
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String type = enclosingMethodAttribute.getType(clazz);
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // See if we can find the method in the referenced class.
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Method referencedMethod = referencedClass.findMethod(name, type);
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedMethod == null)
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // We couldn't find the enclosing method.
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            missingMemberWarningPrinter.print(className,
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              enclosingClassName,
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              "Warning: " +
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              ClassUtil.externalClassName(className) +
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              ": can't find enclosing method '" +
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              ClassUtil.externalFullMethodDescription(enclosingClassName, 0, name, type) +
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              "' in class " +
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              ClassUtil.externalClassName(enclosingClassName));
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return;
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Save the references.
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enclosingMethodAttribute.referencedClass  = referencedClass;
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enclosingMethodAttribute.referencedMethod = referencedMethod;
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the nested attributes.
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.attributesAccept(clazz, method, this);
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the local variables.
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the local variable types.
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        signatureAttribute.referencedClasses =
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(clazz.getName(),
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  clazz.getString(signatureAttribute.u2signatureIndex));
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the annotations.
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationsAttribute.annotationsAccept(clazz, this);
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the annotations.
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the annotation.
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationDefaultAttribute.defaultValueAccept(clazz, this);
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableInfoVisitor.
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableInfo.referencedClass =
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClass(clazz.getName(),
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                clazz.getString(localVariableInfo.u2descriptorIndex));
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableTypeInfoVisitor.
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeInfo.referencedClasses =
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(clazz.getName(),
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  clazz.getString(localVariableTypeInfo.u2signatureIndex));
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AnnotationVisitor.
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotation(Clazz clazz, Annotation annotation)
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.referencedClasses =
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(clazz.getName(),
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  clazz.getString(annotation.u2typeIndex));
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the element values.
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.elementValuesAccept(clazz, this);
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ElementValueVisitor.
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        initializeElementValue(clazz, annotation, constantElementValue);
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        initializeElementValue(clazz, annotation, enumConstantElementValue);
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enumConstantElementValue.referencedClasses =
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(clazz.getName(),
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  clazz.getString(enumConstantElementValue.u2typeNameIndex));
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        initializeElementValue(clazz, annotation, classElementValue);
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classElementValue.referencedClasses =
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            findReferencedClasses(clazz.getName(),
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  clazz.getString(classElementValue.u2classInfoIndex));
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        initializeElementValue(clazz, annotation, annotationElementValue);
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the annotation.
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationElementValue.annotationAccept(clazz, this);
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        initializeElementValue(clazz, annotation, arrayElementValue);
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the element values.
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        arrayElementValue.elementValuesAccept(clazz, annotation, this);
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Initializes the referenced method of an element value, if any.
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void initializeElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue)
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // See if we have a referenced class.
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (annotation                      != null &&
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            annotation.referencedClasses    != null &&
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.u2elementNameIndex != 0)
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // See if we can find the method in the referenced class
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // (ignoring the descriptor).
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String name = clazz.getString(elementValue.u2elementNameIndex);
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz referencedClass = annotation.referencedClasses[0];
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.referencedClass  = referencedClass;
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.referencedMethod = referencedClass.findMethod(name, null);
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the single class referenced by the given descriptor, or
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * <code>null</code> if there isn't any useful reference.
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Clazz findReferencedClass(String referencingClassName,
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                      String descriptor)
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        DescriptorClassEnumeration enumeration =
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new DescriptorClassEnumeration(descriptor);
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enumeration.nextFluff();
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (enumeration.hasMoreClassNames())
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return findClass(referencingClassName, enumeration.nextClassName());
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns an array of classes referenced by the given descriptor, or
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * <code>null</code> if there aren't any useful references.
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Clazz[] findReferencedClasses(String referencingClassName,
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          String descriptor)
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        DescriptorClassEnumeration enumeration =
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new DescriptorClassEnumeration(descriptor);
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int classCount = enumeration.classCount();
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (classCount > 0)
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz[] referencedClasses = new Clazz[classCount];
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            boolean foundReferencedClasses = false;
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < classCount; index++)
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                String fluff = enumeration.nextFluff();
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                String name  = enumeration.nextClassName();
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Clazz referencedClass = findClass(referencingClassName, name);
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (referencedClass != null)
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    referencedClasses[index] = referencedClass;
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    foundReferencedClasses = true;
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (foundReferencedClasses)
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return referencedClasses;
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the class with the given name, either for the program class pool
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * or from the library class pool, or <code>null</code> if it can't be found.
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Clazz findClass(String referencingClassName, String name)
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Ignore any primitive array types.
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (ClassUtil.isInternalArrayType(name) &&
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            !ClassUtil.isInternalClassType(name))
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return null;
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // First look for the class in the program class pool.
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz clazz = programClassPool.getClass(name);
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Otherwise look for the class in the library class pool.
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (clazz == null)
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            clazz = libraryClassPool.getClass(name);
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (clazz == null &&
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                missingClassWarningPrinter != null)
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // We didn't find the superclass or interface. Print a warning.
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                missingClassWarningPrinter.print(referencingClassName,
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 name,
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 "Warning: " +
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 ClassUtil.externalClassName(referencingClassName) +
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 ": can't find referenced class " +
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 ClassUtil.externalClassName(name));
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else if (dependencyWarningPrinter != null)
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // The superclass or interface was found in the program class pool.
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Print a warning.
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            dependencyWarningPrinter.print(referencingClassName,
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           name,
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           "Warning: library class " +
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           ClassUtil.externalClassName(referencingClassName) +
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           " depends on program class " +
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           ClassUtil.externalClassName(name));
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return clazz;
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
546