duke@1: /* ohair@158: * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@158: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@158: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@158: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@158: * or visit www.oracle.com if you need additional information or have any ohair@158: * questions. duke@1: */ duke@1: duke@1: /* duke@1: * Licensed Materials - Property of IBM duke@1: * RMI-IIOP v1.0 duke@1: * Copyright IBM Corp. 1998 1999 All Rights Reserved duke@1: * duke@1: */ duke@1: duke@1: package sun.rmi.rmic.iiop; duke@1: duke@1: import java.util.Vector; duke@1: import java.util.HashSet; duke@1: import sun.tools.java.CompilerError; duke@1: import sun.tools.java.Identifier; duke@1: import sun.tools.java.ClassDefinition; duke@1: import java.lang.reflect.Array; duke@1: duke@1: /** duke@1: * ArrayType is a wrapper for any of the other types. The getElementType() duke@1: * method can be used to get the array element type. The getArrayDimension() duke@1: * method can be used to get the array dimension. duke@1: * duke@1: * @author Bryan Atsatt duke@1: */ duke@1: public class ArrayType extends Type { duke@1: duke@1: private Type type; duke@1: private int arrayDimension; duke@1: private String brackets; duke@1: private String bracketsSig; duke@1: duke@1: //_____________________________________________________________________ duke@1: // Public Interfaces duke@1: //_____________________________________________________________________ duke@1: duke@1: /** duke@1: * Create an ArrayType object for the given type. duke@1: * duke@1: * If the class is not a properly formed or if some other error occurs, the duke@1: * return value will be null, and errors will have been reported to the duke@1: * supplied BatchEnvironment. duke@1: */ duke@1: public static ArrayType forArray( sun.tools.java.Type theType, duke@1: ContextStack stack) { duke@1: duke@1: duke@1: ArrayType result = null; duke@1: sun.tools.java.Type arrayType = theType; duke@1: duke@1: if (arrayType.getTypeCode() == TC_ARRAY) { duke@1: duke@1: // Find real type... duke@1: duke@1: while (arrayType.getTypeCode() == TC_ARRAY) { duke@1: arrayType = arrayType.getElementType(); duke@1: } duke@1: duke@1: // Do we already have it? duke@1: duke@1: Type existing = getType(theType,stack); duke@1: if (existing != null) { duke@1: duke@1: if (!(existing instanceof ArrayType)) return null; // False hit. duke@1: duke@1: // Yep, so return it... duke@1: duke@1: return (ArrayType) existing; duke@1: } duke@1: duke@1: // Now try to make a Type from it... duke@1: duke@1: Type temp = CompoundType.makeType(arrayType,null,stack); duke@1: duke@1: if (temp != null) { duke@1: duke@1: // Got a valid one. Make an array type... duke@1: duke@1: result = new ArrayType(stack,temp,theType.getArrayDimension()); duke@1: duke@1: // Add it... duke@1: duke@1: putType(theType,result,stack); duke@1: duke@1: // Do the stack thing in case tracing on... duke@1: duke@1: stack.push(result); duke@1: stack.pop(true); duke@1: } duke@1: } duke@1: duke@1: return result; duke@1: } duke@1: duke@1: /** duke@1: * Return signature for this type (e.g. com.acme.Dynamite duke@1: * would return "com.acme.Dynamite", byte = "B") duke@1: */ duke@1: public String getSignature() { duke@1: return bracketsSig + type.getSignature(); duke@1: } duke@1: duke@1: /** duke@1: * Get element type. Returns null if not an array. duke@1: */ duke@1: public Type getElementType () { duke@1: return type; duke@1: } duke@1: duke@1: /** duke@1: * Get array dimension. Returns zero if not an array. duke@1: */ duke@1: public int getArrayDimension () { duke@1: return arrayDimension; duke@1: } duke@1: duke@1: /** duke@1: * Get brackets string. Returns "" if not an array. duke@1: */ duke@1: public String getArrayBrackets () { duke@1: return brackets; duke@1: } duke@1: duke@1: /** duke@1: * Return a string representation of this type. duke@1: */ duke@1: public String toString () { duke@1: return getQualifiedName() + brackets; duke@1: } duke@1: duke@1: /** duke@1: * Return a string describing this type. duke@1: */ duke@1: public String getTypeDescription () { duke@1: return "Array of " + type.getTypeDescription(); duke@1: } duke@1: duke@1: duke@1: /** duke@1: * Return the name of this type. For arrays, will include "[]" if useIDLNames == false. duke@1: * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names. duke@1: * @param useIDLNames If true, print IDL names; otherwise, print java names. duke@1: * @param globalIDLNames If true and useIDLNames true, prepends "::". duke@1: */ duke@1: public String getTypeName ( boolean useQualifiedNames, duke@1: boolean useIDLNames, duke@1: boolean globalIDLNames) { duke@1: if (useIDLNames) { duke@1: return super.getTypeName(useQualifiedNames,useIDLNames,globalIDLNames); duke@1: } else { duke@1: return super.getTypeName(useQualifiedNames,useIDLNames,globalIDLNames) + brackets; duke@1: } duke@1: } duke@1: duke@1: //_____________________________________________________________________ duke@1: // Subclass/Internal Interfaces duke@1: //_____________________________________________________________________ duke@1: duke@1: duke@1: /** duke@1: * Convert all invalid types to valid ones. duke@1: */ duke@1: protected void swapInvalidTypes () { duke@1: if (type.getStatus() != STATUS_VALID) { duke@1: type = getValidType(type); duke@1: } duke@1: } duke@1: duke@1: /* duke@1: * Add matching types to list. Return true if this type has not duke@1: * been previously checked, false otherwise. duke@1: */ duke@1: protected boolean addTypes (int typeCodeFilter, duke@1: HashSet checked, duke@1: Vector matching) { duke@1: duke@1: // Check self. duke@1: duke@1: boolean result = super.addTypes(typeCodeFilter,checked,matching); duke@1: duke@1: // Have we been checked before? duke@1: duke@1: if (result) { duke@1: duke@1: // No, so add element type... duke@1: duke@1: getElementType().addTypes(typeCodeFilter,checked,matching); duke@1: } duke@1: duke@1: return result; duke@1: } duke@1: duke@1: /** duke@1: * Create an ArrayType instance for the given type. The resulting duke@1: * object is not yet completely initialized. duke@1: */ duke@1: private ArrayType(ContextStack stack, Type type, int arrayDimension) { duke@1: super(stack,TYPE_ARRAY); duke@1: this.type = type; duke@1: this.arrayDimension = arrayDimension; duke@1: duke@1: // Create our brackets string... duke@1: duke@1: brackets = ""; duke@1: bracketsSig = ""; duke@1: for (int i = 0; i < arrayDimension; i ++) { duke@1: brackets += "[]"; duke@1: bracketsSig += "["; duke@1: } duke@1: duke@1: // Now set our names... duke@1: duke@1: String idlName = IDLNames.getArrayName(type,arrayDimension); duke@1: String[] module = IDLNames.getArrayModuleNames(type); duke@1: setNames(type.getIdentifier(),module,idlName); duke@1: duke@1: // Set our repositoryID... duke@1: duke@1: setRepositoryID(); duke@1: } duke@1: duke@1: duke@1: /* duke@1: * Load a Class instance. Return null if fail. duke@1: */ duke@1: protected Class loadClass() { duke@1: Class result = null; duke@1: Class elementClass = type.getClassInstance(); duke@1: if (elementClass != null) { duke@1: result = Array.newInstance(elementClass, new int[arrayDimension]).getClass(); duke@1: } duke@1: return result; duke@1: } duke@1: duke@1: /** duke@1: * Release all resources duke@1: */ duke@1: protected void destroy () { duke@1: super.destroy(); duke@1: if (type != null) { duke@1: type.destroy(); duke@1: type = null; duke@1: } duke@1: brackets = null; duke@1: bracketsSig = null; duke@1: } duke@1: }