blob: 2d1282586cae74f5ec81a1092f89c97220bdcc49 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.common.internal.types;
import org.eclipse.jdt.core.Signature;
/**
* Value object representing a value binding type by it's type and assignability
* information
*
* @author cbateman
*
*/
public class ValueType implements SignatureBasedType, IAssignable
{
/**
* A default empty string array
*/
protected final static String[] EMPTY_STRING_ARRAY = new String[0];
private final String _signature;
private final String[] _typeArgs;
private final int _assignmentMask;
private final String[] _superTypes;
private final String[] _interfaceTypes;
private final boolean _isEnumType;
private String[] _allTypes; // lazy creation on getAllTypes
/**
* Construct a new ValueType object with the given
* signature
*
* @param signature
* @param typeArgs generic type arguments for signature or empty if none
* @param superTypes
* @param interfaceTypes
* @param isEnumType
* @param assignmentMask
*/
public ValueType(final String signature,
final String[] typeArgs,
final String[] superTypes,
final String[] interfaceTypes,
final boolean isEnumType,
final int assignmentMask)
{
if (signature == null)
{
throw new AssertionError("signature can never be null"); //$NON-NLS-1$
}
_signature = signature;
_typeArgs = typeArgs;
_assignmentMask = assignmentMask;
_superTypes = superTypes != null ? superTypes : EMPTY_STRING_ARRAY;
_interfaceTypes = interfaceTypes != null ? interfaceTypes : EMPTY_STRING_ARRAY;
_isEnumType = isEnumType;
}
/**
* Copy constructor equivilent to
* ValueType(template.getSignature(), template.getSuperTypes(), template.getInterfaceTypes(),assingmentMask, template._isEnumType)
*
* @param template
* @param assignmentMask
*/
public ValueType(final ValueType template, final int assignmentMask)
{
this(template._signature, template._typeArgs, template._superTypes,
template._interfaceTypes, template._isEnumType, assignmentMask);
}
/**
* Convienence constructor for creating ValueType's with no supertype, type argument
* or interface info. Equivilent to:
* ValueType(signature, new String[0], new String[0], new String[0], false, assignmentMask)
*
* @param signature
* @param assignmentMask
*/
public ValueType(final String signature, final int assignmentMask)
{
this(signature, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, EMPTY_STRING_ARRAY, false, assignmentMask);
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.core.internal.types.SignatureBasedType#getSignature()
*/
public String getSignature()
{
return _signature;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.internal.types.IAssignable#getAssignability()
*/
public int getAssignability() {
return _assignmentMask;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isLHS()
*/
public boolean isLHS() {
return TypeUtil.matchesLHS(_assignmentMask);
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.internal.types.IAssignable#isRHS()
*/
public boolean isRHS() {
return TypeUtil.matchesRHS(_assignmentMask);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
return Signature.getSignatureSimpleName
(TypeTransformer.transformBoxPrimitives(_signature));
}
/**
* @return an array of all signatures of all super types or empty
* array if there are no super types for this type
*
* Note: if isArray() == true, then these are the super types of
* the base element
*/
public String[] getSuperTypes()
{
return _superTypes;
}
/**
* @return an array of all interfaces implemented or empty array
* if none
*
* Note: if isArray() == true, then these are the interfacess of
* the base element
*/
public String[] getInterfaceTypes()
{
return _interfaceTypes;
}
/**
* @return all types including the base type, super types and interface
* types.
*
* Note: if isArray() == true, then these are the super types of
* the base element
*/
public String[] getAllTypes()
{
if (_allTypes == null)
{
int numberOfTypes = 1 + _superTypes.length + _interfaceTypes.length;
_allTypes = new String[numberOfTypes];
_allTypes[0] = _signature;
System.arraycopy(_superTypes, 0, _allTypes, 1, _superTypes.length);
System.arraycopy(_interfaceTypes, 0, _allTypes, 1+_superTypes.length, _interfaceTypes.length);
}
return _allTypes;
}
/**
* @return the type arguments for getSignature() if any or empty array if none
*/
public String[] getTypeArguments()
{
return _typeArgs;
}
/**
*
*/
public CompositeType toCompositeType()
{
return new CompositeType(getAllTypes(), getAssignability());
}
/**
* @param signature
* @return true if an instance of this type would satisfy instanceof signature
*
*/
public boolean isInstanceOf(final String signature)
{
// if this is an array, then the super types are for the base
// type and we can't be an instance of anything but signature
if (isArray())
{
return getSignature().equals(signature);
}
final String[] allTypes = getAllTypes();
for (int i = 0; i < allTypes.length; i++)
{
if (allTypes[i].equals(signature))
{
return true;
}
}
return false;
}
/**
* @return true if this is an array type
*/
public boolean isArray()
{
return Signature.getArrayCount(getSignature()) > 0;
}
/**
* @return true if the value type represents a (>=Java5) enum type
*/
public boolean isEnumType() {
return _isEnumType;
}
}