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