| 1 11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets; 12 13 import java.util.Iterator ; 14 15 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType; 16 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType; 17 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes; 18 19 public class SubTypesSet extends TypeSet { 20 23 private TypeSet fUpperBounds; 24 25 SubTypesSet(TypeSet superTypes) { 26 super(superTypes.getTypeSetEnvironment()); 27 fUpperBounds= superTypes; 28 } 29 30 33 public boolean isUniverse() { 34 return fUpperBounds.isUniverse() || fUpperBounds.contains(getJavaLangObject()); 35 } 36 37 40 public TypeSet makeClone() { 41 return this; } 43 44 47 public boolean equals(Object o) { 48 if (o instanceof SubTypesSet) { 49 SubTypesSet other= (SubTypesSet) o; 50 return other.fUpperBounds.equals(fUpperBounds); 51 } else 57 return false; 58 } 59 60 63 protected TypeSet specialCasesIntersectedWith(TypeSet s2) { 64 if (fUpperBounds.equals(s2)) 65 return s2; if (s2 instanceof SubTypesSet) { 67 SubTypesSet st2= (SubTypesSet) s2; 68 69 if (fUpperBounds.isSingleton() && st2.fUpperBounds.isSingleton()) { 70 TType t1= this.fUpperBounds.anyMember(); 71 TType t2= st2.fUpperBounds.anyMember(); 72 73 if (TTypes.canAssignTo(t2, t1)) 74 return new SubTypesSet(st2.fUpperBounds); 75 } else if (fUpperBounds instanceof SubTypesSet) { 76 SubTypesSet myUpperSubTypes= (SubTypesSet) fUpperBounds; 78 79 if (myUpperSubTypes.lowerBound().equals(st2.lowerBound())) 80 return st2; 81 } 82 } 83 if (s2 instanceof SubTypesOfSingleton) { 84 SubTypesOfSingleton st2= (SubTypesOfSingleton) s2; 85 86 if (fUpperBounds.isSingleton()) { 87 TType t1= this.fUpperBounds.anyMember(); 88 TType t2= st2.uniqueUpperBound(); 89 90 if (TTypes.canAssignTo(t2, t1)) 91 return getTypeSetEnvironment().createSubTypesOfSingleton(t2); 92 } else if (fUpperBounds instanceof SubTypesOfSingleton) { 93 SubTypesOfSingleton myUpperSubTypes= (SubTypesOfSingleton) fUpperBounds; 95 96 if (myUpperSubTypes.uniqueLowerBound().equals(st2.uniqueLowerBound())) 97 return st2; 98 } 99 } 100 101 if (s2 instanceof SuperTypesSet) { 102 SuperTypesSet st2= (SuperTypesSet) s2; 103 104 if (fUpperBounds.equals(st2.lowerBound())) 105 return fUpperBounds; 106 107 if (fUpperBounds instanceof TypeSetIntersection) { 108 TypeSetIntersection lbXSect= (TypeSetIntersection) fUpperBounds; 112 TypeSet xsectLeft= lbXSect.getLHS(); 113 TypeSet xsectRight= lbXSect.getRHS(); 114 115 if (xsectLeft.equals(st2.lowerBound())) 116 return new TypeSetIntersection(s2, new SubTypesSet(xsectRight)); 117 } 118 } 119 return null; 120 } 121 122 125 public TypeSet subTypes() { 126 return this; } 128 129 132 public boolean isEmpty() { 133 return fUpperBounds.isEmpty(); 134 } 135 136 139 public boolean contains(TType t) { 140 if (fEnumCache != null) return fEnumCache.contains(t); 141 142 if (fUpperBounds.contains(t)) 143 return true; 144 145 Iterator ubIter= fUpperBounds.upperBound().iterator(); 148 149 for(; ubIter.hasNext(); ) { 150 TType ub= (TType) ubIter.next(); 151 152 if (TTypes.canAssignTo(t, ub)) 153 return true; 154 } 155 return false; 156 } 157 158 161 public boolean containsAll(TypeSet s) { 162 if (fEnumCache != null) return fEnumCache.containsAll(s); 163 164 if (fUpperBounds.containsAll(s)) 165 return true; 166 167 for(Iterator sIter= s.iterator(); sIter.hasNext(); ) { 169 TType t= (TType) sIter.next(); 170 boolean found= false; 171 172 for(Iterator ubIter= fUpperBounds .iterator(); ubIter.hasNext(); ) { 175 TType ub= (TType) ubIter.next(); 176 177 if (TTypes.canAssignTo(t, ub)) { 178 found= true; 179 break; 180 } 181 } 182 if (!found) return false; 183 } 184 return true; 185 } 186 187 191 private TType getElementTypeOf(TType t) { 192 if (t instanceof ArrayType) 193 return ((ArrayType) t).getElementType(); 194 return t; 195 } 196 197 200 public boolean isSingleton() { 201 if (!fUpperBounds.isSingleton()) 202 return false; 203 204 TType t= fUpperBounds.anyMember(); 205 206 return getElementTypeOf(t).getSubTypes().length == 0; 207 } 208 209 212 public TType anyMember() { 213 return fUpperBounds.anyMember(); 214 } 215 216 219 public TypeSet upperBound() { 220 return fUpperBounds; } 222 223 226 public TypeSet lowerBound() { 227 return enumerate().lowerBound(); 228 } 229 230 233 public Iterator iterator() { 234 return enumerate().iterator(); 235 } 236 237 240 public String toString() { 241 return "<" + fID + ": subTypes(" + fUpperBounds + ")>"; } 243 244 247 public boolean hasUniqueLowerBound() { 248 return false; 249 } 250 251 254 public boolean hasUniqueUpperBound() { 255 return fUpperBounds.isSingleton(); 256 } 257 258 261 public TType uniqueLowerBound() { 262 return null; 263 } 264 265 268 public TType uniqueUpperBound() { 269 return fUpperBounds.isSingleton() ? fUpperBounds.anyMember() : null; 270 } 271 272 private EnumeratedTypeSet fEnumCache= null; 273 274 277 public EnumeratedTypeSet enumerate() { 278 if (fEnumCache == null) { 279 fEnumCache= new EnumeratedTypeSet(getTypeSetEnvironment()); 280 281 for(Iterator iter= fUpperBounds.iterator(); iter.hasNext(); ) { 282 TType ub= (TType) iter.next(); 283 284 if (ub instanceof ArrayType) { 285 ArrayType at= (ArrayType) ub; 286 int numDims= at.getDimensions(); 287 for(Iterator elemSubIter=TTypes.getAllSubTypesIterator(at.getElementType()); elemSubIter.hasNext(); ) 288 fEnumCache.add(TTypes.createArrayType((TType) elemSubIter.next(), numDims)); 289 } else { 290 for (Iterator iterator= TTypes.getAllSubTypesIterator(ub); iterator.hasNext();) { 291 fEnumCache.fMembers.add(iterator.next()); 292 } 293 } 294 fEnumCache.add(ub); 295 } 296 } 298 return fEnumCache; 299 } 300 } 301 | Popular Tags |