1 21 package proguard.classfile.util; 22 23 import proguard.classfile.visitor.ClassVisitor; 24 import proguard.classfile.constant.visitor.ConstantVisitor; 25 import proguard.classfile.constant.*; 26 import proguard.classfile.*; 27 import proguard.classfile.attribute.visitor.AttributeVisitor; 28 import proguard.classfile.attribute.Attribute; 29 30 35 public class StringSharer 36 extends SimplifiedVisitor 37 implements ClassVisitor, 38 ConstantVisitor, 39 AttributeVisitor 40 { 41 private String name; 43 private String type; 44 45 46 48 public void visitProgramClass(ProgramClass programClass) 49 { 50 programClass.constantPoolEntriesAccept(this); 52 53 programClass.attributesAccept(this); 56 } 57 58 59 public void visitLibraryClass(LibraryClass libraryClass) 60 { 61 Clazz superClass = libraryClass.superClass; 63 if (superClass != null) 64 { 65 libraryClass.superClassName = superClass.getName(); 66 } 67 } 68 69 70 72 73 public void visitAnyConstant(Clazz clazz, Constant constant) {} 74 75 76 public void visitAnyStringConstant(Clazz clazz, StringConstant stringConstant) 77 { 78 Member referencedMember = stringConstant.referencedMember; 79 if (referencedMember != null) 80 { 81 Clazz referencedClass = stringConstant.referencedClass; 82 83 name = referencedMember.getName(referencedClass); 85 clazz.constantPoolEntryAccept(stringConstant.u2stringIndex, this); 86 } 87 } 88 89 90 public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) 91 { 92 Member referencedMember = refConstant.referencedMember; 93 if (referencedMember != null) 94 { 95 Clazz referencedClass = refConstant.referencedClass; 96 97 name = referencedMember.getName(referencedClass); 100 type = referencedMember.getDescriptor(referencedClass); 101 clazz.constantPoolEntryAccept(refConstant.u2nameAndTypeIndex, this); 102 } 103 } 104 105 106 public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) 107 { 108 if (name != null) 109 { 110 clazz.constantPoolEntryAccept(nameAndTypeConstant.u2nameIndex, this); 113 name = type; 114 clazz.constantPoolEntryAccept(nameAndTypeConstant.u2descriptorIndex, this); 115 } 116 } 117 118 119 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 120 { 121 Clazz referencedClass = classConstant.referencedClass; 122 if (referencedClass != null) 123 { 124 name = referencedClass.getName(); 126 clazz.constantPoolEntryAccept(classConstant.u2nameIndex, this); 127 } 128 } 129 130 131 public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) 132 { 133 if (name != null) 135 { 136 if (name.equals(utf8Constant.getString())) 138 { 139 utf8Constant.setString(name); 140 } 141 142 name = null; 143 } 144 } 145 146 147 149 public void visitAnyAttribute(Clazz clazz, Attribute attribute) 150 { 151 name = attribute.getAttributeName(clazz).intern(); 153 clazz.constantPoolEntryAccept(attribute.u2attributeNameIndex, this); 154 } 155 } 156 | Popular Tags |