blob: 53fecf7678c79b82ffd80dbe2c1592ba61623ee6 [file] [log] [blame]
/*******************************************************************************
* 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$
}
}