1
2
3
4 package net.sourceforge.pmd.lang.ecmascript.ast;
5
6 import net.sourceforge.pmd.lang.ast.AbstractNode;
7
8 import org.mozilla.javascript.ast.AstNode;
9
10 public abstract class AbstractEcmascriptNode<T extends AstNode> extends AbstractNode implements EcmascriptNode<T> {
11
12 protected final T node;
13
14 public AbstractEcmascriptNode(T node) {
15 super(node.getType());
16 this.node = node;
17 }
18
19
20 void calculateLineNumbers(SourceCodePositioner positioner) {
21 int startOffset = node.getAbsolutePosition();
22 int endOffset = startOffset + node.getLength();
23
24 this.beginLine = positioner.lineNumberFromOffset(startOffset);
25 this.beginColumn = positioner.columnFromOffset(startOffset);
26 this.endLine = positioner.lineNumberFromOffset(endOffset);
27 this.endColumn = positioner.columnFromOffset(endOffset) - 1;
28 if (this.endColumn < 0) {
29 this.endColumn = 0;
30 }
31 }
32
33
34
35
36 public Object jjtAccept(EcmascriptParserVisitor visitor, Object data) {
37 return visitor.visit(this, data);
38 }
39
40
41
42
43 public Object childrenAccept(EcmascriptParserVisitor visitor, Object data) {
44 if (children != null) {
45 for (int i = 0; i < children.length; ++i) {
46 @SuppressWarnings("unchecked")
47 EcmascriptNode<T> ecmascriptNode = (EcmascriptNode<T>) children[i];
48 ecmascriptNode.jjtAccept(visitor, data);
49 }
50 }
51 return data;
52 }
53
54 public T getNode() {
55 return node;
56 }
57
58 public String getJsDoc() {
59 return node.getJsDoc();
60 }
61
62 public boolean hasSideEffects() {
63 return node.hasSideEffects();
64 }
65
66 @Override
67 public String toString() {
68 return node.shortName();
69 }
70 }