src/share/classes/sun/rmi/rmic/iiop/ArrayType.java

changeset 1
55540e827aef
child 158
91006f157c46
equal deleted inserted replaced
-1:000000000000 1:55540e827aef
1 /*
2 * Portions Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26 /*
27 * Licensed Materials - Property of IBM
28 * RMI-IIOP v1.0
29 * Copyright IBM Corp. 1998 1999 All Rights Reserved
30 *
31 */
32
33 package sun.rmi.rmic.iiop;
34
35 import java.util.Vector;
36 import java.util.HashSet;
37 import sun.tools.java.CompilerError;
38 import sun.tools.java.Identifier;
39 import sun.tools.java.ClassDefinition;
40 import java.lang.reflect.Array;
41
42 /**
43 * ArrayType is a wrapper for any of the other types. The getElementType()
44 * method can be used to get the array element type. The getArrayDimension()
45 * method can be used to get the array dimension.
46 *
47 * @author Bryan Atsatt
48 */
49 public class ArrayType extends Type {
50
51 private Type type;
52 private int arrayDimension;
53 private String brackets;
54 private String bracketsSig;
55
56 //_____________________________________________________________________
57 // Public Interfaces
58 //_____________________________________________________________________
59
60 /**
61 * Create an ArrayType object for the given type.
62 *
63 * If the class is not a properly formed or if some other error occurs, the
64 * return value will be null, and errors will have been reported to the
65 * supplied BatchEnvironment.
66 */
67 public static ArrayType forArray( sun.tools.java.Type theType,
68 ContextStack stack) {
69
70
71 ArrayType result = null;
72 sun.tools.java.Type arrayType = theType;
73
74 if (arrayType.getTypeCode() == TC_ARRAY) {
75
76 // Find real type...
77
78 while (arrayType.getTypeCode() == TC_ARRAY) {
79 arrayType = arrayType.getElementType();
80 }
81
82 // Do we already have it?
83
84 Type existing = getType(theType,stack);
85 if (existing != null) {
86
87 if (!(existing instanceof ArrayType)) return null; // False hit.
88
89 // Yep, so return it...
90
91 return (ArrayType) existing;
92 }
93
94 // Now try to make a Type from it...
95
96 Type temp = CompoundType.makeType(arrayType,null,stack);
97
98 if (temp != null) {
99
100 // Got a valid one. Make an array type...
101
102 result = new ArrayType(stack,temp,theType.getArrayDimension());
103
104 // Add it...
105
106 putType(theType,result,stack);
107
108 // Do the stack thing in case tracing on...
109
110 stack.push(result);
111 stack.pop(true);
112 }
113 }
114
115 return result;
116 }
117
118 /**
119 * Return signature for this type (e.g. com.acme.Dynamite
120 * would return "com.acme.Dynamite", byte = "B")
121 */
122 public String getSignature() {
123 return bracketsSig + type.getSignature();
124 }
125
126 /**
127 * Get element type. Returns null if not an array.
128 */
129 public Type getElementType () {
130 return type;
131 }
132
133 /**
134 * Get array dimension. Returns zero if not an array.
135 */
136 public int getArrayDimension () {
137 return arrayDimension;
138 }
139
140 /**
141 * Get brackets string. Returns "" if not an array.
142 */
143 public String getArrayBrackets () {
144 return brackets;
145 }
146
147 /**
148 * Return a string representation of this type.
149 */
150 public String toString () {
151 return getQualifiedName() + brackets;
152 }
153
154 /**
155 * Return a string describing this type.
156 */
157 public String getTypeDescription () {
158 return "Array of " + type.getTypeDescription();
159 }
160
161
162 /**
163 * Return the name of this type. For arrays, will include "[]" if useIDLNames == false.
164 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
165 * @param useIDLNames If true, print IDL names; otherwise, print java names.
166 * @param globalIDLNames If true and useIDLNames true, prepends "::".
167 */
168 public String getTypeName ( boolean useQualifiedNames,
169 boolean useIDLNames,
170 boolean globalIDLNames) {
171 if (useIDLNames) {
172 return super.getTypeName(useQualifiedNames,useIDLNames,globalIDLNames);
173 } else {
174 return super.getTypeName(useQualifiedNames,useIDLNames,globalIDLNames) + brackets;
175 }
176 }
177
178 //_____________________________________________________________________
179 // Subclass/Internal Interfaces
180 //_____________________________________________________________________
181
182
183 /**
184 * Convert all invalid types to valid ones.
185 */
186 protected void swapInvalidTypes () {
187 if (type.getStatus() != STATUS_VALID) {
188 type = getValidType(type);
189 }
190 }
191
192 /*
193 * Add matching types to list. Return true if this type has not
194 * been previously checked, false otherwise.
195 */
196 protected boolean addTypes (int typeCodeFilter,
197 HashSet checked,
198 Vector matching) {
199
200 // Check self.
201
202 boolean result = super.addTypes(typeCodeFilter,checked,matching);
203
204 // Have we been checked before?
205
206 if (result) {
207
208 // No, so add element type...
209
210 getElementType().addTypes(typeCodeFilter,checked,matching);
211 }
212
213 return result;
214 }
215
216 /**
217 * Create an ArrayType instance for the given type. The resulting
218 * object is not yet completely initialized.
219 */
220 private ArrayType(ContextStack stack, Type type, int arrayDimension) {
221 super(stack,TYPE_ARRAY);
222 this.type = type;
223 this.arrayDimension = arrayDimension;
224
225 // Create our brackets string...
226
227 brackets = "";
228 bracketsSig = "";
229 for (int i = 0; i < arrayDimension; i ++) {
230 brackets += "[]";
231 bracketsSig += "[";
232 }
233
234 // Now set our names...
235
236 String idlName = IDLNames.getArrayName(type,arrayDimension);
237 String[] module = IDLNames.getArrayModuleNames(type);
238 setNames(type.getIdentifier(),module,idlName);
239
240 // Set our repositoryID...
241
242 setRepositoryID();
243 }
244
245
246 /*
247 * Load a Class instance. Return null if fail.
248 */
249 protected Class loadClass() {
250 Class result = null;
251 Class elementClass = type.getClassInstance();
252 if (elementClass != null) {
253 result = Array.newInstance(elementClass, new int[arrayDimension]).getClass();
254 }
255 return result;
256 }
257
258 /**
259 * Release all resources
260 */
261 protected void destroy () {
262 super.destroy();
263 if (type != null) {
264 type.destroy();
265 type = null;
266 }
267 brackets = null;
268 bracketsSig = null;
269 }
270 }

mercurial