forked from phoedos/pmd
Cleanup javascript builder
This commit is contained in:
@ -7,7 +7,6 @@ package net.sourceforge.pmd.lang.ecmascript.ast;
|
|||||||
import org.mozilla.javascript.ast.AstNode;
|
import org.mozilla.javascript.ast.AstNode;
|
||||||
|
|
||||||
import net.sourceforge.pmd.lang.ast.AstVisitor;
|
import net.sourceforge.pmd.lang.ast.AstVisitor;
|
||||||
import net.sourceforge.pmd.lang.ast.SourceCodePositioner;
|
|
||||||
import net.sourceforge.pmd.lang.ast.impl.AbstractNode;
|
import net.sourceforge.pmd.lang.ast.impl.AbstractNode;
|
||||||
import net.sourceforge.pmd.util.document.FileLocation;
|
import net.sourceforge.pmd.util.document.FileLocation;
|
||||||
import net.sourceforge.pmd.util.document.TextDocument;
|
import net.sourceforge.pmd.util.document.TextDocument;
|
||||||
@ -18,6 +17,7 @@ abstract class AbstractEcmascriptNode<T extends AstNode> extends AbstractNode<Ab
|
|||||||
protected final T node;
|
protected final T node;
|
||||||
private String image;
|
private String image;
|
||||||
private TextDocument textDocument;
|
private TextDocument textDocument;
|
||||||
|
private int absPos;
|
||||||
|
|
||||||
AbstractEcmascriptNode(T node) {
|
AbstractEcmascriptNode(T node) {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
@ -38,13 +38,16 @@ abstract class AbstractEcmascriptNode<T extends AstNode> extends AbstractNode<Ab
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* package private */
|
/* package private */
|
||||||
void calculateLineNumbers(TextDocument positioner) {
|
int calculateAbsolutePos(TextDocument positioner, int parentRelPos) {
|
||||||
this.textDocument = positioner;
|
this.textDocument = positioner;
|
||||||
|
int absPos = parentRelPos + node.getPosition();
|
||||||
|
this.absPos = absPos;
|
||||||
|
return absPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileLocation getReportLocation() {
|
public FileLocation getReportLocation() {
|
||||||
return textDocument.toLocation(TextRegion.fromOffsetLength(node.getAbsolutePosition(), node.getLength()));
|
return textDocument.toLocation(TextRegion.fromOffsetLength(absPos, node.getLength()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -171,7 +171,7 @@ final class EcmascriptTreeBuilder implements NodeVisitor {
|
|||||||
public <T extends AstNode> EcmascriptNode<T> build(T astNode) {
|
public <T extends AstNode> EcmascriptNode<T> build(T astNode) {
|
||||||
EcmascriptNode<T> node = buildInternal(astNode);
|
EcmascriptNode<T> node = buildInternal(astNode);
|
||||||
|
|
||||||
calculateLineNumbers(node);
|
calculateLineNumbers(node, astNode.getAbsolutePosition());
|
||||||
|
|
||||||
// Set all the trailing comma nodes
|
// Set all the trailing comma nodes
|
||||||
for (AbstractEcmascriptNode<?> trailingCommaNode : parseProblemToNode.values()) {
|
for (AbstractEcmascriptNode<?> trailingCommaNode : parseProblemToNode.values()) {
|
||||||
@ -231,7 +231,7 @@ final class EcmascriptTreeBuilder implements NodeVisitor {
|
|||||||
if (trailingCommaLocalizedMessage.equals(parseProblem.getMessage())) {
|
if (trailingCommaLocalizedMessage.equals(parseProblem.getMessage())) {
|
||||||
// Report on the shortest code block containing the
|
// Report on the shortest code block containing the
|
||||||
// problem (i.e. inner most code in nested structures).
|
// problem (i.e. inner most code in nested structures).
|
||||||
AbstractEcmascriptNode<?> currentNode = (AbstractEcmascriptNode<?>) parseProblemToNode.get(parseProblem);
|
AbstractEcmascriptNode<?> currentNode = parseProblemToNode.get(parseProblem);
|
||||||
if (currentNode == null || node.node.getLength() < currentNode.node.getLength()) {
|
if (currentNode == null || node.node.getLength() < currentNode.node.getLength()) {
|
||||||
parseProblemToNode.put(parseProblem, node);
|
parseProblemToNode.put(parseProblem, node);
|
||||||
}
|
}
|
||||||
@ -241,7 +241,11 @@ final class EcmascriptTreeBuilder implements NodeVisitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateLineNumbers(EcmascriptNode<?> node) {
|
private void calculateLineNumbers(EcmascriptNode<?> node, int parentAbsPos) {
|
||||||
node.descendantsOrSelf().forEach(n -> ((AbstractEcmascriptNode<?>) n).calculateLineNumbers(textDocument));
|
int absPos = ((AbstractEcmascriptNode<?>) node).calculateAbsolutePos(textDocument, parentAbsPos);
|
||||||
|
|
||||||
|
for (EcmascriptNode<?> child : node.children()) {
|
||||||
|
((AbstractEcmascriptNode<?>) child).calculateAbsolutePos(textDocument, absPos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user