1/* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21package proguard.optimize.evaluation; 22 23import proguard.classfile.*; 24import proguard.classfile.visitor.*; 25import proguard.optimize.info.SimpleEnumMarker; 26 27/** 28 * This ClassVisitor marks all program classes that it visits as simple enums, 29 * if their methods qualify. 30 * 31 * @author Eric Lafortune 32 */ 33public class SimpleEnumClassChecker 34implements ClassVisitor 35{ 36 //* 37 private static final boolean DEBUG = false; 38 /*/ 39 private static boolean DEBUG = System.getProperty("enum") != null; 40 //*/ 41 42 43 private final SimpleEnumMarker simpleEnumMarker = new SimpleEnumMarker(true); 44 private final MemberVisitor virtualMethodChecker = new MemberAccessFilter(0, 45 ClassConstants.ACC_PRIVATE | 46 ClassConstants.ACC_STATIC, 47 new MemberToClassVisitor( 48 new SimpleEnumMarker(false))); 49 50 51 // Implementations for ClassVisitor. 52 53 public void visitLibraryClass(LibraryClass libraryClass) {} 54 55 public void visitProgramClass(ProgramClass programClass) 56 { 57 // Does the class have the simple enum constructor? 58 if (programClass.findMethod(ClassConstants.METHOD_NAME_INIT, 59 ClassConstants.METHOD_TYPE_INIT_ENUM) != null) 60 { 61 if (DEBUG) 62 { 63 System.out.println("SimpleEnumClassChecker: ["+programClass.getName()+"] is a candidate simple enum, without extra fields"); 64 } 65 66 // Mark it. 67 simpleEnumMarker.visitProgramClass(programClass); 68 69 // However, unmark it again if it has any non-private, non-static 70 // methods. 71 programClass.methodsAccept(virtualMethodChecker); 72 } 73 } 74}