package bluej.parser.nodes;
import java.io.Reader;
import bluej.editor.moe.MoeSyntaxDocument;
import bluej.editor.moe.MoeSyntaxDocument.Element;
import bluej.editor.moe.Token;
import bluej.editor.moe.Token.TokenType;
import bluej.parser.ExpressionTypeInfo;
import bluej.parser.DocumentReader;
import bluej.parser.lexer.JavaLexer;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
| A node type for representing comments in the code.
|
| @author Davin McCall
|
public class CommentNode
extends ParsedNode{
private static enum Type
{
SL_NORMAL(true, TokenType.COMMENT_NORMAL),
SL_SPECIAL(true, TokenType.COMMENT_SPECIAL),
ML_NORMAL(false, TokenType.COMMENT_NORMAL),
ML_JAVADOC(false, TokenType.COMMENT_JAVADOC),
ML_SPECIAL(false, TokenType.COMMENT_SPECIAL);
private final boolean singleLine;
private final TokenType tokenType;
private Type(boolean singleLine, TokenType tokenType)
{
this.singleLine = singleLine;
this.tokenType = tokenType;
}
};
private Type type;
public CommentNode(ParsedNode parentNode, LocatableToken token)
{
super(parentNode);
type = getCommentType(token);
}
| Determine the comment type from the token.
|
private static Type getCommentType(LocatableToken token)
{
String text = token.getText();
if (token.getType() == JavaTokenTypes.ML_COMMENT) {
if (text.startsWith("/*#")) {
return Type.ML_SPECIAL;
}
if (text.startsWith("/**#")) {
return Type.ML_SPECIAL;
}
if (text.startsWith("/**")) {
return Type.ML_JAVADOC;
}
return Type.ML_NORMAL;
}
if (text.startsWith("//#")) {
return Type.SL_SPECIAL;
}
return Type.SL_NORMAL;
}
public boolean isJavadocComment()
{
return type == Type.ML_JAVADOC;
}
@Override
public int getNodeType()
{
return NODETYPE_COMMENT;
}
| (non-Javadoc)
| @see bluej.parser.nodes.ParsedNode#getMarkTokensFor(int, int, int, javax.swing.text.Document)
|
public Token getMarkTokensFor(int pos, int length, int nodePos,
MoeSyntaxDocument document)
{
Token tok = new Token(length, type.tokenType);
tok.next = new Token(0, TokenType.END);
return tok;
}
@Override
protected boolean marksOwnEnd()
{
return true;
}
@Override
public int textInserted(MoeSyntaxDocument document, int nodePos, int insPos, int length,
NodeStructureListener listener)
{
int newSize = getSize() + length;
resize(newSize);
document.scheduleReparse(insPos, length);
return ALL_OK;
}
@Override
public int textRemoved(MoeSyntaxDocument document, int nodePos, int delPos, int length,
NodeStructureListener listener)
{
int newSize = getSize() - length;
resize(newSize);
document.scheduleReparse(delPos, 0);
return ALL_OK;
}
@Override
protected int reparseNode(MoeSyntaxDocument document, int nodePos, int offset, int maxParse,
NodeStructureListener listener)
{
int pline = document.getDefaultRootElement().getElementIndex(nodePos) + 1;
int pcol = nodePos - document.getDefaultRootElement().getElement(pline - 1).getStartOffset() + 1;
Reader r = new DocumentReader(document, nodePos, nodePos + getSize());
JavaLexer lexer = new JavaLexer(r, pline, pcol, nodePos);
LocatableToken commentToken = lexer.nextToken();
if (commentToken.getType() != JavaTokenTypes.SL_COMMENT &&
commentToken.getType() != JavaTokenTypes.ML_COMMENT) {
return REMOVE_NODE;
}
Type newType = getCommentType(commentToken);
if (type.singleLine && !newType.singleLine) {
return REMOVE_NODE;
}
else if (!type.singleLine && newType.singleLine) {
if (getOffsetFromParent() == 0 && getParentNode().isCommentAttached()) {
return REMOVE_NODE;
}
}
type = newType;
int newEnd = lineColToPos(document, commentToken.getEndLine(),
commentToken.getEndColumn());
int newSize = newEnd - nodePos;
((MoeSyntaxDocument)document).markSectionParsed(nodePos, newSize);
if (getSize() != newSize) {
setSize(newSize);
return NODE_SHRUNK;
}
return ALL_OK;
}
private static int lineColToPos(MoeSyntaxDocument document, int line, int col)
{
Element map = document.getDefaultRootElement();
Element lineEl = map.getElement(line - 1);
return lineEl.getStartOffset() + col - 1;
}
@Override
public ExpressionTypeInfo getExpressionType(int pos, MoeSyntaxDocument document)
{
return null;
}
}
top,
use,
map,
class CommentNode
. Type
. CommentNode
. getCommentType
. isJavadocComment
. getNodeType
. getMarkTokensFor
. marksOwnEnd
. textInserted
. textRemoved
. reparseNode
. lineColToPos
. getExpressionType
224 neLoCode
+ 5 LoComm