1 14 package org.eclipse.jdt.internal.corext.dom; 15 16 import org.eclipse.jdt.core.dom.ITypeBinding; 17 import org.eclipse.jdt.core.dom.Modifier; 18 import org.eclipse.jdt.core.dom.PrimitiveType; 19 import org.eclipse.jdt.core.dom.PrimitiveType.Code; 20 21 24 public class TypeRules { 25 26 32 public static boolean canAssignPrimitive(PrimitiveType.Code toAssignCode, PrimitiveType.Code definedTypeCode) { 33 if (toAssignCode == definedTypeCode) { 35 return true; 36 } 37 if (definedTypeCode == PrimitiveType.BOOLEAN || toAssignCode == PrimitiveType.BOOLEAN) { 38 return false; 39 } 40 if (definedTypeCode == PrimitiveType.CHAR && toAssignCode == PrimitiveType.BYTE) { 41 return false; 42 } 43 return getTypeOrder(definedTypeCode) > getTypeOrder(toAssignCode); 44 } 45 46 52 public static boolean canAssign(ITypeBinding typeToAssign, ITypeBinding definedType) { 53 55 57 String voidName= PrimitiveType.VOID.toString(); 58 if (voidName.equals(typeToAssign.getName()) || voidName.equals(definedType.getName())) { 59 return false; 60 } 61 62 if (typeToAssign.isNullType()) { 63 return !definedType.isPrimitive(); 64 } 65 if (definedType.isArray()) { 66 if (!typeToAssign.isArray()) { 67 return false; } 69 int definedDim= definedType.getDimensions(); 70 int toAssignDim= typeToAssign.getDimensions(); 71 if (definedDim == toAssignDim) { 72 definedType= definedType.getElementType(); 73 typeToAssign= typeToAssign.getElementType(); 74 if (typeToAssign.isPrimitive() && typeToAssign != definedType) { 75 return false; } 77 } else if (definedDim < toAssignDim) { 79 return isArrayCompatible(definedType.getElementType()); 80 } else { 81 return false; 82 } 83 } 84 85 if (typeToAssign.isPrimitive()) { 86 if (!definedType.isPrimitive()) { 87 return false; 88 } 89 PrimitiveType.Code toAssignCode= PrimitiveType.toCode(typeToAssign.getName()); 90 PrimitiveType.Code definedTypeCode= PrimitiveType.toCode(definedType.getName()); 91 return canAssignPrimitive(toAssignCode, definedTypeCode); 92 } else { 93 if (definedType.isPrimitive()) { 94 return false; 95 } 96 97 if (typeToAssign.isArray()) { 98 return isArrayCompatible(definedType); 99 } 100 if (isJavaLangObject(definedType)) { return true; 102 } 103 return Bindings.isSuperType(definedType, typeToAssign); 104 } 105 } 106 107 private static int getTypeOrder(Code type) { 108 if (type == PrimitiveType.BYTE) 109 return 2; 110 if (type == PrimitiveType.CHAR) 111 return 3; 112 if (type == PrimitiveType.SHORT) 113 return 3; 114 if (type == PrimitiveType.INT) 115 return 4; 116 if (type == PrimitiveType.LONG) 117 return 5; 118 if (type == PrimitiveType.FLOAT) 119 return 6; 120 if (type == PrimitiveType.DOUBLE) 121 return 7; 122 return 0; 123 } 124 125 public static boolean isArrayCompatible(ITypeBinding definedType) { 126 if (definedType.isTopLevel()) { 127 if (definedType.isClass()) { 128 return "Object".equals(definedType.getName()) && "java.lang".equals(definedType.getPackage().getName()); } else { 130 String qualifiedName= definedType.getQualifiedName(); 131 return "java.io.Serializable".equals(qualifiedName) || "java.lang.Cloneable".equals(qualifiedName); } 133 } 134 return false; 135 } 136 137 public static boolean isJavaLangObject(ITypeBinding definedType) { 138 return definedType.isTopLevel() && definedType.isClass() && "Object".equals(definedType.getName()) && "java.lang".equals(definedType.getPackage().getName()); } 140 141 147 public static boolean canCast(ITypeBinding castType, ITypeBinding bindingToCast) { 148 150 String voidName= PrimitiveType.VOID.toString(); 151 152 if (castType.isAnonymous() || castType.isNullType() || voidName.equals(castType.getName())) { 153 throw new IllegalArgumentException (); 154 } 155 156 if (castType == bindingToCast) { 157 return true; 158 } 159 160 if (voidName.equals(bindingToCast.getName())) { 161 return false; 162 } 163 164 if (bindingToCast.isArray()) { 165 if (!castType.isArray()) { 166 return isArrayCompatible(castType); } 168 169 int toCastDim= bindingToCast.getDimensions(); 170 int castTypeDim= castType.getDimensions(); 171 if (toCastDim == castTypeDim) { 172 bindingToCast= bindingToCast.getElementType(); 173 castType= castType.getElementType(); 174 if (castType.isPrimitive() && castType != bindingToCast) { 175 return false; } 177 } else if (toCastDim < castTypeDim) { 179 return isArrayCompatible(bindingToCast.getElementType()); 180 } else { 181 return isArrayCompatible(castType.getElementType()); 182 } 183 } 184 if (castType.isPrimitive()) { 185 if (!bindingToCast.isPrimitive()) { 186 return false; 187 } 188 String boolName= PrimitiveType.BOOLEAN.toString(); 189 return (!boolName.equals(castType.getName()) && !boolName.equals(bindingToCast.getName())); 190 } else { 191 if (bindingToCast.isPrimitive()) { 192 return false; 193 } 194 if (castType.isArray()) { 195 return isArrayCompatible(bindingToCast); 196 } 197 if (castType.isInterface()) { 198 if ((bindingToCast.getModifiers() & Modifier.FINAL) != 0) { 199 return Bindings.isSuperType(castType, bindingToCast); 200 } else { 201 return true; 202 } 203 } 204 if (bindingToCast.isInterface()) { 205 if ((castType.getModifiers() & Modifier.FINAL) != 0) { 206 return Bindings.isSuperType(bindingToCast, castType); 207 } else { 208 return true; 209 } 210 } 211 if (isJavaLangObject(castType)) { 212 return true; 213 } 214 215 return Bindings.isSuperType(bindingToCast, castType) || Bindings.isSuperType(castType, bindingToCast); 216 } 217 } 218 219 } 220 | Popular Tags |