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 SuperTypesSet extends TypeSet { 20 private TypeSet fLowerBounds; 21 22 SuperTypesSet(TType subType, TypeSetEnvironment typeSetEnvironment) { 23 super(typeSetEnvironment); 24 fLowerBounds= new SingletonTypeSet(subType, typeSetEnvironment); 25 } 26 27 SuperTypesSet(TypeSet subTypes, TypeSetEnvironment typeSetEnvironment) { 28 super(typeSetEnvironment); 29 fLowerBounds= subTypes; 30 } 31 32 35 public boolean isUniverse() { 36 return fLowerBounds.isUniverse(); 37 } 38 39 42 public TypeSet makeClone() { 43 return this; } 45 46 49 public TypeSet upperBound() { 50 return new SingletonTypeSet(getTypeSetEnvironment().getJavaLangObject(), getTypeSetEnvironment()); 51 } 52 53 56 public TypeSet lowerBound() { 57 return fLowerBounds.lowerBound(); 61 } 62 63 66 protected TypeSet specialCasesIntersectedWith(TypeSet s2) { 67 if (fLowerBounds.equals(s2)) 68 return s2; if (s2 instanceof SuperTypesSet) { 70 SuperTypesSet st2= (SuperTypesSet) s2; 71 72 if (fLowerBounds.isSingleton() && st2.fLowerBounds.isSingleton()) { 73 TType t1= this.fLowerBounds.anyMember(); 74 TType t2= st2.fLowerBounds.anyMember(); 75 76 if (TTypes.canAssignTo(t1, t2)) 77 return new SuperTypesSet(st2.fLowerBounds, getTypeSetEnvironment()); 78 } else if (fLowerBounds instanceof SubTypesSet) { 79 SubTypesSet myLowerSubTypes= (SubTypesSet) fLowerBounds; 81 82 if (myLowerSubTypes.upperBound().equals(st2.upperBound())) 83 return st2; 84 } 85 } 86 if (s2 instanceof SuperTypesOfSingleton) { 87 SuperTypesOfSingleton st2= (SuperTypesOfSingleton) s2; 88 89 if (fLowerBounds.isSingleton()) { 90 TType t1= this.fLowerBounds.anyMember(); 91 TType t2= st2.uniqueLowerBound(); 92 93 if (TTypes.canAssignTo(t1, t2)) 94 return getTypeSetEnvironment().createSuperTypesOfSingleton(t2); 95 } else if (fLowerBounds instanceof SubTypesOfSingleton) { 96 SubTypesOfSingleton myLowerSubTypes= (SubTypesOfSingleton) fLowerBounds; 98 99 if (myLowerSubTypes.uniqueUpperBound().equals(st2.uniqueUpperBound())) 100 return st2; 101 } 102 } 103 if (s2 instanceof SubTypesSet) { 104 SubTypesSet st2= (SubTypesSet) s2; 105 if (fLowerBounds.equals(st2.upperBound())) 106 return fLowerBounds; 107 108 if (fLowerBounds instanceof TypeSetIntersection) { 109 TypeSetIntersection lbXSect= (TypeSetIntersection) fLowerBounds; 113 TypeSet xsectLeft= lbXSect.getLHS(); 114 TypeSet xsectRight= lbXSect.getRHS(); 115 116 if (xsectLeft.equals(st2.upperBound())) 117 return new TypeSetIntersection(s2, new SuperTypesSet(xsectRight, getTypeSetEnvironment())); 118 } 119 } 120 return null; 121 } 122 123 126 public TypeSet superTypes() { 127 return this; } 129 130 133 public boolean isEmpty() { 134 return fLowerBounds.isEmpty(); 135 } 136 137 140 public boolean contains(TType t) { 141 if (fEnumCache != null) return fEnumCache.contains(t); 142 143 if (t.equals(getJavaLangObject())) 144 return true; 145 if (fLowerBounds.contains(t)) 146 return true; 147 148 for(Iterator lbIter= fLowerBounds .iterator(); lbIter.hasNext(); ) { 151 TType lb= (TType) lbIter.next(); 152 153 if (TTypes.canAssignTo(lb, t)) 154 return true; 155 } 156 return false; 157 } 158 159 162 public boolean containsAll(TypeSet s) { 163 if (fEnumCache != null) return fEnumCache.containsAll(s); 164 165 if (!isUniverse() && s.isUniverse()) return false; 167 if (equals(s)) 168 return true; 169 if (fLowerBounds.containsAll(s)) 170 return true; 171 172 for(Iterator sIter= s.iterator(); sIter.hasNext(); ) { 174 TType t= (TType) sIter.next(); 175 boolean found= false; 176 177 for(Iterator lbIter= fLowerBounds .iterator(); lbIter.hasNext(); ) { 180 TType lb= (TType) lbIter.next(); 181 182 if (TTypes.canAssignTo(lb, t)) { 183 found= true; 184 break; 185 } 186 } 187 if (!found) return false; 188 } 189 return true; 190 } 191 192 195 public boolean isSingleton() { 196 if (fEnumCache != null) return fEnumCache.isSingleton(); 197 198 return fLowerBounds.isSingleton() && (fLowerBounds.anyMember() == getJavaLangObject()); 199 } 200 201 204 public TType anyMember() { 205 return fLowerBounds.anyMember(); 206 } 207 208 211 public boolean equals(Object o) { 212 if (o instanceof SuperTypesSet) { 213 SuperTypesSet other= (SuperTypesSet) o; 214 return other.fLowerBounds.equals(fLowerBounds); 215 } else 221 return false; 222 } 223 224 227 public Iterator iterator() { 228 return enumerate().iterator(); 229 } 230 231 public String toString() { 232 return "<" + fID + ": superTypes(" + fLowerBounds + ")>"; } 234 235 238 public boolean hasUniqueLowerBound() { 239 return fLowerBounds.isSingleton(); 240 } 241 242 245 public boolean hasUniqueUpperBound() { 246 return false; 247 } 248 249 252 public TType uniqueLowerBound() { 253 return fLowerBounds.isSingleton() ? fLowerBounds.anyMember() : null; 254 } 255 256 259 public TType uniqueUpperBound() { 260 return null; 261 } 262 263 private EnumeratedTypeSet fEnumCache= null; 264 265 268 public EnumeratedTypeSet enumerate() { 269 if (fEnumCache == null) { 270 fEnumCache= new EnumeratedTypeSet(getTypeSetEnvironment()); 271 boolean anyLBIsIntfOrArray= false; 272 273 for(Iterator iter= fLowerBounds.iterator(); iter.hasNext(); ) { 274 TType lb= (TType) iter.next(); 275 276 if (lb instanceof ArrayType) { 277 ArrayType at= (ArrayType) lb; 278 int numDims= at.getDimensions(); 279 for(Iterator elemSuperIter=TTypes.getAllSuperTypesIterator(at.getElementType()); elemSuperIter.hasNext(); ) 280 fEnumCache.add(TTypes.createArrayType((TType) elemSuperIter.next(), numDims)); 281 anyLBIsIntfOrArray= true; 282 } else { 283 for (Iterator iterator= TTypes.getAllSuperTypesIterator(lb); iterator.hasNext(); ) 284 fEnumCache.fMembers.add(iterator.next()); 285 } 286 fEnumCache.add(lb); 287 } 288 if (anyLBIsIntfOrArray) fEnumCache.add(getJavaLangObject()); 289 } 291 return fEnumCache; 292 } 293 } 294 | Popular Tags |