/*
* xtc - The eXTensible Compiler
* Copyright (C) 2005-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 java.util.List;
import xtc.util.Utilities;
/**
* The superclass of class and interface types.
*
* @author Robert Grimm
* @version $Revision: 1.21 $
*/
public abstract class ClassOrInterfaceT extends DerivedT {
/** The fully qualfied name. */
protected String qname;
/** The list of {@link InterfaceT interfaces}. */
protected List<Type> interfaces;
/** The list of {@link VariableT fields}. */
protected List<Type> fields;
/** The list of {@link MethodT methods}. */
protected List<Type> methods;
/**
* Create a new class or interface type.
*
* @param template The template whose annotations to copy.
* @param qname The fully qualified name.
* @param interfaces The list of interfaces.
* @param fields The list of fields.
* @param methods The list of methods.
*/
public ClassOrInterfaceT(Type template, String qname, List<Type> interfaces,
List<Type> fields, List<Type> methods) {
super(template);
this.qname = qname;
this.interfaces = interfaces;
this.fields = fields;
this.methods = methods;
}
public Type seal() {
if (! isSealed()) {
super.seal();
interfaces = Type.seal(interfaces);
fields = Type.seal(fields);
methods = Type.seal(methods);
}
return this;
}
/**
* Get the qualified name.
*
* @return The qualified name.
*/
public String getQName() {
return qname;
}
/**
* Get the qualifier for this class' or interface's name.
*
* @return The qualifier.
*/
public String getQualifier() {
return Utilities.getQualifier(qname);
}
/**
* Get the unqualified name.
*
* @return The unqualified name.
*/
public String getName() {
return Utilities.getName(qname);
}
/**
* Get the list of interfaces.
*
* @return The list of interfaces.
*/
public List<Type> getInterfaces() {
return interfaces;
}
/**
* Get the list of fields.
*
* @return The list of fields.
*/
public List<Type> getFields() {
return fields;
}
/**
* Get the list of methods.
*
* @return The list of methods.
*/
public List<Type> getMethods() {
return methods;
}
public int hashCode() {
return qname.hashCode();
}
/**
* Determine whether this type equals the specified object. This
* class or interface equals the specified object if the specified
* object also is a class or interface with the same name.
*
* @param o The object.
* @return <code>true</code> if this type equals the object.
*/
public boolean equals(Object o) {
if (! (o instanceof Type)) return false;
Type t = resolve(o);
if (this == t) return true;
if (! getClass().equals(t.getClass())) return false;
return qname.equals(((ClassOrInterfaceT)t).qname);
}
}