/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Robert M. Fuhrer (rfuhrer@watson.ibm.com), IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType; import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes; /** * A type-safe wrapper for {@code Set} that also adds {@code TType}-specific * functionality, e.g. subTypes() and superTypes(). */ public class EnumeratedTypeSet extends TypeSet { public static int sCount= 0; static public int getCount() { return sCount; } static public void resetCount() { sCount= 0; } /** * Set containing the TTypes in this EnumeratedTypeSet. */ public Set fMembers= new LinkedHashSet(); /** * Constructs a new EnumeratedTypeSet with the members of Set s in it. * All elements of s must be TTypes. * * @param types the types * @param typeSetEnvironment the environment */ public EnumeratedTypeSet(Iterator types, TypeSetEnvironment typeSetEnvironment) { super(typeSetEnvironment); while (types.hasNext()) { fMembers.add(types.next()); } sCount++; } /** * Constructs an empty EnumeratedTypeSet. * * @param typeSetEnvironment the environment */ public EnumeratedTypeSet(TypeSetEnvironment typeSetEnvironment) { super(typeSetEnvironment); sCount++; } /** * Constructs a new EnumeratedTypeSet with the given single TType in it. * * @param t the type * @param typeSetEnvironment the environment */ public EnumeratedTypeSet(TType t, TypeSetEnvironment typeSetEnvironment) { super(typeSetEnvironment); t.generated_3769340610219257430(this); } /** * @return true iff this set represents the universe of TTypes */ @Override public boolean isUniverse() { return false; } @Override public boolean equals(Object o) { if (this == o) return true; if (o instanceof EnumeratedTypeSet) { EnumeratedTypeSet other= (EnumeratedTypeSet) o; return fMembers.equals(other.fMembers); } else if (o instanceof SingletonTypeSet) { SingletonTypeSet other= (SingletonTypeSet) o; return (fMembers.size() == 1) && fMembers.contains(other.anyMember()); } else if (o instanceof TypeSet) { TypeSet other= (TypeSet) o; return other.generated_2869635024761535811(this); } else return false; } @Override public int hashCode() { return 37 + fMembers.hashCode(); } /** * Computes and returns a new EnumeratedTypeSet representing the intersection of the * receiver with s2. Does not modify the receiver. * @param s2 the other type set */ @Override protected TypeSet specialCasesIntersectedWith(TypeSet s2) { if (s2 instanceof EnumeratedTypeSet) { EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); result.generated_3226133724554068663(s2, this); if (result.size() > 0) return result; else return getTypeSetEnvironment().getEmptyTypeSet(); } return null; } /** * Modifies this EnumeratedTypeSet to represent the intersection of the receiver with s2. * @param s2 the other type set */ public void intersectWith(TypeSet s2) { s2.generated_8067823756310198788(this); } /** * @return a new TypeSet representing the set of all sub-types of the * types in the receiver */ @Override public TypeSet subTypes() { if (isUniverse()) return makeClone(); // subtypes(universe) = universe if (fMembers.contains(getJavaLangObject())) return getTypeSetEnvironment().getUniverseTypeSet(); return getTypeSetEnvironment().createSubTypesSet(this); } public static EnumeratedTypeSet makeArrayTypesForElements(Iterator elemTypes, TypeSetEnvironment typeSetEnvironment) { EnumeratedTypeSet result= new EnumeratedTypeSet(typeSetEnvironment); while (elemTypes.hasNext()) { TType t= elemTypes.next(); result.add(TTypes.createArrayType(t, 1)); } // result.initComplete(); return result; } /** * @return a new TypeSet representing the set of all super-types of the * types in the receiver */ @Override public TypeSet superTypes() { if (isUniverse()) return makeClone(); // The supertypes of the universe is the universe return getTypeSetEnvironment().createSuperTypesSet(this); } @Override public TypeSet makeClone() { EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); result.fMembers.addAll(fMembers); return generated_5827134700953768926(result); } public TypeSet generated_5827134700953768926(EnumeratedTypeSet result) { result.initComplete(); return result; } /* (non-Javadoc) * @see java.util.Set#size() */ public int size() { return fMembers.size(); } /* (non-Javadoc) * @see java.util.Set#clear() */ public void clear() { if (isUniverse()) fMembers= new LinkedHashSet(); else fMembers.clear(); } /* (non-Javadoc) * @see java.util.Set#isEmpty() */ @Override public boolean isEmpty() { return fMembers.isEmpty(); } /* (non-Javadoc) * @see java.util.Set#toArray() */ public TType[] toArray() { return fMembers.toArray(new TType[fMembers.size()]); } /* (non-Javadoc) * @see java.util.Set#add(java.lang.Object) */ public boolean add(TType t) { // Doesn't make sense to do here what other methods do (copy-and-modify) Assert.isTrue(!isUniverse(), "Someone's trying to expand the universe!"); //$NON-NLS-1$ return fMembers.add(t); } /* (non-Javadoc) * @see java.util.Set#contains(java.lang.Object) */ @Override public boolean contains(TType t) { if (isUniverse()) return true; return fMembers.contains(t); } /* (non-Javadoc) * @see java.util.Set#remove(java.lang.Object) */ public boolean remove(TType t) { if (isUniverse()) fMembers= cloneSet(fMembers); return fMembers.remove(t); } private Set cloneSet(Set members) { Set result= new LinkedHashSet(); result.addAll(members); return result; } /* (non-Javadoc) * @see java.util.Set#addAll(java.util.Collection) */ public boolean addAll(TypeSet s) { return s.generated_6796883765105910290(this); } @Override public TypeSet addedTo(TypeSet that) { EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); return result.generated_6517476918444688818(that, this); } /* (non-Javadoc) * @see java.util.Set#containsAll(java.util.Collection) */ @Override public boolean containsAll(TypeSet s) { if (isUniverse()) return true; return s.generated_1664523987958239483(this); } /* (non-Javadoc) * @see java.util.Set#removeAll(java.util.Collection) */ public boolean removeAll(EnumeratedTypeSet s) { return s.generated_7123627706191311488(this); } /* (non-Javadoc) * @see java.util.Set#retainAll(java.util.Collection) */ public boolean retainAll(TypeSet s) { if (s.isUniverse()) return false; EnumeratedTypeSet ets= (EnumeratedTypeSet) s; return ets.generated_1055409160243982945(this); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#isSingleton() */ @Override public boolean isSingleton() { return fMembers.size() == 1; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#anyMember() */ @Override public TType anyMember() { return fMembers.iterator().next(); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#upperBound() */ @Override public TypeSet upperBound() { if (fMembers.size() == 1) return new SingletonTypeSet(fMembers.iterator().next(), getTypeSetEnvironment()); if (fMembers.contains(getJavaLangObject())) return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment()); EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); // Add to result each element of fMembers that has no proper supertype in fMembers result.fMembers.addAll(fMembers); for(Iterator iter= fMembers.iterator(); iter.hasNext(); ) { TType t= iter.next(); if (t.isArrayType()) { ArrayType at= (ArrayType) t; int numDims= at.getDimensions(); for(Iterator subIter=TTypes.getAllSubTypesIterator(at.getElementType()); subIter.hasNext(); ) { result.fMembers.remove(TTypes.createArrayType(subIter.next(), numDims)); } } else { for (Iterator iterator= TTypes.getAllSubTypesIterator(t); iterator.hasNext();) { result.fMembers.remove(iterator.next()); } } } return generated_2336618344135692914(result); } public TypeSet generated_2336618344135692914(EnumeratedTypeSet result) { result.initComplete(); return result; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#lowerBound() */ @Override public TypeSet lowerBound() { if (fMembers.size() == 1) return new SingletonTypeSet(fMembers.iterator().next(), getTypeSetEnvironment()); EnumeratedTypeSet result= new EnumeratedTypeSet(getTypeSetEnvironment()); // Add to result each element of fMembers that has no proper subtype in fMembers result.fMembers.addAll(fMembers); for(Iterator iter= fMembers.iterator(); iter.hasNext(); ) { TType t= iter.next(); // java.lang.Object is only in the lower bound if fMembers consists // of only java.lang.Object, but that case is handled above. if (t.equals(getJavaLangObject())) { result.fMembers.remove(t); continue; } if (t instanceof ArrayType) { ArrayType at= (ArrayType) t; int numDims= at.getDimensions(); for(Iterator superIter=TTypes.getAllSuperTypesIterator(at.getElementType()); superIter.hasNext(); ) { result.fMembers.remove(TTypes.createArrayType(superIter.next(), numDims)); } } else { for (Iterator iterator= TTypes.getAllSuperTypesIterator(t); iterator.hasNext();) { result.generated_6359776099616909620(this, iterator); } } } if (result.size() > 0) return result; else return getTypeSetEnvironment().getEmptyTypeSet(); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueLowerBound() */ @Override public boolean hasUniqueLowerBound() { return fMembers.size() == 1; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueUpperBound() */ @Override public boolean hasUniqueUpperBound() { return fMembers.size() == 1; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueLowerBound() */ @Override public TType uniqueLowerBound() { if (fMembers.size() == 1) return fMembers.iterator().next(); return null; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueUpperBound() */ @Override public TType uniqueUpperBound() { if (fMembers.size() == 1) return fMembers.iterator().next(); return null; } /* (non-Javadoc) * @see java.util.Set#iterator() */ @Override public Iterator iterator() { return fMembers.iterator(); } /** * Limits the display of set elements to the first sMaxElements. */ private static final int sMaxElements= 10; // Integer.MAX_VALUE; /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { StringBuffer b= new StringBuffer(); b.append("{" + fID+ ":"); //$NON-NLS-1$ //$NON-NLS-2$ if (isUniverse()) b.append(" "); //$NON-NLS-1$ else { int count=0; Iterator iter; for(iter= iterator(); iter.hasNext() && count < sMaxElements; count++) { TType type= iter.next(); b.append(' ') .append(type.getPrettySignature()); if (iter.hasNext()) b.append(','); } if (iter.hasNext()) b.append(" ..."); //$NON-NLS-1$ } b.append(" }"); //$NON-NLS-1$ return b.toString(); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#enumerate() */ @Override public EnumeratedTypeSet enumerate() { return this; // (EnumeratedTypeSet) makeClone(); } public void initComplete() { Assert.isTrue(! fMembers.isEmpty()); } public TypeSet generated_5630666201266944978(TypeSet that) { addAll(that); return this; } public EnumeratedTypeSet generated_6250131234113279204(TypeSetUnion typesetunion) { addAll(typesetunion.fRHS.enumerate()); return this; } public void generated_3226133724554068663(TypeSet s2, EnumeratedTypeSet enumeratedtypeset) { addAll(enumeratedtypeset); // copy first since retainAll() modifies in-place retainAll(s2); } public TypeSet generated_6517476918444688818(TypeSet that, EnumeratedTypeSet enumeratedtypeset) { addAll(enumeratedtypeset); addAll(that); initComplete(); return this; } public boolean generated_7123627706191311488(EnumeratedTypeSet enumeratedtypeset) { if (enumeratedtypeset.isUniverse()) enumeratedtypeset.fMembers= enumeratedtypeset.cloneSet(enumeratedtypeset.fMembers); return enumeratedtypeset.fMembers.removeAll(fMembers); } public boolean generated_1055409160243982945(EnumeratedTypeSet enumeratedtypeset) { if (enumeratedtypeset.isUniverse()) { enumeratedtypeset.fMembers= enumeratedtypeset.cloneSet(fMembers); return true; } else return enumeratedtypeset.fMembers.retainAll(fMembers); } public void generated_6359776099616909620(EnumeratedTypeSet enumeratedtypeset, Iterator iterator) { fMembers.remove(iterator.next()); } public void generated_1642096082428232797(ArrayTypeSet arraytypeset) { for(Iterator iter= arraytypeset.fElemTypeSet.iterator(); iter.hasNext(); ) { TType t= iter.next(); add(TTypes.createArrayType(t, 1)); } initComplete(); } public EnumeratedTypeSet generated_7528185341646899938() { initComplete(); return this; } public void generated_6258089802901260053(SuperTypesOfSingleton supertypesofsingleton) { add(supertypesofsingleton.fLowerBound); initComplete(); } public void generated_8080557805498483091(SubTypesSet subtypesset) { for(Iterator iter= subtypesset.fUpperBounds.iterator(); iter.hasNext(); ) { TType ub= iter.next(); if (ub instanceof ArrayType) { ArrayType at= (ArrayType) ub; int numDims= at.getDimensions(); for(Iterator elemSubIter=TTypes.getAllSubTypesIterator(at.getElementType()); elemSubIter.hasNext(); ) add(TTypes.createArrayType(elemSubIter.next(), numDims)); } else { for (Iterator iterator= TTypes.getAllSubTypesIterator(ub); iterator.hasNext();) { fMembers.add(iterator.next()); } } add(ub); } } public boolean generated_747711718974346131(SuperTypesSet supertypesset, boolean anyLBIsIntfOrArray) { for(Iterator iter= supertypesset.fLowerBounds.iterator(); iter.hasNext(); ) { TType lb= iter.next(); if (lb instanceof ArrayType) { ArrayType at= (ArrayType) lb; int numDims= at.getDimensions(); for(Iterator elemSuperIter=TTypes.getAllSuperTypesIterator(at.getElementType()); elemSuperIter.hasNext(); ) add(TTypes.createArrayType(elemSuperIter.next(), numDims)); anyLBIsIntfOrArray= true; } else { for (Iterator iterator= TTypes.getAllSuperTypesIterator(lb); iterator.hasNext(); ) fMembers.add(iterator.next()); } add(lb); } return anyLBIsIntfOrArray; } public void generated_2584938505133572049(SubTypesOfSingleton subtypesofsingleton) { add(subtypesofsingleton.fUpperBound); initComplete(); } }