KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > typeconstraints > typesets > ArraySuperTypeSet


1 /*******************************************************************************
2  * Copyright (c) 2000, 2005 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
7  *
8  * Contributors:
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;
12
13 import java.util.Iterator JavaDoc;
14
15 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType;
16 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;
17 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes;
18
19 /**
20  * Represents the super-types of a set of array types. Special because this set
21  * always includes Object.
22  */

23 public class ArraySuperTypeSet extends ArrayTypeSet {
24     public ArraySuperTypeSet(TypeSet s) {
25         super(s.getTypeSetEnvironment());
26         if (s instanceof SuperTypesOfSingleton || s instanceof SuperTypesSet)
27             fElemTypeSet= s.lowerBound(); // optimization: array-super(super(s)) == array-super(s)
28
else
29             fElemTypeSet= s;
30     }
31
32     /* (non-Javadoc)
33      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#anyMember()
34      */

35     public TType anyMember() {
36         return getJavaLangObject();
37     }
38
39     /* (non-Javadoc)
40      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#contains(TType)
41      */

42     public boolean contains(TType t) {
43         if (t.equals(getJavaLangObject())) return true;
44         if (!(t instanceof ArrayType))
45             return false;
46
47         ArrayType at= (ArrayType) t;
48         TType atElemType= at.getComponentType();
49
50         if (fElemTypeSet.contains(atElemType)) // try to avoid enumeration
51
return true;
52
53         for(Iterator JavaDoc iter= fElemTypeSet.iterator(); iter.hasNext(); ) {
54             TType elemType= (TType) iter.next();
55
56             if (TTypes.canAssignTo(elemType, atElemType))
57                 return true;
58         }
59         return false;
60     }
61
62     /* (non-Javadoc)
63      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#containsAll(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet)
64      */

65     public boolean containsAll(TypeSet s) {
66         if (s instanceof ArraySuperTypeSet) {
67             ArraySuperTypeSet ats= (ArraySuperTypeSet) s;
68
69             return fElemTypeSet.containsAll(ats.fElemTypeSet);
70         } else if (s instanceof ArrayTypeSet) {
71             ArrayTypeSet ats= (ArrayTypeSet) s;
72
73             return fElemTypeSet.containsAll(ats.fElemTypeSet);
74         } else
75             return enumerate().containsAll(s);
76     }
77
78     /* (non-Javadoc)
79      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#specialCasesIntersectedWith(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet)
80      */

81     protected TypeSet specialCasesIntersectedWith(TypeSet s2) {
82         if (s2 instanceof ArraySuperTypeSet) {
83             ArraySuperTypeSet ats2= (ArraySuperTypeSet) s2;
84
85             if (ats2.fElemTypeSet.isUniverse())
86                 return new ArraySuperTypeSet(fElemTypeSet);
87         } else if (s2 instanceof ArrayTypeSet) {
88             ArrayTypeSet ats2= (ArrayTypeSet) s2;
89
90             if (ats2.fElemTypeSet.isUniverse())
91                 return new ArrayTypeSet(fElemTypeSet); // intersection doesn't include Object, which is in 'this'
92
}
93         return super.specialCasesIntersectedWith(s2);
94     }
95
96     private EnumeratedTypeSet fEnumCache= null;
97
98     /* (non-Javadoc)
99      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#enumerate()
100      */

101     public EnumeratedTypeSet enumerate() {
102         if (fEnumCache == null) {
103             fEnumCache= new EnumeratedTypeSet(getTypeSetEnvironment());
104             TypeSet elemSupers= fElemTypeSet.superTypes();
105
106             for(Iterator JavaDoc iter= elemSupers.iterator(); iter.hasNext(); ) {
107                 TType elemSuper= (TType) iter.next();
108
109                 fEnumCache.add(TTypes.createArrayType(elemSuper, 1));
110             }
111
112             fEnumCache.add(getJavaLangObject());
113             fEnumCache.initComplete();
114         }
115         return fEnumCache;
116     }
117
118     /* (non-Javadoc)
119      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#hasUniqueUpperBound()
120      */

121     public boolean hasUniqueUpperBound() {
122         return true; // Object is the unique upper bound of any set of array types
123
}
124
125     /* (non-Javadoc)
126      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isSingleton()
127      */

128     public boolean isSingleton() {
129         return false;
130     }
131
132     /* (non-Javadoc)
133      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#isUniverse()
134      */

135     public boolean isUniverse() {
136         return false;
137     }
138
139     /* (non-Javadoc)
140      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#iterator()
141      */

142     public Iterator JavaDoc iterator() {
143         return enumerate().iterator();
144     }
145
146     /* (non-Javadoc)
147      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#makeClone()
148      */

149     public TypeSet makeClone() {
150         return new ArraySuperTypeSet(fElemTypeSet);
151     }
152
153     /* (non-Javadoc)
154      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#superTypes()
155      */

156     public TypeSet superTypes() {
157         return makeClone();
158     }
159
160     /* (non-Javadoc)
161      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#uniqueUpperBound()
162      */

163     public TType uniqueUpperBound() {
164         return getJavaLangObject();
165     }
166
167     /* (non-Javadoc)
168      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#upperBound()
169      */

170     public TypeSet upperBound() {
171         return new SingletonTypeSet(getJavaLangObject(), getTypeSetEnvironment());
172     }
173
174     /* (non-Javadoc)
175      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.ArrayTypeSet#equals(java.lang.Object)
176      */

177     public boolean equals(Object JavaDoc obj) {
178         if (obj == this) return true;
179         if (obj instanceof ArraySuperTypeSet) {
180             ArraySuperTypeSet other= (ArraySuperTypeSet) obj;
181
182             return fElemTypeSet.equals(other.fElemTypeSet);
183         }
184         return false;
185     }
186
187     /* (non-Javadoc)
188      * @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#subTypes()
189      */

190     public TypeSet subTypes() {
191         return getTypeSetEnvironment().getUniverseTypeSet();
192     }
193
194     public String JavaDoc toString() {
195         return "{" + fID + ": array-super(" + fElemTypeSet + ")}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
196
}
197 }
198
Popular Tags