1 11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets; 12 13 import java.util.Iterator ; 14 15 import org.eclipse.core.runtime.Assert; 16 17 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType; 18 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType; 19 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes; 20 21 public class SubTypesOfSingleton extends TypeSet { 22 25 private final TType fUpperBound; 26 27 protected SubTypesOfSingleton(TType t, TypeSetEnvironment typeSetEnvironment) { 28 super(typeSetEnvironment); 29 Assert.isNotNull(t); 30 fUpperBound= t; 31 } 32 33 36 public boolean isUniverse() { 37 return fUpperBound.equals(getJavaLangObject()); 38 } 39 40 43 public TypeSet makeClone() { 44 return this; } 46 47 50 public TypeSet subTypes() { 51 return this; } 53 54 57 public TypeSet specialCasesIntersectedWith(TypeSet other) { 58 if (other.isSingleton() && other.anyMember().equals(fUpperBound)) 59 return other; 61 if (other instanceof SubTypesOfSingleton) { 62 SubTypesOfSingleton otherSub= (SubTypesOfSingleton) other; 63 64 if (TTypes.canAssignTo(otherSub.fUpperBound, fUpperBound)) 65 return otherSub; if (TTypes.canAssignTo(fUpperBound, otherSub.fUpperBound)) 67 return this; } else if (other.hasUniqueLowerBound()) { 69 TType otherLower= other.uniqueLowerBound(); 70 71 if (otherLower.equals(fUpperBound)) 72 return new SingletonTypeSet(fUpperBound, getTypeSetEnvironment()); 73 if (otherLower != fUpperBound && TTypes.canAssignTo(fUpperBound, otherLower) || 74 ! TTypes.canAssignTo(otherLower, fUpperBound)) 75 return getTypeSetEnvironment().getEmptyTypeSet(); 76 } 77 return null; 88 } 89 90 93 public boolean isEmpty() { 94 return false; 95 } 96 97 100 public TypeSet upperBound() { 101 return new SingletonTypeSet(fUpperBound, getTypeSetEnvironment()); 102 } 103 104 107 public TypeSet lowerBound() { 108 EnumeratedTypeSet e= enumerate(); 109 return e.lowerBound(); 110 } 111 112 115 public boolean hasUniqueLowerBound() { 116 118 return false; } 121 122 125 public boolean hasUniqueUpperBound() { 126 return true; 127 } 128 129 132 public TType uniqueLowerBound() { 133 TypeSet lowerBound= lowerBound(); 134 135 return lowerBound.anyMember(); 136 } 137 138 141 public TType uniqueUpperBound() { 142 return fUpperBound; 143 } 144 145 148 public boolean contains(TType t) { 149 if (t.equals(fUpperBound)) 150 return true; 151 return TTypes.canAssignTo(t, fUpperBound); 152 } 153 154 157 public boolean containsAll(TypeSet other) { 158 if (isUniverse()) 159 return true; 160 161 if (other instanceof SubTypesOfSingleton) { 163 SubTypesOfSingleton otherSub= (SubTypesOfSingleton) other; 164 return TTypes.canAssignTo(otherSub.fUpperBound, fUpperBound); 165 } 166 if (other instanceof SubTypesSet) { 168 SubTypesSet otherSub= (SubTypesSet) other; 169 TypeSet otherUpperBounds= otherSub.upperBound(); 170 171 for(Iterator iter= otherUpperBounds.iterator(); iter.hasNext(); ) { 172 TType t= (TType) iter.next(); 173 if (! TTypes.canAssignTo(t, fUpperBound)) 174 return false; 175 } 176 return true; 177 } 178 for(Iterator iter= other.iterator(); iter.hasNext(); ) { 180 TType t= (TType) iter.next(); 181 182 if (! TTypes.canAssignTo(t, fUpperBound)) 183 return false; 184 } 185 return true; 186 } 187 188 191 public Iterator iterator() { 192 return enumerate().iterator(); 193 } 211 212 216 private TType getElementTypeOf(TType t) { 217 if (t instanceof ArrayType) 218 return ((ArrayType) t).getElementType(); 219 return t; 220 } 221 222 225 public boolean isSingleton() { 226 return getElementTypeOf(fUpperBound).getSubTypes().length == 0; 227 } 228 229 232 public TType anyMember() { 233 return fUpperBound; 234 } 235 236 private EnumeratedTypeSet fEnumCache= null; 237 238 241 public EnumeratedTypeSet enumerate() { 242 if (fEnumCache == null) { 243 if (fUpperBound instanceof ArrayType) { 244 ArrayType at= (ArrayType) fUpperBound; 245 fEnumCache= EnumeratedTypeSet.makeArrayTypesForElements(TTypes.getAllSubTypesIterator(at.getComponentType()),getTypeSetEnvironment()); 246 } else 247 fEnumCache= new EnumeratedTypeSet(TTypes.getAllSubTypesIterator(fUpperBound), getTypeSetEnvironment()); 248 249 fEnumCache.add(fUpperBound); 250 fEnumCache.initComplete(); 251 } 252 return fEnumCache; 253 } 254 255 public boolean equals(Object o) { 256 if (!(o instanceof SubTypesOfSingleton)) 257 return false; 258 SubTypesOfSingleton other= (SubTypesOfSingleton) o; 259 260 return other.fUpperBound.equals(fUpperBound); 261 } 262 263 public String toString() { 264 return "<" + fID + ": subTypes(" + fUpperBound.getPrettySignature() + ")>"; } 266 } 267 | Popular Tags |