| /******************************************************************************* |
| * Copyright (c) 2000, 2005 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 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; |
| |
| /** |
| * Represents the super-types of a set of array types. Special because this set |
| * always includes Object. |
| */ |
| public class ArraySuperTypeSet extends ArrayTypeSet { |
| public ArraySuperTypeSet(TypeSet s) { |
| super(s.getTypeSetEnvironment()); |
| if (s instanceof SuperTypesOfSingleton || s instanceof SuperTypesSet) |
| fElemTypeSet= s.lowerBound(); // optimization: array-super(super(s)) == array-super(s) |
| else |
| fElemTypeSet= s; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#anyMember() |
| */ |
| public TType anyMember() { |
| return getJavaLangObject(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#contains(TType) |
| */ |
| public boolean contains(TType t) { |
| if (t.equals(getJavaLangObject())) return true; |
| if (!(t instanceof ArrayType)) |
| return false; |
| |
| ArrayType at= (ArrayType) t; |
| TType atElemType= at.getComponentType(); |
| |
| if (fElemTypeSet.contains(atElemType)) // try to avoid enumeration |
| return true; |
| |
| for(Iterator iter= fElemTypeSet.iterator(); iter.hasNext(); ) { |
| TType elemType= (TType) iter.next(); |
| |
| if (TTypes.canAssignTo(elemType, atElemType)) |
| return true; |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#containsAll(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet) |
| */ |
| public boolean containsAll(TypeSet s) { |
| if (s instanceof ArraySuperTypeSet) { |
| ArraySuperTypeSet ats= (ArraySuperTypeSet) s; |
| |
| return fElemTypeSet.containsAll(ats.fElemTypeSet); |
| } else if (s instanceof ArrayTypeSet) { |
| ArrayTypeSet ats= (ArrayTypeSet) s; |
| |
| return fElemTypeSet.containsAll(ats.fElemTypeSet); |
| } else |
| return enumerate().containsAll(s); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#specialCasesIntersectedWith(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet) |
| */ |
| protected TypeSet specialCasesIntersectedWith(TypeSet s2) { |
| if (s2 instanceof ArraySuperTypeSet) { |
| ArraySuperTypeSet ats2= (ArraySuperTypeSet) s2; |
| |
| if (ats2.fElemTypeSet.isUniverse()) |
| return new ArraySuperTypeSet(fElemTypeSet); |
| } else if (s2 instanceof ArrayTypeSet) { |
| ArrayTypeSet ats2= (ArrayTypeSet) s2; |
| |
| if (ats2.fElemTypeSet.isUniverse()) |
| return new ArrayTypeSet(fElemTypeSet); // intersection doesn't include Object, which is in 'this' |
| } |
| return super.specialCasesIntersectedWith(s2); |
| } |
| |
| private EnumeratedTypeSet fEnumCache= null; |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#enumerate() |
| */ |
| public EnumeratedTypeSet enumerate() { |
| if (fEnumCache == null) { |
| fEnumCache= new EnumeratedTypeSet(getTypeSetEnvironment()); |
| TypeSet elemSupers= fElemTypeSet.superTypes(); |
| |
| for(Iterator iter= elemSupers.iterator(); iter.hasNext(); ) { |
| TType elemSuper= (TType) iter.next(); |
| |
| fEnumCache.add(TTypes.createArrayType(elemSuper, 1)); |
| } |
| |
| fEnumCache.add(getJavaLangObject()); |
| fEnumCache.initComplete(); |
| } |
| return fEnumCache; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#hasUniqueUpperBound() |
| */ |
| public boolean hasUniqueUpperBound() { |
| return true; // Object is the unique upper bound of any set of array types |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isSingleton() |
| */ |
| public boolean isSingleton() { |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isUniverse() |
| */ |
| public boolean isUniverse() { |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#iterator() |
| */ |
| public Iterator iterator() { |
| return enumerate().iterator(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#makeClone() |
| */ |
| public TypeSet makeClone() { |
| return new ArraySuperTypeSet(fElemTypeSet); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#superTypes() |
| */ |
| public TypeSet superTypes() { |
| return makeClone(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#uniqueUpperBound() |
| */ |
| public TType uniqueUpperBound() { |
| return getJavaLangObject(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#upperBound() |
| */ |
| public TypeSet upperBound() { |
| return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#equals(java.lang.Object) |
| */ |
| public boolean equals(Object obj) { |
| if (obj == this) return true; |
| if (obj instanceof ArraySuperTypeSet) { |
| ArraySuperTypeSet other= (ArraySuperTypeSet) obj; |
| |
| return fElemTypeSet.equals(other.fElemTypeSet); |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#subTypes() |
| */ |
| public TypeSet subTypes() { |
| return getTypeSetEnvironment().getUniverseTypeSet(); |
| } |
| |
| public String toString() { |
| return "{" + fID + ": array-super(" + fElemTypeSet + ")}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| } |