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 ShortestUsagePrinter 39 implements ClassVisitor, 40 MemberVisitor 41 { 42 private ShortestUsageMarker shortestUsageMarker; 43 private boolean verbose; 44 private PrintStream ps; 45 46 47 52 public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker) 53 { 54 this(shortestUsageMarker, true); 55 } 56 57 58 64 public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker, 65 boolean verbose) 66 { 67 this(shortestUsageMarker, verbose, System.out); 68 } 69 70 77 public ShortestUsagePrinter(ShortestUsageMarker shortestUsageMarker, 78 boolean verbose, 79 PrintStream printStream) 80 { 81 this.shortestUsageMarker = shortestUsageMarker; 82 this.verbose = verbose; 83 this.ps = printStream; 84 } 85 86 87 89 public void visitProgramClass(ProgramClass programClass) 90 { 91 ps.println(ClassUtil.externalClassName(programClass.getName())); 93 94 printReason(programClass); 96 } 97 98 99 public void visitLibraryClass(LibraryClass libraryClass) 100 { 101 ps.println(ClassUtil.externalClassName(libraryClass.getName())); 103 104 ps.println(" is a library class.\n"); 106 } 107 108 109 111 public void visitProgramField(ProgramClass programClass, ProgramField programField) 112 { 113 String name = programField.getName(programClass); 115 String type = programField.getDescriptor(programClass); 116 117 ps.println(ClassUtil.externalClassName(programClass.getName()) + 118 (verbose ? 119 ": " + ClassUtil.externalFullFieldDescription(0, name, type): 120 "." + name) + 121 lineNumberRange(programClass, programField)); 122 123 printReason(programField); 125 } 126 127 128 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 129 { 130 String name = programMethod.getName(programClass); 132 String type = programMethod.getDescriptor(programClass); 133 134 ps.println(ClassUtil.externalClassName(programClass.getName()) + 135 (verbose ? 136 ": " + ClassUtil.externalFullMethodDescription(programClass.getName(), 0, name, type): 137 "." + name) + 138 lineNumberRange(programClass, programMethod)); 139 140 printReason(programMethod); 142 } 143 144 145 public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) 146 { 147 String name = libraryField.getName(libraryClass); 149 String type = libraryField.getDescriptor(libraryClass); 150 151 ps.println(ClassUtil.externalClassName(libraryClass.getName()) + 152 (verbose ? 153 ": " + ClassUtil.externalFullFieldDescription(0, name, type): 154 "." + name)); 155 156 ps.println(" is a library field.\n"); 158 } 159 160 161 public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) 162 { 163 String name = libraryMethod.getName(libraryClass); 165 String type = libraryMethod.getDescriptor(libraryClass); 166 167 ps.println(ClassUtil.externalClassName(libraryClass.getName()) + 168 (verbose ? 169 ": " + ClassUtil.externalFullMethodDescription(libraryClass.getName(), 0, name, type): 170 "." + name)); 171 172 ps.println(" is a library method.\n"); 174 } 175 176 177 179 private void printReason(VisitorAccepter visitorAccepter) 180 { 181 if (shortestUsageMarker.isUsed(visitorAccepter)) 182 { 183 ShortestUsageMark shortestUsageMark = shortestUsageMarker.getShortestUsageMark(visitorAccepter); 184 185 ps.print(" " + shortestUsageMark.getReason()); 187 188 shortestUsageMark.acceptClassVisitor(this); 190 shortestUsageMark.acceptMethodVisitor(this); 191 } 192 else 193 { 194 ps.println(" is not being kept.\n"); 195 } 196 } 197 198 199 203 private static String lineNumberRange(ProgramClass programClass, ProgramMember programMember) 204 { 205 String range = programMember.getLineNumberRange(programClass); 206 return range != null ? 207 (" (" + range + ")") : 208 ""; 209 } 210 } 211 | Popular Tags |