1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import org.apache.bcel.classfile.JavaClass; 23 import org.apache.bcel.classfile.Method; 24 import org.apache.bcel.generic.ConstantPoolGen; 25 import org.apache.bcel.generic.InvokeInstruction; 26 import org.apache.bcel.generic.MethodGen; 27 28 39 40 public class SignatureConverter { 41 private String signature; 42 43 48 public SignatureConverter(String signature) { 49 this.signature = signature; 50 } 51 52 55 public char getFirst() { 56 return signature.charAt(0); 57 } 58 59 62 public void skip() { 63 signature = signature.substring(1); 64 } 65 66 75 public String parseNext() { 76 StringBuffer result = new StringBuffer (); 77 78 if (signature.startsWith("[")) { 79 int dimensions = 0; 80 do { 81 ++dimensions; 82 signature = signature.substring(1); 83 } while (signature.charAt(0) == '['); 84 result.append(parseNext()); 85 86 while (dimensions-- > 0) { 87 result.append("[]"); 88 } 89 } else if (signature.startsWith("L")) { 90 int semi = signature.indexOf(';'); 91 if (semi < 0) 92 throw new IllegalStateException ("missing semicolon in signature " + signature); 93 result.append(signature.substring(1, semi).replace('/', '.')); 94 signature = signature.substring(semi + 1); 95 } else { 96 switch (signature.charAt(0)) { 97 case 'B': 98 result.append("byte"); 99 break; 100 case 'C': 101 result.append("char"); 102 break; 103 case 'D': 104 result.append("double"); 105 break; 106 case 'F': 107 result.append("float"); 108 break; 109 case 'I': 110 result.append("int"); 111 break; 112 case 'J': 113 result.append("long"); 114 break; 115 case 'S': 116 result.append("short"); 117 break; 118 case 'Z': 119 result.append("boolean"); 120 break; 121 default: 122 throw new IllegalStateException ("bad signature " + signature); 123 } 124 skip(); 125 } 126 127 return result.toString(); 128 } 129 130 137 public static String convertMethodSignature(JavaClass javaClass, Method method) { 138 return convertMethodSignature(javaClass.getClassName(), method.getName(), method.getSignature()); 139 } 140 141 147 public static String convertMethodSignature(MethodGen methodGen) { 148 return convertMethodSignature(methodGen.getClassName(), methodGen.getName(), methodGen.getSignature()); 149 } 150 151 158 public static String convertMethodSignature(InvokeInstruction inv, ConstantPoolGen cpg) { 159 return convertMethodSignature(inv.getClassName(cpg), inv.getName(cpg), inv.getSignature(cpg)); 160 } 161 162 170 public static String convertMethodSignature(String className, String methodName, String methodSig) { 171 return convertMethodSignature(className, methodName, methodSig, ""); 172 } 173 174 181 public static String convertMethodSignature(XMethod xmethod) { 182 return convertMethodSignature(xmethod.getClassName(), xmethod.getName(), xmethod.getSignature()); 183 } 184 185 195 public static String convertMethodSignature(String className, String methodName, String methodSig, String pkgName) { 196 StringBuffer args = new StringBuffer (); 197 SignatureConverter converter = new SignatureConverter(methodSig); 198 199 converter.skip(); 200 args.append('('); 201 202 while (converter.getFirst() != ')') { 203 if (args.length() > 1) 204 args.append(", "); 205 args.append(shorten(pkgName, converter.parseNext())); 206 } 207 converter.skip(); 208 args.append(')'); 209 210 212 StringBuffer result = new StringBuffer (); 213 result.append(className); 214 result.append('.'); 215 result.append(methodName); 216 result.append(args.toString()); 217 218 return result.toString(); 219 } 220 221 227 public static String convert(String signature) { 228 return new SignatureConverter(signature).parseNext(); 229 } 230 231 public static String shorten(String pkgName, String typeName) { 232 int index = typeName.lastIndexOf('.'); 233 if (index >= 0) { 234 String otherPkg = typeName.substring(0, index); 235 if (otherPkg.equals(pkgName) || otherPkg.equals("java.lang")) 236 typeName = typeName.substring(index + 1); 237 } 238 return typeName; 239 } 240 } 241 242 | Popular Tags |