/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.ecmascript.ast;
import org.mozilla.javascript.ast.AstNode;
import net.sourceforge.pmd.lang.ast.AbstractNode;
import net.sourceforge.pmd.lang.ast.SourceCodePositioner;
public abstract class AbstractEcmascriptNode<T extends AstNode> extends AbstractNode implements EcmascriptNode<T> {
protected final T node;
public AbstractEcmascriptNode(T node) {
super(node.getType());
this.node = node;
}
/* package private */
void calculateLineNumbers(SourceCodePositioner positioner) {
int startOffset = node.getAbsolutePosition();
int endOffset = startOffset + node.getLength();
this.beginLine = positioner.lineNumberFromOffset(startOffset);
this.beginColumn = positioner.columnFromOffset(this.beginLine, startOffset);
this.endLine = positioner.lineNumberFromOffset(endOffset);
// end column is inclusive
this.endColumn = positioner.columnFromOffset(this.endLine, endOffset) - 1;
if (this.endColumn < 0) {
this.endColumn = 0;
}
}
/**
* Accept the visitor. *
*/
public Object jjtAccept(EcmascriptParserVisitor visitor, Object data) {
return visitor.visit(this, data);
}
/**
* Accept the visitor. *
*/
public Object childrenAccept(EcmascriptParserVisitor visitor, Object data) {
if (children != null) {
for (int i = 0; i < children.length; ++i) {
// we know that the children here
// are all EcmascriptNodes
@SuppressWarnings("unchecked")
EcmascriptNode<T> ecmascriptNode = (EcmascriptNode<T>) children[i];
ecmascriptNode.jjtAccept(visitor, data);
}
}
return data;
}
public T getNode() {
return node;
}
public String getJsDoc() {
return node.getJsDoc();
}
public boolean hasSideEffects() {
return node.hasSideEffects();
}
@Override
public String toString() {
return node.shortName();
}
}