/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.jsdt.core.dom;

/**
 * Abstract base class of all type AST node types. A type node represents a 
 * reference to a primitive type (including void), to a named class or 
 * interface type, or to an array type.
 * <p>
 * <pre>
 * Type:
 *    PrimitiveType
 *    SimpleType
 *    ArrayType
 * PrimitiveType:
 *    <b>byte</b>
 *    <b>short</b>
 *    <b>char</b>
 *    <b>int</b>
 *    <b>long</b>
 *    <b>float</b>
 *    <b>double</b>
 *    <b>boolean</b>
 *    <b>void</b>
 * SimpleType:
 *    TypeName
 * ArrayType:
 *    Type <b>[</b> <b>]</b>
 * </pre>
 * </p>
 * 
 * @since 2.0
 */
public abstract class Type extends ASTNode {
	
	/**
	 * Creates a new AST node for a type owned by the given AST.
	 * <p>
	 * N.B. This constructor is package-private.
	 * </p>
	 * 
	 * @param ast the AST that is to own this node
	 */
	Type(AST ast) {
		super(ast);
	}
	
	/**
	 * Returns whether this type is a primitive type
	 * (<code>PrimitiveType</code>). 
	 * 
	 * @return <code>true</code> if this is a primitive type, and 
	 *    <code>false</code> otherwise
	 */
	public final boolean isPrimitiveType() {
		return (this instanceof PrimitiveType);
	}

	/**
	 * Returns whether this type is a simple type 
	 * (<code>SimpleType</code>).
	 * 
	 * @return <code>true</code> if this is a simple type, and 
	 *    <code>false</code> otherwise
	 */
	public final boolean isSimpleType() {
		return (this instanceof SimpleType);
	}

	/**
	 * Returns whether this type is an array type
	 * (<code>ArrayType</code>).
	 * 
	 * @return <code>true</code> if this is an array type, and 
	 *    <code>false</code> otherwise
	 */
	public final boolean isArrayType() {
		return (this instanceof ArrayType);
	}

	/**
	 * Resolves and returns the binding for this type.
	 * <p>
	 * Note that bindings are generally unavailable unless requested when the
	 * AST is being built.
	 * </p>
	 * 
	 * @return the type binding, or <code>null</code> if the binding cannot be 
	 *    resolved
	 */	
	public final ITypeBinding resolveBinding() {
		return getAST().getBindingResolver().resolveType(this);
	}
	
// JSR-014
//	/**
//	 * Returns whether this type is a parameterized type 
//   * (<code>ParameterizedType</code>).
//	 * 
//	 * @return <code>true</code> if this is a parameterized type, and 
//	 *    <code>false</code> otherwise
//	 */
//	public final boolean isParameterizedType() {
//		return (this instanceof ParameterizedType);
//	}

//	public IBinding resolvedType();
}

//// JSR-014
//public class ParameterizedType extends Type {
//	public ParameterizedType(AST ast) {
//		super(ast);
//	}
//
//	public Type getGenericType();
//	public void setGenericType(Type genericType);
//
//	public NodeList<Type> parameters();
//}