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 SuperTypesOfSingleton extends TypeSet { 20 23 private TType fLowerBound; 24 25 SuperTypesOfSingleton(TType t, TypeSetEnvironment typeSetEnvironment) { 26 super(typeSetEnvironment); 27 fLowerBound= t; 28 } 29 30 33 public boolean isUniverse() { 34 return false; 35 } 36 37 40 public TypeSet makeClone() { 41 return this; } 43 44 47 protected TypeSet specialCasesIntersectedWith(TypeSet other) { 48 if (other.isSingleton() && other.anyMember().equals(fLowerBound)) 49 return other; 51 if (other instanceof SuperTypesOfSingleton) { 52 SuperTypesOfSingleton otherSuper= (SuperTypesOfSingleton) other; 53 54 if (TTypes.canAssignTo(otherSuper.fLowerBound, fLowerBound)) 55 return this; 56 if (TTypes.canAssignTo(fLowerBound, otherSuper.fLowerBound)) 57 return otherSuper; 58 } else if (other.hasUniqueUpperBound()) { 59 TType otherUpper= other.uniqueUpperBound(); 60 61 if (otherUpper.equals(fLowerBound)) 62 return new SingletonTypeSet(fLowerBound, getTypeSetEnvironment()); 63 if ((otherUpper != fLowerBound && TTypes.canAssignTo(otherUpper, fLowerBound)) || 64 ! TTypes.canAssignTo(fLowerBound, otherUpper)) 65 return getTypeSetEnvironment().getEmptyTypeSet(); 66 } 67 return null; 78 } 79 80 83 public boolean isEmpty() { 84 return false; 85 } 86 87 90 public TypeSet upperBound() { 91 return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment()); 92 } 93 94 97 public TypeSet lowerBound() { 98 return new SingletonTypeSet(fLowerBound, getTypeSetEnvironment()); 99 } 100 101 104 public boolean hasUniqueLowerBound() { 105 return true; 106 } 107 108 111 public boolean hasUniqueUpperBound() { 112 return true; 113 } 114 115 118 public TType uniqueLowerBound() { 119 return fLowerBound; 120 } 121 122 125 public TType uniqueUpperBound() { 126 return getJavaLangObject(); 127 } 128 129 132 public TypeSet superTypes() { 133 return this; } 135 136 139 public boolean contains(TType t) { 140 if (t.equals(fLowerBound)) 141 return true; 142 if (t.equals(getJavaLangObject())) 143 return true; 144 return TTypes.canAssignTo(fLowerBound, t); 145 } 146 147 150 public boolean containsAll(TypeSet other) { 151 if (other instanceof SuperTypesOfSingleton) { 153 SuperTypesOfSingleton otherSuper= (SuperTypesOfSingleton) other; 154 return TTypes.canAssignTo(fLowerBound, otherSuper.fLowerBound); 155 } 156 if (other instanceof SuperTypesSet) { 158 SuperTypesSet otherSuper= (SuperTypesSet) other; 159 TypeSet otherLowerBounds= otherSuper.lowerBound(); 160 161 for(Iterator iter= otherLowerBounds.iterator(); iter.hasNext(); ) { 162 TType t= (TType) iter.next(); 163 if (! TTypes.canAssignTo(fLowerBound, t)) 164 return false; 165 } 166 return true; 167 } 168 if (other.isUniverse()) { 169 return false; 170 } 171 for(Iterator iter= other.iterator(); iter.hasNext(); ) { 173 TType t= (TType) iter.next(); 174 175 if (! TTypes.canAssignTo(fLowerBound, t)) 176 return false; 177 } 178 return true; 179 } 180 181 184 public Iterator iterator() { 185 return enumerate().iterator(); 186 } 206 207 210 public boolean isSingleton() { 211 return fLowerBound.equals(getJavaLangObject()); 213 } 214 215 218 public TType anyMember() { 219 return fLowerBound; 220 } 221 222 private EnumeratedTypeSet fEnumCache= null; 223 224 227 public EnumeratedTypeSet enumerate() { 228 if (fEnumCache == null) { 229 if (fLowerBound instanceof ArrayType) { 230 ArrayType at= (ArrayType) fLowerBound; 231 fEnumCache= EnumeratedTypeSet.makeArrayTypesForElements(TTypes.getAllSuperTypesIterator(at.getComponentType()), getTypeSetEnvironment()); 232 fEnumCache.add(getJavaLangObject()); 233 } else 234 fEnumCache= new EnumeratedTypeSet(TTypes.getAllSuperTypesIterator(fLowerBound), getTypeSetEnvironment()); 235 236 fEnumCache.add(fLowerBound); 237 fEnumCache.initComplete(); 238 } 239 return fEnumCache; 240 } 241 242 public boolean equals(Object o) { 243 if (!(o instanceof SuperTypesOfSingleton)) 244 return false; 245 SuperTypesOfSingleton other= (SuperTypesOfSingleton) o; 246 247 return other.fLowerBound.equals(fLowerBound); 248 } 249 250 public String toString() { 251 return "<" + fID + ": superTypes(" + fLowerBound.getPrettySignature() + ")>"; } 253 } 254 | Popular Tags |