1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * Robert M. Fuhrer (rfuhrer@watson.ibm.com), IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets;
13 import java.util.Iterator;
14 import java.util.LinkedHashSet;
17 import org.eclipse.core.runtime.Assert;
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;
24 * A type-safe wrapper for {@code Set<TType>} that also adds {@code TType}-specific
25 * functionality, e.g. subTypes() and superTypes().
27 public class EnumeratedTypeSet extends TypeSet {
28 public static int sCount= 0;
30 static public int getCount() {
34 static public void resetCount() {
39 * Set containing the TTypes in this EnumeratedTypeSet.
41 public Set<TType> fMembers= new LinkedHashSet<TType>();
44 * Constructs a new EnumeratedTypeSet with the members of Set s in it.
45 * All elements of s must be TTypes.
47 * @param types the types
48 * @param typeSetEnvironment the environment
50 public EnumeratedTypeSet(Iterator<TType> types, TypeSetEnvironment typeSetEnvironment) {
51 super(typeSetEnvironment);
52 while (types.hasNext()) {
53 fMembers.add(types.next());
59 * Constructs an empty EnumeratedTypeSet.
61 * @param typeSetEnvironment the environment
63 public EnumeratedTypeSet(TypeSetEnvironment typeSetEnvironment) {
64 super(typeSetEnvironment);
69 * Constructs a new EnumeratedTypeSet with the given single TType in it.
72 * @param typeSetEnvironment the environment
74 public EnumeratedTypeSet(TType t, TypeSetEnvironment typeSetEnvironment) {
75 super(typeSetEnvironment);
76 t.generated_3769340610219257430(this);
80 * @return <code>true</code> iff this set represents the universe of TTypes
83 public boolean isUniverse() {
88 public boolean equals(Object o) {
89 if (this == o) return true;
90 if (o instanceof EnumeratedTypeSet) {
91 EnumeratedTypeSet other= (EnumeratedTypeSet) o;
93 return fMembers.equals(other.fMembers);
94 } else if (o instanceof SingletonTypeSet) {
95 SingletonTypeSet other= (SingletonTypeSet) o;
97 return (fMembers.size() == 1) && fMembers.contains(other.anyMember());
98 } else if (o instanceof TypeSet) {
99 TypeSet other= (TypeSet) o;
101 return other.generated_2869635024761535811(this);
107 public int hashCode() {
108 return 37 + fMembers.hashCode();
112 * Computes and returns a <em>new</em> EnumeratedTypeSet representing the intersection of the
113 * receiver with s2. Does not modify the receiver.
114 * @param s2 the other type set
117 protected TypeSet specialCasesIntersectedWith(TypeSet s2) {
118 if (s2 instanceof EnumeratedTypeSet) {
119 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment());
121 result.generated_3226133724554068663(s2, this);
122 if (result.size() > 0)
125 return getTypeSetEnvironment().getEmptyTypeSet();
131 * Modifies this EnumeratedTypeSet to represent the intersection of the receiver with s2.
132 * @param s2 the other type set
134 public void intersectWith(TypeSet s2) {
135 s2.generated_8067823756310198788(this);
139 * @return a new TypeSet representing the set of all sub-types of the
140 * types in the receiver
143 public TypeSet subTypes() {
145 return makeClone(); // subtypes(universe) = universe
147 if (fMembers.contains(getJavaLangObject()))
148 return getTypeSetEnvironment().getUniverseTypeSet();
150 return getTypeSetEnvironment().createSubTypesSet(this);
153 public static EnumeratedTypeSet makeArrayTypesForElements(Iterator<TType> elemTypes, TypeSetEnvironment typeSetEnvironment) {
154 EnumeratedTypeSet result= new EnumeratedTypeSet(typeSetEnvironment);
156 while (elemTypes.hasNext()) {
157 TType t= elemTypes.next();
158 result.add(TTypes.createArrayType(t, 1));
160 // result.initComplete();
165 * @return a new TypeSet representing the set of all super-types of the
166 * types in the receiver
169 public TypeSet superTypes() {
171 return makeClone(); // The supertypes of the universe is the universe
173 return getTypeSetEnvironment().createSuperTypesSet(this);
177 public TypeSet makeClone() {
178 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment());
180 result.fMembers.addAll(fMembers);
181 return generated_5827134700953768926(result);
184 public TypeSet generated_5827134700953768926(EnumeratedTypeSet result) {
185 result.initComplete();
190 * @see java.util.Set#size()
193 return fMembers.size();
197 * @see java.util.Set#clear()
199 public void clear() {
201 fMembers= new LinkedHashSet<TType>();
207 * @see java.util.Set#isEmpty()
210 public boolean isEmpty() {
211 return fMembers.isEmpty();
215 * @see java.util.Set#toArray()
217 public TType[] toArray() {
218 return fMembers.toArray(new TType[fMembers.size()]);
222 * @see java.util.Set#add(java.lang.Object)
224 public boolean add(TType t) {
225 // Doesn't make sense to do here what other methods do (copy-and-modify)
226 Assert.isTrue(!isUniverse(), "Someone's trying to expand the universe!"); //$NON-NLS-1$
227 return fMembers.add(t);
231 * @see java.util.Set#contains(java.lang.Object)
234 public boolean contains(TType t) {
237 return fMembers.contains(t);
241 * @see java.util.Set#remove(java.lang.Object)
243 public boolean remove(TType t) {
245 fMembers= cloneSet(fMembers);
246 return fMembers.remove(t);
249 private Set<TType> cloneSet(Set<TType> members) {
250 Set<TType> result= new LinkedHashSet<TType>();
251 result.addAll(members);
256 * @see java.util.Set#addAll(java.util.Collection)
258 public boolean addAll(TypeSet s) {
259 return s.generated_6796883765105910290(this);
263 public TypeSet addedTo(TypeSet that) {
264 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment());
266 return result.generated_6517476918444688818(that, this);
270 * @see java.util.Set#containsAll(java.util.Collection)
273 public boolean containsAll(TypeSet s) {
276 return s.generated_1664523987958239483(this);
280 * @see java.util.Set#removeAll(java.util.Collection)
282 public boolean removeAll(EnumeratedTypeSet s) {
283 return s.generated_7123627706191311488(this);
287 * @see java.util.Set#retainAll(java.util.Collection)
289 public boolean retainAll(TypeSet s) {
290 if (s.isUniverse()) return false;
292 EnumeratedTypeSet ets= (EnumeratedTypeSet) s;
294 return ets.generated_1055409160243982945(this);
298 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#isSingleton()
301 public boolean isSingleton() {
302 return fMembers.size() == 1;
306 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#anyMember()
309 public TType anyMember() {
310 return fMembers.iterator().next();
314 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#upperBound()
317 public TypeSet upperBound() {
318 if (fMembers.size() == 1)
319 return new SingletonTypeSet(fMembers.iterator().next(), getTypeSetEnvironment());
320 if (fMembers.contains(getJavaLangObject()))
321 return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment());
323 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment());
325 // Add to result each element of fMembers that has no proper supertype in fMembers
326 result.fMembers.addAll(fMembers);
327 for(Iterator<TType> iter= fMembers.iterator(); iter.hasNext(); ) {
328 TType t= iter.next();
330 if (t.isArrayType()) {
331 ArrayType at= (ArrayType) t;
332 int numDims= at.getDimensions();
333 for(Iterator<TType> subIter=TTypes.getAllSubTypesIterator(at.getElementType()); subIter.hasNext(); ) {
334 result.fMembers.remove(TTypes.createArrayType(subIter.next(), numDims));
337 for (Iterator<TType> iterator= TTypes.getAllSubTypesIterator(t); iterator.hasNext();) {
338 result.fMembers.remove(iterator.next());
342 return generated_2336618344135692914(result);
345 public TypeSet generated_2336618344135692914(EnumeratedTypeSet result) {
346 result.initComplete();
351 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#lowerBound()
354 public TypeSet lowerBound() {
355 if (fMembers.size() == 1)
356 return new SingletonTypeSet(fMembers.iterator().next(), getTypeSetEnvironment());
358 EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment());
360 // Add to result each element of fMembers that has no proper subtype in fMembers
361 result.fMembers.addAll(fMembers);
363 for(Iterator<TType> iter= fMembers.iterator(); iter.hasNext(); ) {
364 TType t= iter.next();
366 // java.lang.Object is only in the lower bound if fMembers consists
367 // of only java.lang.Object, but that case is handled above.
368 if (t.equals(getJavaLangObject())) {
369 result.fMembers.remove(t);
373 if (t instanceof ArrayType) {
374 ArrayType at= (ArrayType) t;
375 int numDims= at.getDimensions();
376 for(Iterator<TType> superIter=TTypes.getAllSuperTypesIterator(at.getElementType()); superIter.hasNext(); ) {
377 result.fMembers.remove(TTypes.createArrayType(superIter.next(), numDims));
380 for (Iterator<TType> iterator= TTypes.getAllSuperTypesIterator(t); iterator.hasNext();) {
381 result.generated_6359776099616909620(this, iterator);
385 if (result.size() > 0)
388 return getTypeSetEnvironment().getEmptyTypeSet();
392 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueLowerBound()
395 public boolean hasUniqueLowerBound() {
396 return fMembers.size() == 1;
400 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueUpperBound()
403 public boolean hasUniqueUpperBound() {
404 return fMembers.size() == 1;
408 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueLowerBound()
411 public TType uniqueLowerBound() {
412 if (fMembers.size() == 1)
413 return fMembers.iterator().next();
418 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueUpperBound()
421 public TType uniqueUpperBound() {
422 if (fMembers.size() == 1)
423 return fMembers.iterator().next();
428 * @see java.util.Set#iterator()
431 public Iterator<TType> iterator() {
432 return fMembers.iterator();
436 * Limits the display of set elements to the first sMaxElements.
438 private static final int sMaxElements= 10; // Integer.MAX_VALUE;
442 * @see java.lang.Object#toString()
445 public String toString() {
446 StringBuffer b= new StringBuffer();
447 b.append("{" + fID+ ":"); //$NON-NLS-1$ //$NON-NLS-2$
449 b.append(" <universe>"); //$NON-NLS-1$
452 Iterator<TType> iter;
453 for(iter= iterator(); iter.hasNext() && count < sMaxElements; count++) {
454 TType type= iter.next();
456 .append(type.getPrettySignature());
461 b.append(" ..."); //$NON-NLS-1$
463 b.append(" }"); //$NON-NLS-1$
468 * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#enumerate()
471 public EnumeratedTypeSet enumerate() {
472 return this; // (EnumeratedTypeSet) makeClone();
475 public void initComplete() {
476 Assert.isTrue(! fMembers.isEmpty());
479 public TypeSet generated_5630666201266944978(TypeSet that) {
484 public EnumeratedTypeSet generated_6250131234113279204(TypeSetUnion typesetunion) {
485 addAll(typesetunion.fRHS.enumerate());
489 public void generated_3226133724554068663(TypeSet s2, EnumeratedTypeSet enumeratedtypeset) {
490 addAll(enumeratedtypeset); // copy first since retainAll() modifies in-place
494 public TypeSet generated_6517476918444688818(TypeSet that, EnumeratedTypeSet enumeratedtypeset) {
495 addAll(enumeratedtypeset);
501 public boolean generated_7123627706191311488(EnumeratedTypeSet enumeratedtypeset) {
502 if (enumeratedtypeset.isUniverse())
503 enumeratedtypeset.fMembers= enumeratedtypeset.cloneSet(enumeratedtypeset.fMembers);
504 return enumeratedtypeset.fMembers.removeAll(fMembers);
507 public boolean generated_1055409160243982945(EnumeratedTypeSet enumeratedtypeset) {
508 if (enumeratedtypeset.isUniverse()) {
509 enumeratedtypeset.fMembers= enumeratedtypeset.cloneSet(fMembers);
512 return enumeratedtypeset.fMembers.retainAll(fMembers);
515 public void generated_6359776099616909620(EnumeratedTypeSet enumeratedtypeset, Iterator<TType> iterator) {
516 fMembers.remove(iterator.next());
519 public void generated_1642096082428232797(ArrayTypeSet arraytypeset) {
520 for(Iterator<TType> iter= arraytypeset.fElemTypeSet.iterator(); iter.hasNext(); ) {
521 TType t= iter.next();
522 add(TTypes.createArrayType(t, 1));
527 public EnumeratedTypeSet generated_7528185341646899938() {
532 public void generated_6258089802901260053(SuperTypesOfSingleton supertypesofsingleton) {
533 add(supertypesofsingleton.fLowerBound);
537 public void generated_8080557805498483091(SubTypesSet subtypesset) {
538 for(Iterator<TType> iter= subtypesset.fUpperBounds.iterator(); iter.hasNext(); ) {
539 TType ub= iter.next();
541 if (ub instanceof ArrayType) {
542 ArrayType at= (ArrayType) ub;
543 int numDims= at.getDimensions();
544 for(Iterator<TType> elemSubIter=TTypes.getAllSubTypesIterator(at.getElementType()); elemSubIter.hasNext(); )
545 add(TTypes.createArrayType(elemSubIter.next(), numDims));
547 for (Iterator<TType> iterator= TTypes.getAllSubTypesIterator(ub); iterator.hasNext();) {
548 fMembers.add(iterator.next());
555 public boolean generated_747711718974346131(SuperTypesSet supertypesset, boolean anyLBIsIntfOrArray) {
556 for(Iterator<TType> iter= supertypesset.fLowerBounds.iterator(); iter.hasNext(); ) {
557 TType lb= iter.next();
559 if (lb instanceof ArrayType) {
560 ArrayType at= (ArrayType) lb;
561 int numDims= at.getDimensions();
562 for(Iterator<TType> elemSuperIter=TTypes.getAllSuperTypesIterator(at.getElementType()); elemSuperIter.hasNext(); )
563 add(TTypes.createArrayType(elemSuperIter.next(), numDims));
564 anyLBIsIntfOrArray= true;
566 for (Iterator<TType> iterator= TTypes.getAllSuperTypesIterator(lb); iterator.hasNext(); )
567 fMembers.add(iterator.next());
571 return anyLBIsIntfOrArray;
574 public void generated_2584938505133572049(SubTypesOfSingleton subtypesofsingleton) {
575 add(subtypesofsingleton.fUpperBound);