1 11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets; 12 13 import java.util.Iterator ; 14 import java.util.LinkedHashSet ; 15 import java.util.Set ; 16 17 import org.eclipse.core.runtime.Assert; 18 19 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType; 20 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType; 21 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes; 22 23 27 public class EnumeratedTypeSet extends TypeSet { 28 static private int sCount= 0; 29 30 static public int getCount() { 31 return sCount; 32 } 33 34 static public void resetCount() { 35 sCount= 0; 36 } 37 38 41 Set fMembers= new LinkedHashSet (); 42 43 47 public EnumeratedTypeSet(Iterator types, TypeSetEnvironment typeSetEnvironment) { 48 super(typeSetEnvironment); 49 while (types.hasNext()) { 50 fMembers.add(types.next()); 51 } 52 sCount++; 53 } 54 55 58 public EnumeratedTypeSet(TypeSetEnvironment typeSetEnvironment) { 59 super(typeSetEnvironment); 60 sCount++; 61 } 62 63 66 public EnumeratedTypeSet(TType t, TypeSetEnvironment typeSetEnvironment) { 67 super(typeSetEnvironment); 68 Assert.isNotNull(t); 69 fMembers.add(t); 70 sCount++; 71 } 72 73 76 public boolean isUniverse() { 77 return false; 78 } 79 80 public boolean equals(Object o) { 81 if (this == o) return true; 82 if (o instanceof EnumeratedTypeSet) { 83 EnumeratedTypeSet other= (EnumeratedTypeSet) o; 84 85 return fMembers.equals(other.fMembers); 86 } else if (o instanceof SingletonTypeSet) { 87 SingletonTypeSet other= (SingletonTypeSet) o; 88 89 return (fMembers.size() == 1) && fMembers.contains(other.anyMember()); 90 } else if (o instanceof TypeSet) { 91 TypeSet other= (TypeSet) o; 92 93 for(Iterator otherIter= other.iterator(); otherIter.hasNext(); ) { 94 if (!fMembers.contains(otherIter.next())) 95 return false; 96 } 97 for(Iterator myIter= fMembers.iterator(); myIter.hasNext(); ) { 98 if (!other.contains((TType) myIter.next())) 99 return false; 100 } 101 return true; 102 } else 103 return false; 104 } 105 106 public int hashCode() { 107 return 37 + fMembers.hashCode(); 108 } 109 110 115 protected TypeSet specialCasesIntersectedWith(TypeSet s2) { 116 if (s2 instanceof EnumeratedTypeSet) { 117 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); 118 119 result.addAll(this); result.retainAll(s2); 121 if (result.size() > 0) 122 return result; 123 else 124 return getTypeSetEnvironment().getEmptyTypeSet(); 125 } 126 return null; 127 } 128 129 133 public void intersectWith(TypeSet s2) { 134 if (isUniverse()) { 135 if (s2.isUniverse()) 136 return; 137 EnumeratedTypeSet ets2= (EnumeratedTypeSet) s2; 140 fMembers= new LinkedHashSet (); 141 fMembers.addAll(ets2.fMembers); 142 } else 143 retainAll(s2); 144 } 145 146 150 public TypeSet subTypes() { 151 if (isUniverse()) 152 return makeClone(); 154 if (fMembers.contains(getJavaLangObject())) 155 return getTypeSetEnvironment().getUniverseTypeSet(); 156 157 return getTypeSetEnvironment().createSubTypesSet(this); 158 } 159 160 public static EnumeratedTypeSet makeArrayTypesForElements(Iterator elemTypes, TypeSetEnvironment typeSetEnvironment) { 161 EnumeratedTypeSet result= new EnumeratedTypeSet(typeSetEnvironment); 162 163 while (elemTypes.hasNext()) { 164 TType t= (TType) elemTypes.next(); 165 result.add(TTypes.createArrayType(t, 1)); 166 } 167 return result; 169 } 170 171 175 public TypeSet superTypes() { 176 if (isUniverse()) 177 return makeClone(); 179 return getTypeSetEnvironment().createSuperTypesSet(this); 180 } 181 182 public TypeSet makeClone() { 183 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); 184 185 result.fMembers.addAll(fMembers); 186 result.initComplete(); 187 return result; 188 } 189 190 193 public int size() { 194 return fMembers.size(); 195 } 196 197 200 public void clear() { 201 if (isUniverse()) 202 fMembers= new LinkedHashSet (); 203 else 204 fMembers.clear(); 205 } 206 207 210 public boolean isEmpty() { 211 return fMembers.isEmpty(); 212 } 213 214 217 public TType[] toArray() { 218 return (TType[]) fMembers.toArray(new TType[fMembers.size()]); 219 } 220 221 224 public boolean add(TType t) { 225 Assert.isTrue(!isUniverse(), "Someone's trying to expand the universe!"); return fMembers.add(t); 228 } 229 230 233 public boolean contains(TType t) { 234 if (isUniverse()) 235 return true; 236 return fMembers.contains(t); 237 } 238 239 242 public boolean remove(TType t) { 243 if (isUniverse()) 244 fMembers= cloneSet(fMembers); 245 return fMembers.remove(t); 246 } 247 248 private Set cloneSet(Set members) { 249 Set result= new LinkedHashSet (); 250 result.addAll(members); 251 return result; 252 } 253 254 257 public boolean addAll(TypeSet s) { 258 if (s instanceof EnumeratedTypeSet) { 259 EnumeratedTypeSet ets= (EnumeratedTypeSet) s; 260 261 return fMembers.addAll(ets.fMembers); 262 } else { 263 EnumeratedTypeSet ets= s.enumerate(); 264 265 return fMembers.addAll(ets.fMembers); 266 } 267 } 268 269 public TypeSet addedTo(TypeSet that) { 270 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); 271 272 result.addAll(this); 273 result.addAll(that); 274 result.initComplete(); 275 return result; 276 } 277 278 281 public boolean containsAll(TypeSet s) { 282 if (isUniverse()) 283 return true; 284 if (s.isUniverse()) 285 return false; 286 EnumeratedTypeSet ets= s.enumerate(); 287 288 return fMembers.containsAll(ets.fMembers); 289 } 290 291 294 public boolean removeAll(EnumeratedTypeSet s) { 295 if (isUniverse()) 296 fMembers= cloneSet(fMembers); 297 return fMembers.removeAll(s.fMembers); 298 } 299 300 303 public boolean retainAll(TypeSet s) { 304 if (s.isUniverse()) return false; 305 306 EnumeratedTypeSet ets= (EnumeratedTypeSet) s; 307 308 if (isUniverse()) { 309 fMembers= cloneSet(ets.fMembers); 310 return true; 311 } else 312 return fMembers.retainAll(ets.fMembers); 313 } 314 315 318 public boolean isSingleton() { 319 return fMembers.size() == 1; 320 } 321 322 325 public TType anyMember() { 326 return (TType) fMembers.iterator().next(); 327 } 328 329 332 public TypeSet upperBound() { 333 if (fMembers.size() == 1) 334 return new SingletonTypeSet((TType) fMembers.iterator().next(), getTypeSetEnvironment()); 335 if (fMembers.contains(getJavaLangObject())) 336 return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment()); 337 338 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); 339 340 result.fMembers.addAll(fMembers); 342 for(Iterator iter= fMembers.iterator(); iter.hasNext(); ) { 343 TType t= (TType) iter.next(); 344 345 if (t.isArrayType()) { 346 ArrayType at= (ArrayType) t; 347 int numDims= at.getDimensions(); 348 for(Iterator subIter=TTypes.getAllSubTypesIterator(at.getElementType()); subIter.hasNext(); ) { 349 result.fMembers.remove(TTypes.createArrayType(((TType) subIter.next()), numDims)); 350 } 351 } else { 352 for (Iterator iterator= TTypes.getAllSubTypesIterator(t); iterator.hasNext();) { 353 result.fMembers.remove(iterator.next()); 354 } 355 } 356 } 357 result.initComplete(); 358 return result; 359 } 360 361 364 public TypeSet lowerBound() { 365 if (fMembers.size() == 1) 366 return new SingletonTypeSet((TType) fMembers.iterator().next(), getTypeSetEnvironment()); 367 368 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); 369 370 result.fMembers.addAll(fMembers); 372 373 for(Iterator iter= fMembers.iterator(); iter.hasNext(); ) { 374 TType t= (TType) iter.next(); 375 376 if (t.equals(getJavaLangObject())) { 379 result.fMembers.remove(t); 380 continue; 381 } 382 383 if (t instanceof ArrayType) { 384 ArrayType at= (ArrayType) t; 385 int numDims= at.getDimensions(); 386 for(Iterator superIter=TTypes.getAllSuperTypesIterator(at.getElementType()); superIter.hasNext(); ) { 387 result.fMembers.remove(TTypes.createArrayType(((TType) superIter.next()), numDims)); 388 } 389 } else { 390 for (Iterator iterator= TTypes.getAllSuperTypesIterator(t); iterator.hasNext();) { 391 result.fMembers.remove(iterator.next()); 392 } 393 } 394 } 395 if (result.size() > 0) 396 return result; 397 else 398 return getTypeSetEnvironment().getEmptyTypeSet(); 399 } 400 401 404 public boolean hasUniqueLowerBound() { 405 return fMembers.size() == 1; 406 } 407 408 411 public boolean hasUniqueUpperBound() { 412 return fMembers.size() == 1; 413 } 414 415 418 public TType uniqueLowerBound() { 419 if (fMembers.size() == 1) 420 return (TType) fMembers.iterator().next(); 421 return null; 422 } 423 424 427 public TType uniqueUpperBound() { 428 if (fMembers.size() == 1) 429 return (TType) fMembers.iterator().next(); 430 return null; 431 } 432 433 436 public Iterator iterator() { 437 return fMembers.iterator(); 438 } 439 440 443 public TType[] toArray(TType[] a) { 444 return (TType[]) fMembers.toArray(a); 445 } 446 447 450 private static final int sMaxElements= 10; 452 456 public String toString() { 457 StringBuffer b= new StringBuffer (); 458 b.append("{" + fID+ ":"); if (isUniverse()) 460 b.append(" <universe>"); else { 462 int count=0; 463 Iterator iter; 464 for(iter= iterator(); iter.hasNext() && count < sMaxElements; count++) { 465 TType type= (TType) iter.next(); 466 b.append(' ') 467 .append(type.getPrettySignature()); 468 if (iter.hasNext()) 469 b.append(','); 470 } 471 if (iter.hasNext()) 472 b.append(" ..."); } 474 b.append(" }"); return b.toString(); 476 } 477 478 481 public EnumeratedTypeSet enumerate() { 482 return this; } 484 485 public void initComplete() { 486 Assert.isTrue(! fMembers.isEmpty()); 487 } 488 489 } 490 | Popular Tags |