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