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.visitor; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.ClassUtil; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.PrintStream; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This <code>ClassVisitor</code> and <code>MemberVisitor</code> 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * prints out the class names of the classes it visits, and the full class 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * member descriptions of the class members it visits. The names are printed 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * in a readable, Java-like format. The access modifiers can be included or not. 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class SimpleClassPrinter 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements ClassVisitor, 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MemberVisitor 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final boolean printAccessModifiers; 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final PrintStream ps; 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new SimpleClassPrinter that prints to 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>System.out</code>, including the access modifiers. 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public SimpleClassPrinter() 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this(true); 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new SimpleClassPrinter that prints to 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>System.out</code>, with or without the access modifiers. 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public SimpleClassPrinter(boolean printAccessModifiers) 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this(printAccessModifiers, System.out); 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new SimpleClassPrinter that prints to the given 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>PrintStream</code>, with or without the access modifiers. 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public SimpleClassPrinter(boolean printAccessModifiers, 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato PrintStream printStream) 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.printAccessModifiers = printAccessModifiers; 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.ps = printStream; 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ClassVisitor. 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramClass(ProgramClass programClass) 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getAccessFlags() : 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getName())); 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLibraryClass(LibraryClass libraryClass) 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getAccessFlags() : 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getName())); 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for MemberVisitor. 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramField(ProgramClass programClass, ProgramField programField) 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getAccessFlags() : 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getName()) + 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ": " + 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalFullFieldDescription( 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programField.getAccessFlags() : 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programField.getName(programClass), 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programField.getDescriptor(programClass))); 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getAccessFlags() : 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getName()) + 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ": " + 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalFullMethodDescription( 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.getName(), 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programMethod.getAccessFlags() : 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programMethod.getName(programClass), 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programMethod.getDescriptor(programClass))); 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getAccessFlags() : 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getName()) + 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ": " + 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalFullFieldDescription( 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryField.getAccessFlags() : 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryField.getName(libraryClass), 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryField.getDescriptor(libraryClass))); 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ps.println(ClassUtil.externalFullClassDescription( 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getAccessFlags() : 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getName()) + 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ": " + 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalFullMethodDescription( 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryClass.getName(), 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printAccessModifiers ? 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryMethod.getAccessFlags() : 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryMethod.getName(libraryClass), 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryMethod.getDescriptor(libraryClass))); 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 168