KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > typeconstraints > types > ArrayType


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 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  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types;
12
13 import org.eclipse.core.runtime.Assert;
14
15 import org.eclipse.jdt.core.dom.ITypeBinding;
16
17
18 public final class ArrayType extends TType {
19     private TType fElementType;
20     private int fDimensions;
21     
22     private TType fErasure;
23
24     protected ArrayType(TypeEnvironment environment) {
25         super(environment);
26     }
27
28     protected ArrayType(TypeEnvironment environment, String JavaDoc key) {
29         super(environment, key);
30     }
31
32     protected void initialize(ITypeBinding binding, TType elementType) {
33         Assert.isTrue(binding.isArray());
34         super.initialize(binding);
35         fElementType= elementType;
36         fDimensions= binding.getDimensions();
37         if (fElementType.isStandardType() || fElementType.isGenericType() || fElementType.isPrimitiveType()) {
38             fErasure= this;
39         } else {
40             fErasure= getEnvironment().create(binding.getErasure());
41         }
42     }
43
44     protected void initialize(TType elementType, int dimensions) {
45         fElementType= elementType;
46         fDimensions= dimensions;
47         if (fElementType.isStandardType() || fElementType.isGenericType() || fElementType.isPrimitiveType()) {
48             fErasure= this;
49         } else {
50             fErasure= getEnvironment().createArrayType(elementType.getErasure(), dimensions);
51         }
52     }
53
54     public TType getElementType() {
55         return fElementType;
56     }
57     
58     /**
59      * Returns the component type of this array.
60      * If getDimensions() is 1, the component type is the element type.
61      * If getDimensions() is > 1, the component type is an array type
62      * with element type getElementType() and dimensions getDimensions() - 1.
63      *
64      * @return the component type
65      */

66     public TType getComponentType() {
67         if (fDimensions > 1)
68             return getEnvironment().createArrayType(fElementType, fDimensions - 1);
69         else
70             return fElementType;
71     }
72     
73     public int getDimensions() {
74         return fDimensions;
75     }
76     
77     public int getKind() {
78         return ARRAY_TYPE;
79     }
80     
81     public TType[] getSubTypes() {
82         TType[] subTypes= fElementType.getSubTypes();
83         TType[] result= new TType[subTypes.length];
84         for (int i= 0; i < subTypes.length; i++) {
85             result[i]= getEnvironment().createArrayType(subTypes[i], fDimensions);
86         }
87         return result;
88     }
89     
90     public TType getErasure() {
91         return fErasure;
92     }
93     
94     public boolean doEquals(TType other) {
95         ArrayType arrayType= (ArrayType)other;
96         return fElementType.equals(arrayType.fElementType) && fDimensions == arrayType.fDimensions;
97     }
98     
99     public int hashCode() {
100         return fElementType.hashCode() << ARRAY_TYPE_SHIFT;
101     }
102     
103     protected boolean doCanAssignTo(TType lhs) {
104         switch (lhs.getKind()) {
105             case NULL_TYPE: return false;
106             case VOID_TYPE: return false;
107             case PRIMITIVE_TYPE: return false;
108             
109             case ARRAY_TYPE: return canAssignToArrayType((ArrayType)lhs);
110             
111             case GENERIC_TYPE: return false;
112             case STANDARD_TYPE: return isArrayLhsCompatible(lhs);
113             case PARAMETERIZED_TYPE: return false;
114             case RAW_TYPE: return false;
115             
116             case UNBOUND_WILDCARD_TYPE:
117             case EXTENDS_WILDCARD_TYPE:
118             case SUPER_WILDCARD_TYPE:
119                 return ((WildcardType)lhs).checkAssignmentBound(this);
120                 
121             case TYPE_VARIABLE: return false;
122             case CAPTURE_TYPE:
123                 return ((CaptureType)lhs).checkLowerBound(lhs);
124         }
125         return false;
126     }
127
128     private boolean canAssignToArrayType(ArrayType lhs) {
129         if (fDimensions == lhs.fDimensions) {
130             // primitive type don't have any conversion for arrays.
131
if (fElementType.getKind() == PRIMITIVE_TYPE || lhs.fElementType.getKind() == PRIMITIVE_TYPE)
132                 return fElementType.isTypeEquivalentTo(lhs.fElementType);
133             return fElementType.canAssignTo(lhs.fElementType);
134         }
135         if (fDimensions < lhs.fDimensions)
136             return false;
137         return isArrayLhsCompatible(lhs.fElementType);
138     }
139
140     private boolean isArrayLhsCompatible(TType lhsElementType) {
141         return lhsElementType.isJavaLangObject() || lhsElementType.isJavaLangCloneable() || lhsElementType.isJavaIoSerializable();
142     }
143     
144     protected String JavaDoc getPlainPrettySignature() {
145         StringBuffer JavaDoc result= new StringBuffer JavaDoc(fElementType.getPlainPrettySignature());
146         for (int i= 0; i < fDimensions; i++) {
147             result.append("[]"); //$NON-NLS-1$
148
}
149         return result.toString();
150     }
151     
152     public String JavaDoc getName() {
153         StringBuffer JavaDoc result= new StringBuffer JavaDoc(fElementType.getName());
154         for (int i= 0; i < fDimensions; i++) {
155             result.append("[]"); //$NON-NLS-1$
156
}
157         return result.toString();
158     }
159
160 }
161
Popular Tags