001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Robert M. Fuhrer (rfuhrer@watson.ibm.com), IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets;
011:
012: import java.util.Iterator;
013:
014: import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType;
015: import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;
016: import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes;
017:
018: /**
019: * Represents the super-types of a set of array types. Special because this set
020: * always includes Object.
021: */
022: public class ArraySuperTypeSet extends ArrayTypeSet {
023: public ArraySuperTypeSet(TypeSet s) {
024: super (s.getTypeSetEnvironment());
025: if (s instanceof SuperTypesOfSingleton
026: || s instanceof SuperTypesSet)
027: fElemTypeSet = s.lowerBound(); // optimization: array-super(super(s)) == array-super(s)
028: else
029: fElemTypeSet = s;
030: }
031:
032: /* (non-Javadoc)
033: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#anyMember()
034: */
035: public TType anyMember() {
036: return getJavaLangObject();
037: }
038:
039: /* (non-Javadoc)
040: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#contains(TType)
041: */
042: public boolean contains(TType t) {
043: if (t.equals(getJavaLangObject()))
044: return true;
045: if (!(t instanceof ArrayType))
046: return false;
047:
048: ArrayType at = (ArrayType) t;
049: TType atElemType = at.getComponentType();
050:
051: if (fElemTypeSet.contains(atElemType)) // try to avoid enumeration
052: return true;
053:
054: for (Iterator iter = fElemTypeSet.iterator(); iter.hasNext();) {
055: TType elemType = (TType) iter.next();
056:
057: if (TTypes.canAssignTo(elemType, atElemType))
058: return true;
059: }
060: return false;
061: }
062:
063: /* (non-Javadoc)
064: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#containsAll(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet)
065: */
066: public boolean containsAll(TypeSet s) {
067: if (s instanceof ArraySuperTypeSet) {
068: ArraySuperTypeSet ats = (ArraySuperTypeSet) s;
069:
070: return fElemTypeSet.containsAll(ats.fElemTypeSet);
071: } else if (s instanceof ArrayTypeSet) {
072: ArrayTypeSet ats = (ArrayTypeSet) s;
073:
074: return fElemTypeSet.containsAll(ats.fElemTypeSet);
075: } else
076: return enumerate().containsAll(s);
077: }
078:
079: /* (non-Javadoc)
080: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#specialCasesIntersectedWith(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet)
081: */
082: protected TypeSet specialCasesIntersectedWith(TypeSet s2) {
083: if (s2 instanceof ArraySuperTypeSet) {
084: ArraySuperTypeSet ats2 = (ArraySuperTypeSet) s2;
085:
086: if (ats2.fElemTypeSet.isUniverse())
087: return new ArraySuperTypeSet(fElemTypeSet);
088: } else if (s2 instanceof ArrayTypeSet) {
089: ArrayTypeSet ats2 = (ArrayTypeSet) s2;
090:
091: if (ats2.fElemTypeSet.isUniverse())
092: return new ArrayTypeSet(fElemTypeSet); // intersection doesn't include Object, which is in 'this'
093: }
094: return super .specialCasesIntersectedWith(s2);
095: }
096:
097: private EnumeratedTypeSet fEnumCache = null;
098:
099: /* (non-Javadoc)
100: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#enumerate()
101: */
102: public EnumeratedTypeSet enumerate() {
103: if (fEnumCache == null) {
104: fEnumCache = new EnumeratedTypeSet(getTypeSetEnvironment());
105: TypeSet elemSupers = fElemTypeSet.super Types();
106:
107: for (Iterator iter = elemSupers.iterator(); iter.hasNext();) {
108: TType elemSuper = (TType) iter.next();
109:
110: fEnumCache.add(TTypes.createArrayType(elemSuper, 1));
111: }
112:
113: fEnumCache.add(getJavaLangObject());
114: fEnumCache.initComplete();
115: }
116: return fEnumCache;
117: }
118:
119: /* (non-Javadoc)
120: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#hasUniqueUpperBound()
121: */
122: public boolean hasUniqueUpperBound() {
123: return true; // Object is the unique upper bound of any set of array types
124: }
125:
126: /* (non-Javadoc)
127: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isSingleton()
128: */
129: public boolean isSingleton() {
130: return false;
131: }
132:
133: /* (non-Javadoc)
134: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isUniverse()
135: */
136: public boolean isUniverse() {
137: return false;
138: }
139:
140: /* (non-Javadoc)
141: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#iterator()
142: */
143: public Iterator iterator() {
144: return enumerate().iterator();
145: }
146:
147: /* (non-Javadoc)
148: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#makeClone()
149: */
150: public TypeSet makeClone() {
151: return new ArraySuperTypeSet(fElemTypeSet);
152: }
153:
154: /* (non-Javadoc)
155: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#superTypes()
156: */
157: public TypeSet super Types() {
158: return makeClone();
159: }
160:
161: /* (non-Javadoc)
162: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#uniqueUpperBound()
163: */
164: public TType uniqueUpperBound() {
165: return getJavaLangObject();
166: }
167:
168: /* (non-Javadoc)
169: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#upperBound()
170: */
171: public TypeSet upperBound() {
172: return new SingletonTypeSet(getJavaLangObject(),
173: getTypeSetEnvironment());
174: }
175:
176: /* (non-Javadoc)
177: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#equals(java.lang.Object)
178: */
179: public boolean equals(Object obj) {
180: if (obj == this )
181: return true;
182: if (obj instanceof ArraySuperTypeSet) {
183: ArraySuperTypeSet other = (ArraySuperTypeSet) obj;
184:
185: return fElemTypeSet.equals(other.fElemTypeSet);
186: }
187: return false;
188: }
189:
190: /* (non-Javadoc)
191: * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#subTypes()
192: */
193: public TypeSet subTypes() {
194: return getTypeSetEnvironment().getUniverseTypeSet();
195: }
196:
197: public String toString() {
198: return "{" + fID + ": array-super(" + fElemTypeSet + ")}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
199: }
200: }
|