1 21 package proguard.obfuscate; 22 23 import proguard.classfile.*; 24 import proguard.classfile.util.SimplifiedVisitor; 25 import proguard.classfile.attribute.*; 26 import proguard.classfile.attribute.visitor.AttributeVisitor; 27 import proguard.classfile.attribute.annotation.*; 28 import proguard.classfile.constant.*; 29 import proguard.classfile.constant.visitor.ConstantVisitor; 30 import proguard.classfile.visitor.*; 31 32 40 public class NameAndTypeUsageMarker 41 extends SimplifiedVisitor 42 implements ClassVisitor, 43 ConstantVisitor, 44 AttributeVisitor 45 { 46 private static final Object USED = new Object (); 48 49 50 52 public void visitProgramClass(ProgramClass programClass) 53 { 54 programClass.constantPoolEntriesAccept(this); 57 58 programClass.attributesAccept(this); 61 } 62 63 64 66 public void visitAnyConstant(Clazz clazz, Constant constant) {} 67 68 69 public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) 70 { 71 visitRefConstant(clazz, fieldrefConstant); 72 } 73 74 75 public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) 76 { 77 visitRefConstant(clazz, interfaceMethodrefConstant); 78 } 79 80 81 public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) 82 { 83 visitRefConstant(clazz, methodrefConstant); 84 } 85 86 87 private void visitRefConstant(Clazz clazz, RefConstant refConstant) 88 { 89 markNameAndTypeConstant(clazz, refConstant.u2nameAndTypeIndex); 90 } 91 92 93 95 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 96 97 98 public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 99 { 100 if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) 101 { 102 markNameAndTypeConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); 103 } 104 } 105 106 107 109 112 private void markNameAndTypeConstant(Clazz clazz, int index) 113 { 114 markAsUsed((NameAndTypeConstant)((ProgramClass)clazz).getConstant(index)); 115 } 116 117 118 122 private static void markAsUsed(VisitorAccepter visitorAccepter) 123 { 124 visitorAccepter.setVisitorInfo(USED); 125 } 126 127 128 132 static boolean isUsed(VisitorAccepter visitorAccepter) 133 { 134 return visitorAccepter.getVisitorInfo() == USED; 135 } 136 } 137 | Popular Tags |