1/* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2009 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.obfuscate; 22 23import proguard.classfile.*; 24import proguard.classfile.util.SimplifiedVisitor; 25import proguard.classfile.constant.ClassConstant; 26import proguard.classfile.constant.visitor.ConstantVisitor; 27import proguard.classfile.attribute.*; 28import proguard.classfile.attribute.visitor.*; 29import proguard.classfile.visitor.*; 30 31 32/** 33 * This <code>ClassVisitor</code> and <code>MemberVisitor</code> 34 * marks names of the classes and class members it visits. The marked names 35 * will remain unchanged in the obfuscation step. 36 * 37 * @see ClassObfuscator 38 * @see MemberObfuscator 39 * 40 * @author Eric Lafortune 41 */ 42class NameMarker 43extends SimplifiedVisitor 44implements ClassVisitor, 45 MemberVisitor, 46 AttributeVisitor, 47 InnerClassesInfoVisitor, 48 ConstantVisitor 49{ 50 // Implementations for ClassVisitor. 51 52 public void visitProgramClass(ProgramClass programClass) 53 { 54 keepClassName(programClass); 55 56 // Make sure any outer class names are kept as well. 57 programClass.attributesAccept(this); 58 } 59 60 61 public void visitLibraryClass(LibraryClass libraryClass) 62 { 63 keepClassName(libraryClass); 64 } 65 66 67 // Implementations for MemberVisitor. 68 69 public void visitProgramField(ProgramClass programClass, ProgramField programField) 70 { 71 keepFieldName(programClass, programField); 72 } 73 74 75 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 76 { 77 keepMethodName(programClass, programMethod); 78 } 79 80 81 public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) 82 { 83 keepFieldName(libraryClass, libraryField); 84 } 85 86 87 public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) 88 { 89 keepMethodName(libraryClass, libraryMethod); 90 } 91 92 93 // Implementations for AttributeVisitor. 94 95 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 96 97 98 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 99 { 100 // Make sure the outer class names are kept as well. 101 innerClassesAttribute.innerClassEntriesAccept(clazz, this); 102 } 103 104 105 // Implementations for InnerClassesInfoVisitor. 106 107 public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) 108 { 109 // Make sure the outer class name is kept as well. 110 int innerClassIndex = innerClassesInfo.u2innerClassIndex; 111 int outerClassIndex = innerClassesInfo.u2outerClassIndex; 112 if (innerClassIndex != 0 && 113 outerClassIndex != 0 && 114 clazz.getClassName(innerClassIndex).equals(clazz.getName())) 115 { 116 clazz.constantPoolEntryAccept(outerClassIndex, this); 117 } 118 } 119 120 121 // Implementations for ConstantVisitor. 122 123 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 124 { 125 // Make sure the outer class name is kept as well. 126 classConstant.referencedClassAccept(this); 127 } 128 129 130 // Small utility method. 131 132 /** 133 * Ensures the name of the given class name will be kept. 134 */ 135 public void keepClassName(Clazz clazz) 136 { 137 ClassObfuscator.setNewClassName(clazz, 138 clazz.getName()); 139 } 140 141 142 /** 143 * Ensures the name of the given field name will be kept. 144 */ 145 private void keepFieldName(Clazz clazz, Field field) 146 { 147 MemberObfuscator.setFixedNewMemberName(field, 148 field.getName(clazz)); 149 } 150 151 152 /** 153 * Ensures the name of the given method name will be kept. 154 */ 155 private void keepMethodName(Clazz clazz, Method method) 156 { 157 String name = method.getName(clazz); 158 159 if (!name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) && 160 !name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)) 161 { 162 MemberObfuscator.setFixedNewMemberName(method, 163 method.getName(clazz)); 164 } 165 } 166} 167