/*
* xtc - The eXTensible Compiler
* Copyright (C) 2006-2007 Robert Grimm
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.type;
import xtc.tree.Attribute;
import xtc.tree.Location;
/**
* The superclass of all wrapped types. A wrapped type adds (mostly)
* symbolic information to another, more basic type.
*
* @author Robert Grimm
* @version $Revision: 1.37 $
*/
public abstract class WrappedT extends Type {
/** The actual type. */
private Type type;
/**
* Create a new wrapped type.
*
* @param type The actual type.
*/
public WrappedT(Type type) {
this.type = type;
}
/**
* Create a new wrapped type.
*
* @param template The type whose annotations to copy.
* @param type The actual type.
*/
public WrappedT(Type template, Type type) {
super(template);
this.type = type;
}
public Type seal() {
if (! isSealed()) {
super.seal();
type.seal();
}
return this;
}
public Type.Tag tag() {
return type.tag();
}
public boolean isWrapped() {
return true;
}
public WrappedT toWrapped() {
return this;
}
public boolean hasLocation(boolean forward) {
Location loc = super.getLocation(false);
return null != loc ? true : forward ? type.hasLocation(true) : false;
}
public Location getLocation(boolean forward) {
Location loc = super.getLocation(false);
return null != loc ? loc : forward ? type.getLocation(true) : null;
}
public boolean hasLanguage(boolean forward) {
return null != language ? true : forward ? type.hasLanguage(true) : false;
}
public Language getLanguage(boolean forward) {
return null != language ? language : forward ? type.getLanguage(true) : null;
}
public boolean hasScope(boolean forward) {
return null != scope ? true : forward ? type.hasScope(true) : false;
}
public String getScope(boolean forward) {
return null != scope ? scope : forward ? type.getScope(true) : null;
}
public boolean hasConstant(boolean forward) {
return null != constant ? true : forward ? type.hasConstant(true) : false;
}
public Constant getConstant(boolean forward) {
return null != constant ? constant : forward ? type.getConstant(true) : null;
}
public boolean hasShape(boolean forward) {
return null != shape ? true : forward ? type.hasShape(true) : false;
}
public Reference getShape(boolean forward) {
return null != shape ? shape : forward ? type.getShape(true) : null;
}
public boolean hasAttribute(Attribute att, boolean forward) {
return (null != attributes) && attributes.contains(att) ? true :
forward ? type.hasAttribute(att, true) : false;
}
public Attribute getAttribute(String name, boolean forward) {
Attribute att = Attribute.get(name, attributes);
return null != att ? att : forward ? type.getAttribute(name, true) : null;
}
/**
* Get the type.
*
* @return The type.
*/
public Type getType() {
return type;
}
/**
* Set the type.
*
* @param type The type.
* @throws IllegalStateException Signals that this type is sealed.
*/
public void setType(Type type) {
checkNotSealed();
this.type = type;
}
public boolean hasAnnotated() {
return type.hasAnnotated();
}
public AnnotatedT toAnnotated() {
return type.toAnnotated();
}
public boolean hasAlias() {
return type.hasAlias();
}
public AliasT toAlias() {
return type.toAlias();
}
public boolean hasEnum() {
return type.hasEnum();
}
public EnumT toEnum() {
return type.toEnum();
}
public boolean hasEnumerator() {
return type.hasEnumerator();
}
public EnumeratorT toEnumerator() {
return type.toEnumerator();
}
public boolean hasVariable() {
return type.hasVariable();
}
public VariableT toVariable() {
return type.toVariable();
}
public boolean hasInstantiated() {
return type.hasInstantiated();
}
public InstantiatedT toInstantiated() {
return type.toInstantiated();
}
public boolean hasParameterized() {
return type.hasParameterized();
}
public ParameterizedT toParameterized() {
return type.toParameterized();
}
public StructOrUnionT toStructOrUnion() {
return type.toStructOrUnion();
}
public boolean hasTagged() {
return type.hasTagged();
}
public Tagged toTagged() {
return type.toTagged();
}
public Type resolve() {
return type.resolve();
}
/**
* Get this type's hash code. This method forwards the method
* invocation to the wrapped type.
*
* @return The hash code.
*/
public int hashCode() {
return type.hashCode();
}
/**
* Determine whether this type equals the specified object. This
* method forwards the method invocation to the wrapped type.
*
* @param o The object.
* @return <code>true</code> if this type equals the object.
*/
public boolean equals(Object o) {
return getType().equals(o);
}
}