1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 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;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.ClassPool;
24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.attribute.annotation.visitor.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AllAttributeVisitor;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.visitor.AllInstructionVisitor;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.*;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.IOException;
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.*;
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class initializes class pools.
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class Initializer
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final Configuration configuration;
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new Initializer to initialize classes according to the given
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * configuration.
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Initializer(Configuration configuration)
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.configuration = configuration;
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Initializes the classes in the given program class pool and library class
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * pool, performs some basic checks, and shrinks the library class pool.
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void execute(ClassPool programClassPool,
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        ClassPool libraryClassPool) throws IOException
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int originalLibraryClassPoolSize = libraryClassPool.size();
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Perform basic checks on the configuration.
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        WarningPrinter fullyQualifiedClassNameNotePrinter = new WarningPrinter(System.out, configuration.note);
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        WarningPrinter keepClassMemberNotePrinter         = new WarningPrinter(System.out, configuration.note);
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        new FullyQualifiedClassNameChecker(programClassPool,
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                           libraryClassPool,
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                           fullyQualifiedClassNameNotePrinter).checkClassSpecifications(configuration.keep);
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        new KeepClassMemberChecker(keepClassMemberNotePrinter).checkClassSpecifications(configuration.keep);
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Construct a reduced library class pool with only those library
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // classes whose hierarchies are referenced by the program classes.
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // We can't do this if we later have to come up with the obfuscated
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // class member names that are globally unique.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ClassPool reducedLibraryClassPool = configuration.useUniqueClassMemberNames ?
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            null : new ClassPool();
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        WarningPrinter classReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn);
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        WarningPrinter dependencyWarningPrinter     = new WarningPrinter(System.err, configuration.warn);
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the superclass hierarchies for program classes.
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ClassSuperHierarchyInitializer(programClassPool,
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               libraryClassPool,
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               classReferenceWarningPrinter,
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               null));
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the superclass hierarchy of all library classes, without
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // warnings.
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClassPool.classesAccept(
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ClassSuperHierarchyInitializer(programClassPool,
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               libraryClassPool,
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               null,
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               dependencyWarningPrinter));
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the class references of program class members and
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // attributes. Note that all superclass hierarchies have to be
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // initialized for this purpose.
102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        WarningPrinter programMemberReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn);
103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        WarningPrinter libraryMemberReferenceWarningPrinter = new WarningPrinter(System.err, configuration.warn);
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ClassReferenceInitializer(programClassPool,
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          libraryClassPool,
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          classReferenceWarningPrinter,
109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                          programMemberReferenceWarningPrinter,
110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                          libraryMemberReferenceWarningPrinter,
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          null));
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (reducedLibraryClassPool != null)
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Collect the library classes that are directly referenced by
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // program classes, without introspection.
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programClassPool.classesAccept(
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ReferencedClassVisitor(
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new LibraryClassFilter(
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassPoolFiller(reducedLibraryClassPool))));
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Reinitialize the superclass hierarchies of referenced library
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // classes, this time with warnings.
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            reducedLibraryClassPool.classesAccept(
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassSuperHierarchyInitializer(programClassPool,
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   libraryClassPool,
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   classReferenceWarningPrinter,
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   null));
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Initialize the enum annotation references.
132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        programClassPool.classesAccept(
133b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            new AllAttributeVisitor(true,
134b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            new AllElementValueVisitor(true,
135b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            new EnumFieldReferenceInitializer())));
136b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Initialize the Class.forName references.
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        WarningPrinter dynamicClassReferenceNotePrinter = new WarningPrinter(System.out, configuration.note);
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        WarningPrinter classForNameNotePrinter          = new WarningPrinter(System.out, configuration.note);
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllMethodVisitor(
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllAttributeVisitor(
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllInstructionVisitor(
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new DynamicClassReferenceInitializer(programClassPool,
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 libraryClassPool,
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 dynamicClassReferenceNotePrinter,
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 null,
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 classForNameNotePrinter,
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                 createClassNoteExceptionMatcher(configuration.keep))))));
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the Class.get[Declared]{Field,Method} references.
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        WarningPrinter getMemberNotePrinter = new WarningPrinter(System.out, configuration.note);
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllMethodVisitor(
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllAttributeVisitor(
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new AllInstructionVisitor(
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new DynamicMemberReferenceInitializer(programClassPool,
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  libraryClassPool,
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  getMemberNotePrinter,
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  createClassMemberNoteExceptionMatcher(configuration.keep, true),
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  createClassMemberNoteExceptionMatcher(configuration.keep, false))))));
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize other string constant references, if requested.
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (configuration.adaptClassStrings != null)
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programClassPool.classesAccept(
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassNameFilter(configuration.adaptClassStrings,
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new AllConstantVisitor(
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new StringReferenceInitializer(programClassPool,
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               libraryClassPool))));
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Check for unkept descriptor classes of kept class members.
176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        WarningPrinter descriptorKeepNotePrinter = new WarningPrinter(System.out, configuration.note);
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        new DescriptorKeepChecker(programClassPool,
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  libraryClassPool,
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  descriptorKeepNotePrinter).checkClassSpecifications(configuration.keep);
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the class references of library class members.
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (reducedLibraryClassPool != null)
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Collect the library classes that are referenced by program
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // classes, directly or indirectly, with or without introspection.
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programClassPool.classesAccept(
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ReferencedClassVisitor(
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new LibraryClassFilter(
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassHierarchyTraveler(true, true, true, false,
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new LibraryClassFilter(
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassPoolFiller(reducedLibraryClassPool))))));
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Initialize the class references of referenced library
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // classes, without warnings.
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            reducedLibraryClassPool.classesAccept(
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassReferenceInitializer(programClassPool,
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              libraryClassPool,
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              null,
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              null,
201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                              null,
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              dependencyWarningPrinter));
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Reset the library class pool.
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            libraryClassPool.clear();
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Copy the library classes that are referenced directly by program
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // classes and the library classes that are referenced by referenced
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // library classes.
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            reducedLibraryClassPool.classesAccept(
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new MultiClassVisitor(new ClassVisitor[]
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new ClassHierarchyTraveler(true, true, true, false,
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new LibraryClassFilter(
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new ClassPoolFiller(libraryClassPool))),
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new ReferencedClassVisitor(
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new LibraryClassFilter(
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new ClassHierarchyTraveler(true, true, true, false,
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new LibraryClassFilter(
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new ClassPoolFiller(libraryClassPool)))))
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }));
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Initialize the class references of all library class members.
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            libraryClassPool.classesAccept(
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                new ClassReferenceInitializer(programClassPool,
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              libraryClassPool,
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              null,
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              null,
232b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                              null,
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              dependencyWarningPrinter));
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Initialize the subclass hierarchies.
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(new ClassSubHierarchyInitializer());
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClassPool.classesAccept(new ClassSubHierarchyInitializer());
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Share strings between the classes, to reduce heap memory usage.
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClassPool.classesAccept(new StringSharer());
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClassPool.classesAccept(new StringSharer());
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Print out a summary of the notes, if necessary.
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int fullyQualifiedNoteCount = fullyQualifiedClassNameNotePrinter.getWarningCount();
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (fullyQualifiedNoteCount > 0)
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: there were " + fullyQualifiedNoteCount +
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " references to unknown classes.");
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      You should check your configuration for typos.");
251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)");
252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Print out a summary of the notes, if necessary.
255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        int keepClassMemberNoteCount = keepClassMemberNotePrinter.getWarningCount();
256b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (keepClassMemberNoteCount > 0)
257b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
258b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("Note: there were " + keepClassMemberNoteCount +
259b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                               " '-keepclassmembers' options that didn't specify class");
260b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      members. You should specify at least some class members or consider");
261b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      if you just need '-keep'.");
262b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)");
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int descriptorNoteCount = descriptorKeepNotePrinter.getWarningCount();
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (descriptorNoteCount > 0)
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: there were " + descriptorNoteCount +
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " unkept descriptor classes in kept class members.");
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      You should consider explicitly keeping the mentioned classes");
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      (using '-keep').");
272b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)");
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dynamicClassReferenceNoteCount = dynamicClassReferenceNotePrinter.getWarningCount();
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (dynamicClassReferenceNoteCount > 0)
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: there were " + dynamicClassReferenceNoteCount +
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " unresolved dynamic references to classes or interfaces.");
280b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      You should check if you need to specify additional program jars.");
281b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)");
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int classForNameNoteCount = classForNameNotePrinter.getWarningCount();
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (classForNameNoteCount > 0)
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: there were " + classForNameNoteCount +
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " class casts of dynamically created class instances.");
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      You might consider explicitly keeping the mentioned classes and/or");
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      their implementations (using '-keep').");
291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclasscast)");
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int getmemberNoteCount = getMemberNotePrinter.getWarningCount();
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (getmemberNoteCount > 0)
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: there were " + getmemberNoteCount +
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " accesses to class members by means of introspection.");
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      You should consider explicitly keeping the mentioned class members");
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("      (using '-keep' or '-keepclassmembers').");
301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclassmember)");
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Print out a summary of the warnings, if necessary.
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int classReferenceWarningCount = classReferenceWarningPrinter.getWarningCount();
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (classReferenceWarningCount > 0)
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("Warning: there were " + classReferenceWarningCount +
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " unresolved references to classes or interfaces.");
310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         You may need to add missing library jars or update their versions.");
311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         If your code works fine without the missing classes, you can suppress");
312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         the warnings with '-dontwarn' options.");
313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (configuration.skipNonPublicLibraryClasses)
315b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
316b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                System.err.println("         You may also have to remove the option '-skipnonpubliclibraryclasses'.");
317b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
318b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
319b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)");
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int dependencyWarningCount = dependencyWarningPrinter.getWarningCount();
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (dependencyWarningCount > 0)
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("Warning: there were " + dependencyWarningCount +
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " instances of library classes depending on program classes.");
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("         You must avoid such dependencies, since the program classes will");
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("         be processed, while the library classes will remain unchanged.");
329b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency)");
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
332b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        int programMemberReferenceWarningCount = programMemberReferenceWarningPrinter.getWarningCount();
333b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (programMemberReferenceWarningCount > 0)
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
335b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("Warning: there were " + programMemberReferenceWarningCount +
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                               " unresolved references to program class members.");
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.err.println("         Your input classes appear to be inconsistent.");
338b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         You may need to recompile the code.");
339b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)");
340b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
341b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
342b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        int libraryMemberReferenceWarningCount = libraryMemberReferenceWarningPrinter.getWarningCount();
343b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (libraryMemberReferenceWarningCount > 0)
344b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
345b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("Warning: there were " + libraryMemberReferenceWarningCount +
346b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                               " unresolved references to library class members.");
347b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         You probably need to update the library versions.");
348b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
349b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (!configuration.skipNonPublicLibraryClassMembers)
350b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
351b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                System.err.println("         Alternatively, you may have to specify the option ");
352b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                System.err.println("         '-dontskipnonpubliclibraryclassmembers'.");
353b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
354b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
355b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (configuration.skipNonPublicLibraryClasses)
356b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
357b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                System.err.println("         You may also have to remove the option '-skipnonpubliclibraryclasses'.");
358b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
359b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
360b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            System.err.println("         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)");
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if ((classReferenceWarningCount         > 0 ||
364b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             dependencyWarningCount             > 0 ||
365b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             programMemberReferenceWarningCount > 0 ||
366b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang             libraryMemberReferenceWarningCount > 0) &&
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            !configuration.ignoreWarnings)
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new IOException("Please correct the above warnings first.");
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if ((configuration.note == null ||
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             !configuration.note.isEmpty()) &&
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (configuration.warn != null &&
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             configuration.warn.isEmpty() ||
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             configuration.ignoreWarnings))
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Note: You're ignoring all warnings!");
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Discard unused library classes.
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (configuration.verbose)
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("Ignoring unused library classes...");
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("  Original number of library classes: " + originalLibraryClassPoolSize);
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.out.println("  Final number of library classes:    " + libraryClassPool.size());
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Extracts a list of exceptions of classes for which not to print notes,
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * from the keep configuration.
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private StringMatcher createClassNoteExceptionMatcher(List noteExceptions)
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (noteExceptions != null)
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            List noteExceptionNames = new ArrayList(noteExceptions.size());
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < noteExceptions.size(); index++)
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                KeepClassSpecification keepClassSpecification = (KeepClassSpecification)noteExceptions.get(index);
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (keepClassSpecification.markClasses)
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // If the class itself is being kept, it's ok.
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    String className = keepClassSpecification.className;
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    if (className != null)
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    {
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        noteExceptionNames.add(className);
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // If all of its extensions are being kept, it's ok too.
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    String extendsClassName = keepClassSpecification.extendsClassName;
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    if (extendsClassName != null)
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    {
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        noteExceptionNames.add(extendsClassName);
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (noteExceptionNames.size() > 0)
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return new ListParser(new ClassNameParser()).parse(noteExceptionNames);
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Extracts a list of exceptions of field or method names for which not to
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * print notes, from the keep configuration.
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private StringMatcher createClassMemberNoteExceptionMatcher(List    noteExceptions,
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                boolean isField)
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (noteExceptions != null)
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            List noteExceptionNames = new ArrayList();
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < noteExceptions.size(); index++)
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                KeepClassSpecification keepClassSpecification = (KeepClassSpecification)noteExceptions.get(index);
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                List memberSpecifications = isField ?
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    keepClassSpecification.fieldSpecifications :
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    keepClassSpecification.methodSpecifications;
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (memberSpecifications != null)
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    for (int index2 = 0; index2 < memberSpecifications.size(); index2++)
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    {
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        MemberSpecification memberSpecification =
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            (MemberSpecification)memberSpecifications.get(index2);
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        String memberName = memberSpecification.name;
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        if (memberName != null)
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        {
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            noteExceptionNames.add(memberName);
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        }
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (noteExceptionNames.size() > 0)
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return new ListParser(new ClassNameParser()).parse(noteExceptionNames);
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
473