001: /*******************************************************************************
002: * Copyright (c) 2004, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.core.dom;
011:
012: /**
013: * Abstract base class for all AST nodes that represent comments.
014: * There are exactly three kinds of comment:
015: * line comments ({@link LineComment}),
016: * block comments ({@link BlockComment}), and
017: * doc comments ({@link Javadoc}).
018: * <p>
019: * <pre>
020: * Comment:
021: * LineComment
022: * BlockComment
023: * Javadoc
024: * </pre>
025: * </p>
026: *
027: * @since 3.0
028: */
029: public abstract class Comment extends ASTNode {
030:
031: /**
032: * Alternate root node, or <code>null</code> if none.
033: * Initially <code>null</code>.
034: */
035: private ASTNode alternateRoot = null;
036:
037: /**
038: * Creates a new AST node for a comment owned by the given AST.
039: * <p>
040: * N.B. This constructor is package-private.
041: * </p>
042: *
043: * @param ast the AST that is to own this node
044: */
045: Comment(AST ast) {
046: super (ast);
047: }
048:
049: /**
050: * Returns whether this comment is a block comment
051: * (<code>BlockComment</code>).
052: *
053: * @return <code>true</code> if this is a block comment, and
054: * <code>false</code> otherwise
055: */
056: public final boolean isBlockComment() {
057: return (this instanceof BlockComment);
058: }
059:
060: /**
061: * Returns whether this comment is a line comment
062: * (<code>LineComment</code>).
063: *
064: * @return <code>true</code> if this is a line comment, and
065: * <code>false</code> otherwise
066: */
067: public final boolean isLineComment() {
068: return (this instanceof LineComment);
069: }
070:
071: /**
072: * Returns whether this comment is a doc comment
073: * (<code>Javadoc</code>).
074: *
075: * @return <code>true</code> if this is a doc comment, and
076: * <code>false</code> otherwise
077: */
078: public final boolean isDocComment() {
079: return (this instanceof Javadoc);
080: }
081:
082: /**
083: * Returns the root AST node that this comment occurs
084: * within, or <code>null</code> if none (or not recorded).
085: * <p>
086: * Typically, the comment nodes created while parsing a compilation
087: * unit are not considered descendents of the normal AST
088: * root, namely an {@link CompilationUnit}. Instead, these
089: * comment nodes exist outside the normal AST and each is
090: * a root in its own right. This optional property provides
091: * a well-known way to navigate from the comment to the
092: * compilation unit in such cases. Note that the alternate root
093: * property is not one of the comment node's children. It is simply a
094: * reference to a node.
095: * </p>
096: *
097: * @return the alternate root node, or <code>null</code>
098: * if none
099: * @see #setAlternateRoot(ASTNode)
100: */
101: public final ASTNode getAlternateRoot() {
102: return this .alternateRoot;
103: }
104:
105: /**
106: * Returns the root AST node that this comment occurs
107: * within, or <code>null</code> if none (or not recorded).
108: * <p>
109: * </p>
110: *
111: * @param root the alternate root node, or <code>null</code>
112: * if none
113: * @see #getAlternateRoot()
114: */
115: public final void setAlternateRoot(ASTNode root) {
116: // alternate root is *not* considered a structural property
117: // but we protect them nevertheless
118: checkModifiable();
119: this .alternateRoot = root;
120: }
121:
122: /* (omit javadoc for this method)
123: * Method declared on ASTNode.
124: */
125: int memSize() {
126: return BASE_NODE_SIZE + 1 * 4;
127: }
128: }
|