/*******************************************************************************
 * Copyright (c) 2004, 2009 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.dom;

/**
 * Abstract base class for all AST nodes that represent comments.
 * There are exactly three kinds of comment:
 * line comments ({@link LineComment}),
 * block comments ({@link BlockComment}), and
 * doc comments ({@link Javadoc}).
 * <p>
 * <pre>
 * Comment:
 *     LineComment
 *     BlockComment
 *     Javadoc
 * </pre>
 * </p>
 *
 * @since 3.0
 */
public abstract class Comment extends ASTNode {

	/**
	 * Alternate root node, or <code>null</code> if none.
	 * Initially <code>null</code>.
	 */
	private ASTNode alternateRoot = null;

	/**
	 * Creates a new AST node for a comment owned by the given AST.
	 * <p>
	 * N.B. This constructor is package-private.
	 * </p>
	 *
	 * @param ast the AST that is to own this node
	 */
	Comment(AST ast) {
		super(ast);
	}

	/**
	 * Returns whether this comment is a block comment
	 * (<code>BlockComment</code>).
	 *
	 * @return <code>true</code> if this is a block comment, and
	 *    <code>false</code> otherwise
	 */
	public final boolean isBlockComment() {
		return (this instanceof BlockComment);
	}

	/**
	 * Returns whether this comment is a line comment
	 * (<code>LineComment</code>).
	 *
	 * @return <code>true</code> if this is a line comment, and
	 *    <code>false</code> otherwise
	 */
	public final boolean isLineComment() {
		return (this instanceof LineComment);
	}

	/**
	 * Returns whether this comment is a doc comment
	 * (<code>Javadoc</code>).
	 *
	 * @return <code>true</code> if this is a doc comment, and
	 *    <code>false</code> otherwise
	 */
	public final boolean isDocComment() {
		return (this instanceof Javadoc);
	}

	/**
	 * Returns the root AST node that this comment occurs
	 * within, or <code>null</code> if none (or not recorded).
	 * <p>
	 * Typically, the comment nodes created while parsing a compilation
	 * unit are not considered descendents of the normal AST
	 * root, namely an {@link CompilationUnit}. Instead, these
	 * comment nodes exist outside the normal AST and each is
	 * a root in its own right. This optional property provides
	 * a well-known way to navigate from the comment to the
	 * compilation unit in such cases. Note that the alternate root
	 * property is not one of the comment node's children. It is simply a
	 * reference to a node.
	 * </p>
	 *
	 * @return the alternate root node, or <code>null</code>
	 * if none
	 * @see #setAlternateRoot(ASTNode)
	 */
	public final ASTNode getAlternateRoot() {
		return this.alternateRoot;
	}

	/**
	 * Returns the root AST node that this comment occurs
	 * within, or <code>null</code> if none (or not recorded).
	 * <p>
	 * </p>
	 *
	 * @param root the alternate root node, or <code>null</code>
	 * if none
	 * @see #getAlternateRoot()
	 */
	public final void setAlternateRoot(ASTNode root) {
		// alternate root is *not* considered a structural property
		// but we protect them nevertheless
		checkModifiable();
		this.alternateRoot = root;
	}

	/* (omit javadoc for this method)
	 * Method declared on ASTNode.
	 */
	int memSize() {
		return BASE_NODE_SIZE + 1 * 4;
	}
}
