| 1 21 package proguard.shrink; 22 23 import proguard.classfile.*; 24 import proguard.classfile.util.*; 25 import proguard.classfile.visitor.*; 26 27 import java.io.*; 28 29 30 38 public class UsagePrinter 39 extends SimplifiedVisitor 40 implements ClassVisitor, 41 MemberVisitor 42 { 43 private UsageMarker usageMarker; 44 private boolean printUnusedItems; 45 private PrintStream ps; 46 47 private String className; 49 50 51 58 public UsagePrinter(UsageMarker usageMarker, 59 boolean printUnusedItems) 60 { 61 this(usageMarker, printUnusedItems, System.out); 62 } 63 64 65 73 public UsagePrinter(UsageMarker usageMarker, 74 boolean printUnusedItems, 75 PrintStream printStream) 76 { 77 this.usageMarker = usageMarker; 78 this.printUnusedItems = printUnusedItems; 79 this.ps = printStream; 80 } 81 82 83 85 public void visitProgramClass(ProgramClass programClass) 86 { 87 if (usageMarker.isUsed(programClass)) 88 { 89 if (printUnusedItems) 90 { 91 className = programClass.getName(); 92 93 programClass.fieldsAccept(this); 94 programClass.methodsAccept(this); 95 96 className = null; 97 } 98 else 99 { 100 ps.println(ClassUtil.externalClassName(programClass.getName())); 101 } 102 } 103 else 104 { 105 if (printUnusedItems) 106 { 107 ps.println(ClassUtil.externalClassName(programClass.getName())); 108 } 109 } 110 } 111 112 113 115 public void visitProgramField(ProgramClass programClass, ProgramField programField) 116 { 117 if (usageMarker.isUsed(programField) ^ printUnusedItems) 118 { 119 printClassNameHeader(); 120 121 ps.println(" " + 122 lineNumberRange(programClass, programField) + 123 ClassUtil.externalFullFieldDescription( 124 programField.getAccessFlags(), 125 programField.getName(programClass), 126 programField.getDescriptor(programClass))); 127 } 128 } 129 130 131 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 132 { 133 if (usageMarker.isUsed(programMethod) ^ printUnusedItems) 134 { 135 printClassNameHeader(); 136 137 ps.println(" " + 138 lineNumberRange(programClass, programMethod) + 139 ClassUtil.externalFullMethodDescription( 140 programClass.getName(), 141 programMethod.getAccessFlags(), 142 programMethod.getName(programClass), 143 programMethod.getDescriptor(programClass))); 144 } 145 } 146 147 148 150 154 private void printClassNameHeader() 155 { 156 if (className != null) 157 { 158 ps.println(ClassUtil.externalClassName(className) + ":"); 159 className = null; 160 } 161 } 162 163 164 168 private static String lineNumberRange(ProgramClass programClass, ProgramMember programMember) 169 { 170 String range = programMember.getLineNumberRange(programClass); 171 return range != null ? 172 (range + ":") : 173 ""; 174 } 175 } 176 | Popular Tags |