1 19 20 package edu.umd.cs.findbugs.ba.generic; 21 22 import java.util.ArrayList ; 23 import java.util.Iterator ; 24 import java.util.List ; 25 26 import org.apache.bcel.generic.ArrayType; 27 import org.apache.bcel.generic.ObjectType; 28 import org.apache.bcel.generic.Type; 29 30 37 public class GenericUtilities { 38 39 public static abstract class TypeCategory { 40 41 public static final TypeCategory NON_REFERENCE_TYPE = new TypeCategory(){ 42 public String asString(GenericObjectType obj) { 43 return GenericUtilities.getString(obj); 45 } 46 }; 47 48 49 public static final TypeCategory PLAIN_OBJECT_TYPE = new TypeCategory() 50 { 51 public String asString(GenericObjectType obj) { 52 return GenericUtilities.getString(obj); 54 } 55 }; 56 57 58 public static final TypeCategory ARRAY_TYPE = new TypeCategory() 59 { 60 public String asString(GenericObjectType obj) { 61 return GenericUtilities.getString(obj); 63 } 64 }; 65 66 67 public static final TypeCategory PARAMETERS = new TypeCategory() 68 { 69 public String asString(GenericObjectType obj) { 70 String result = obj.toString(); 71 result += "<"; 72 for (Type t : obj.parameters) { 73 result += GenericUtilities.getString(t) + ","; 74 } 75 return result.substring(0,result.length()-1) + ">"; 76 } 77 }; 78 79 81 public static final TypeCategory TYPE_VARIABLE = new TypeCategory() 82 { 83 public String asString(GenericObjectType obj) { 84 return obj.variable; 85 } 86 }; 87 88 90 public static final TypeCategory WILDCARD = new TypeCategory() 91 { 92 public String asString(GenericObjectType obj) { 93 return "?"; 94 } 95 }; 96 97 100 public static final TypeCategory WILDCARD_EXTENDS = new TypeCategory() 101 { 102 public String asString(GenericObjectType obj) { 103 return "? extends " + GenericUtilities.getString(obj.extension); 104 } 105 }; 106 107 110 public static final TypeCategory WILDCARD_SUPER = new TypeCategory() 111 { 112 public String asString(GenericObjectType obj) { 113 return "? super " + GenericUtilities.getString(obj.extension); 114 } 115 }; 116 117 public abstract String asString(GenericObjectType obj); 118 119 public static String asString(ArrayType atype) { 120 Type obj = atype.getBasicType(); 121 String result = GenericUtilities.getString(obj); 122 for (int i=0; i<atype.getDimensions(); i++) 123 result += "[]"; 124 return result; 125 } 126 } 127 128 132 public static final TypeCategory getTypeCategory(Type type) { 133 if (type instanceof GenericObjectType) 134 return ((GenericObjectType) type).getTypeCategory(); 135 136 if (type instanceof ObjectType) 137 return TypeCategory.PLAIN_OBJECT_TYPE; 138 139 if (type instanceof ArrayType) 140 return TypeCategory.ARRAY_TYPE; 141 142 return TypeCategory.NON_REFERENCE_TYPE; 143 } 144 145 public static final boolean isPlainObject(Type type) { 146 return getTypeCategory(type) == TypeCategory.PLAIN_OBJECT_TYPE; 147 } 148 149 152 public static final String getString(Type type) { 153 if (type instanceof GenericObjectType) 154 return ((GenericObjectType) type).toString(true); 155 else if (type instanceof ArrayType) 156 return TypeCategory.asString((ArrayType) type); 157 else 158 return type.toString(); 159 } 160 161 170 public static final Type getType(String signature) { 171 if (new GenericSignatureParser("(" + signature + ")V").getNumParameters() != 1) 173 throw new IllegalArgumentException ("the following signature does not " + 174 "contain exactly one type: " + signature); 175 176 int index = 0; 177 178 if (signature.startsWith("L")) { 179 index = signature.indexOf('<'); 180 if (index < 0) 181 return Type.getType(signature); 182 183 List <Type> parameters = GenericUtilities.getTypes( 184 signature.substring(index+1, signature.lastIndexOf('>'))); 185 return new GenericObjectType(signature.substring(1,index), parameters); 186 187 } else if (signature.startsWith("T")) { 188 return new GenericObjectType(signature.substring(1,signature.length()-1)); 190 191 } else if (signature.startsWith("[")) { 192 index = signature.lastIndexOf('[') + 1; 193 return new ArrayType( getType(signature.substring(index)), index); 194 195 } else if (signature.startsWith("*")) { 196 return new GenericObjectType("*"); 197 198 } else if (signature.startsWith("+") || signature.startsWith("-")) { 199 return new GenericObjectType( 200 signature.substring(0,1), 201 getType(signature.substring(1)) ); 202 203 } else 204 return Type.getType(signature); 206 } 207 208 214 public static final List <Type> getTypes(String signature) { 215 GenericSignatureParser parser = new GenericSignatureParser("(" + signature + ")V"); 216 List <Type> types = new ArrayList <Type>(); 217 218 Iterator <String > iter = parser.parameterSignatureIterator(); 219 while (iter.hasNext()) { 220 String parameterString = iter.next(); 221 types.add(getType(parameterString)); 222 } 223 return types; 224 } 225 226 } 227 | Popular Tags |