1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/*
2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *             of Java bytecode.
4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is free software; you can redistribute it and/or modify it
8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * under the terms of the GNU General Public License as published by the Free
9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Software Foundation; either version 2 of the License, or (at your option)
10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * any later version.
11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is distributed in the hope that it will be useful, but WITHOUT
13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * more details.
16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * You should have received a copy of the GNU General Public License along
18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * with this program; if not, write to the Free Software Foundation, Inc.,
19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard;
22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.util.*;
24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.visitor.ClassVisitor;
25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.util.List;
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/**
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This class checks if the user has forgotten to specify class members in
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * some keep options in the configuration.
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @author Eric Lafortune
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class KeepClassMemberChecker
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final WarningPrinter notePrinter;
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Creates a new KeepClassMemberChecker.
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public KeepClassMemberChecker(WarningPrinter notePrinter)
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        this.notePrinter = notePrinter;
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Checks if the given class specifications try to keep class members
502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * without actually specifying any, printing notes if necessary.
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void checkClassSpecifications(List keepClassSpecifications)
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (keepClassSpecifications != null)
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            for (int index = 0; index < keepClassSpecifications.size(); index++)
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                KeepClassSpecification keepClassSpecification =
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    (KeepClassSpecification)keepClassSpecifications.get(index);
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                if (!keepClassSpecification.markClasses                      &&
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    (keepClassSpecification.fieldSpecifications  == null ||
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                     keepClassSpecification.fieldSpecifications.size() == 0) &&
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    (keepClassSpecification.methodSpecifications == null ||
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                     keepClassSpecification.methodSpecifications.size() == 0))
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                {
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    String className = keepClassSpecification.className;
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    if (className == null)
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    {
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        className = keepClassSpecification.extendsClassName;
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    }
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    if (className == null ||
742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        notePrinter.accepts(className))
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    {
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        notePrinter.print(className,
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                          "Note: the configuration doesn't specify which class members to keep for class '" +
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                          (className == null ?
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                              ConfigurationConstants.ANY_CLASS_KEYWORD :
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                              ClassUtil.externalClassName(className)) + "'");
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    }
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                }
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
87