1 21 package proguard.shrink; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.visitor.*; 26 import proguard.classfile.constant.*; 27 import proguard.classfile.constant.visitor.ConstantVisitor; 28 import proguard.classfile.util.SimplifiedVisitor; 29 import proguard.classfile.visitor.ClassVisitor; 30 31 39 public class InnerUsageMarker 40 extends SimplifiedVisitor 41 implements AttributeVisitor, 42 InnerClassesInfoVisitor, 43 ConstantVisitor, 44 ClassVisitor 45 { 46 private UsageMarker usageMarker; 47 48 private boolean attributeUsed; 50 private boolean classUsed; 51 52 53 58 public InnerUsageMarker(UsageMarker usageMarker) 59 { 60 this.usageMarker = usageMarker; 61 } 62 63 64 66 public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 67 68 69 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 70 { 71 attributeUsed = false; 73 innerClassesAttribute.innerClassEntriesAccept(clazz, this); 74 75 if (attributeUsed) 76 { 77 usageMarker.markAsUsed(innerClassesAttribute); 80 81 markConstant(clazz, innerClassesAttribute.u2attributeNameIndex); 82 } 83 } 84 85 86 88 public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) 89 { 90 boolean innerClassesInfoUsed = usageMarker.isUsed(innerClassesInfo); 91 92 if (!innerClassesInfoUsed) 93 { 94 int u2innerClassIndex = innerClassesInfo.u2innerClassIndex; 95 int u2outerClassIndex = innerClassesInfo.u2outerClassIndex; 96 int u2innerNameIndex = innerClassesInfo.u2innerNameIndex; 97 98 innerClassesInfoUsed = true; 99 100 if (u2innerClassIndex != 0) 101 { 102 markConstant(clazz, u2innerClassIndex); 104 innerClassesInfoUsed &= classUsed; 105 } 106 107 if (u2outerClassIndex != 0) 108 { 109 markConstant(clazz, u2outerClassIndex); 111 innerClassesInfoUsed &= classUsed; 112 } 113 114 if (innerClassesInfoUsed) 117 { 118 usageMarker.markAsUsed(innerClassesInfo); 119 120 if (u2innerNameIndex != 0) 121 { 122 markConstant(clazz, u2innerNameIndex); 123 } 124 } 125 } 126 127 attributeUsed |= innerClassesInfoUsed; 129 } 130 131 132 134 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 135 { 136 classUsed = usageMarker.isUsed(classConstant); 137 138 if (!classUsed) 140 { 141 classUsed = true; 143 classConstant.referencedClassAccept(this); 144 145 if (classUsed) 147 { 148 usageMarker.markAsUsed(classConstant); 150 151 markConstant(clazz, classConstant.u2nameIndex); 152 } 153 } 154 } 155 156 157 public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) 158 { 159 usageMarker.markAsUsed(utf8Constant); 160 } 161 162 163 165 public void visitProgramClass(ProgramClass programClass) 166 { 167 classUsed = usageMarker.isUsed(programClass); 168 } 169 170 171 public void visitLibraryClass(LibraryClass libraryClass) 172 { 173 classUsed = true; 174 } 175 176 177 179 183 private void markConstant(Clazz clazz, int index) 184 { 185 clazz.constantPoolEntryAccept(index, this); 186 } 187 } 188 | Popular Tags |