diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/AbstractApexNode.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/AbstractApexNode.java index e47daebf6a..19424788e6 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/AbstractApexNode.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/AbstractApexNode.java @@ -4,9 +4,10 @@ package net.sourceforge.pmd.lang.apex.ast; -import net.sourceforge.pmd.lang.ast.impl.AbstractNodeWithTextCoordinates; +import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.SourceCodePositioner; +import net.sourceforge.pmd.lang.ast.impl.AbstractNodeWithTextCoordinates; import apex.jorje.data.Location; import apex.jorje.data.Locations; diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexNode.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexNode.java index aaf24299c8..3de1234882 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexNode.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexNode.java @@ -4,8 +4,7 @@ package net.sourceforge.pmd.lang.apex.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.GenericNode; import apex.jorje.semantic.ast.AstNode; @@ -16,7 +15,7 @@ import apex.jorje.semantic.ast.AstNode; * * @param Type of the underlying Jorje node */ -public interface ApexNode extends Node { +public interface ApexNode extends GenericNode> { /** * Accept the visitor. @@ -33,18 +32,6 @@ public interface ApexNode extends Node { @Deprecated T getNode(); - - @Override - NodeStream> children(); - - - @Override - ApexNode getChild(int index); - - - @Override - ApexNode getParent(); - boolean hasRealLoc(); String getDefiningType(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java index dc6496068e..4427e8d128 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java @@ -389,7 +389,7 @@ public interface Node { * * @see NodeStream#of(Node) */ - default NodeStream asStream() { + default NodeStream asStream() { return StreamImpl.singleton(this); } @@ -414,7 +414,7 @@ public interface Node { * * @see NodeStream#descendants() */ - default DescendantNodeStream descendants() { + default DescendantNodeStream descendants() { return StreamImpl.descendants(this); } @@ -427,7 +427,7 @@ public interface Node { * * @see NodeStream#descendantsOrSelf() */ - default DescendantNodeStream descendantsOrSelf() { + default DescendantNodeStream descendantsOrSelf() { return StreamImpl.descendantsOrSelf(this); } @@ -441,7 +441,7 @@ public interface Node { * * @see NodeStream#ancestors() */ - default NodeStream ancestors() { + default NodeStream ancestors() { return StreamImpl.ancestors(this); } @@ -455,7 +455,7 @@ public interface Node { * * @see NodeStream#ancestorsOrSelf() */ - default NodeStream ancestorsOrSelf() { + default NodeStream ancestorsOrSelf() { return StreamImpl.ancestorsOrSelf(this); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNode.java index fedd59c06b..96d6fb9368 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNode.java @@ -10,7 +10,6 @@ import org.apache.commons.lang3.ArrayUtils; import org.checkerframework.checker.nullness.qual.Nullable; import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; import net.sourceforge.pmd.lang.dfa.DataFlowNode; import net.sourceforge.pmd.util.DataMap; import net.sourceforge.pmd.util.DataMap.DataKey; @@ -26,7 +25,7 @@ import net.sourceforge.pmd.util.DataMap.SimpleDataKey; * @param Public interface for nodes of this language (eg JavaNode * in the java module). */ -public abstract class AbstractNode implements Node { +public abstract class AbstractNode> implements GenericNode { private static final Node[] EMPTY_ARRAY = new Node[0]; @@ -49,7 +48,6 @@ public abstract class AbstractNode implements Node { } - @Override public T getParent() { return toPublic(parent); @@ -117,16 +115,6 @@ public abstract class AbstractNode implements Node { } } - - - @Override - @SuppressWarnings("unchecked") - public NodeStream children() { - return (NodeStream) Node.super.children(); - } - - - /** * Sets the index of this node from the perspective of its parent. This * means: this.getParent().getChild(index) == this. diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNodeWithTextCoordinates.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNodeWithTextCoordinates.java index 09784e34c1..81b1f19e28 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNodeWithTextCoordinates.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/AbstractNodeWithTextCoordinates.java @@ -4,12 +4,11 @@ package net.sourceforge.pmd.lang.ast.impl; -import net.sourceforge.pmd.lang.ast.Node; - /** - * Base class for imple + * Base class for implementations that need fields to store text + * coordinates. */ -public abstract class AbstractNodeWithTextCoordinates extends AbstractNode { +public abstract class AbstractNodeWithTextCoordinates> extends AbstractNode { protected int beginLine = -1; protected int endLine = -1; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/GenericNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/GenericNode.java new file mode 100644 index 0000000000..408222ea91 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/GenericNode.java @@ -0,0 +1,51 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ +package net.sourceforge.pmd.lang.ast.impl; + + +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.NodeStream.DescendantNodeStream; +import net.sourceforge.pmd.lang.ast.internal.StreamImpl; + +public interface GenericNode> extends Node { + + @Override + N getChild(int index); + + + @Override + N getParent(); + + + @Override + default NodeStream asStream() { + return StreamImpl.singleton((N) this); + } + + @Override + default N getNthParent(int n) { + return (N) Node.super.getNthParent(n); + } + + @Override + default NodeStream children() { + return (NodeStream) Node.super.children(); + } + + @Override + default DescendantNodeStream descendants() { + return (DescendantNodeStream) Node.super.descendants(); + } + + @Override + default NodeStream ancestorsOrSelf() { + return (NodeStream) Node.super.ancestorsOrSelf(); + } + + @Override + default NodeStream ancestors() { + return (NodeStream) Node.super.ancestors(); + } +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/AbstractJjtreeNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/AbstractJjtreeNode.java index 1efb7b59cc..2ed4860578 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/AbstractJjtreeNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/AbstractJjtreeNode.java @@ -5,9 +5,8 @@ package net.sourceforge.pmd.lang.ast.impl.javacc; import net.sourceforge.pmd.annotation.Experimental; -import net.sourceforge.pmd.lang.ast.impl.AbstractNode; import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.TextAvailableNode; +import net.sourceforge.pmd.lang.ast.impl.AbstractNode; /** * Base class for node produced by JJTree. JJTree specific functionality @@ -18,7 +17,7 @@ import net.sourceforge.pmd.lang.ast.TextAvailableNode; * unforeseeable ways. Don't use it directly, use the node interfaces. */ @Experimental -public abstract class AbstractJjtreeNode extends AbstractNode implements TextAvailableNode { +public abstract class AbstractJjtreeNode> extends AbstractNode implements JjtreeNode { protected final int id; private JavaccToken firstToken; private JavaccToken lastToken; @@ -55,10 +54,12 @@ public abstract class AbstractJjtreeNode extends AbstractNode super.addChild(child, index); } + @Override public JavaccToken getFirstToken() { return firstToken; } + @Override public JavaccToken getLastToken() { return lastToken; } @@ -105,7 +106,6 @@ public abstract class AbstractJjtreeNode extends AbstractNode return this.getFirstToken().getStartInDocument(); } - private int getEndOffset() { return this.getLastToken().getEndInDocument(); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeNode.java new file mode 100644 index 0000000000..1373b2d422 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeNode.java @@ -0,0 +1,18 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.ast.impl.javacc; + +import net.sourceforge.pmd.lang.ast.TextAvailableNode; +import net.sourceforge.pmd.lang.ast.impl.GenericNode; + + +public interface JjtreeNode> extends GenericNode, TextAvailableNode { + + + JavaccToken getFirstToken(); + + JavaccToken getLastToken(); + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaNode.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaNode.java index af856beefd..450f240160 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaNode.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaNode.java @@ -8,9 +8,7 @@ package net.sourceforge.pmd.lang.java.ast; import org.checkerframework.checker.nullness.qual.NonNull; import net.sourceforge.pmd.annotation.InternalApi; -import net.sourceforge.pmd.lang.ast.NodeStream; -import net.sourceforge.pmd.lang.ast.TextAvailableNode; -import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccToken; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; import net.sourceforge.pmd.lang.symboltable.Scope; import net.sourceforge.pmd.lang.symboltable.ScopedNode; @@ -18,7 +16,7 @@ import net.sourceforge.pmd.lang.symboltable.ScopedNode; /** * Root interface for all Nodes of the Java AST. */ -public interface JavaNode extends ScopedNode, TextAvailableNode { +public interface JavaNode extends ScopedNode, JjtreeNode { /** * Calls back the visitor's visit method corresponding to the runtime type of this Node. @@ -69,29 +67,10 @@ public interface JavaNode extends ScopedNode, TextAvailableNode { */ void childrenAccept(SideEffectingVisitor visitor, T data); - - @Override - JavaNode getChild(int index); - - - @Override - JavaNode getParent(); - - - @Override - NodeStream children(); - - @InternalApi @Deprecated void setScope(Scope scope); - - JavaccToken getFirstToken(); - - JavaccToken getLastToken(); - - @Override @NonNull ASTCompilationUnit getRoot(); diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/AbstractEcmascriptNode.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/AbstractEcmascriptNode.java index 3549e232d9..fa1c5b2ef0 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/AbstractEcmascriptNode.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/AbstractEcmascriptNode.java @@ -6,11 +6,11 @@ package net.sourceforge.pmd.lang.ecmascript.ast; import org.mozilla.javascript.ast.AstNode; -import net.sourceforge.pmd.lang.ast.impl.AbstractNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.SourceCodePositioner; +import net.sourceforge.pmd.lang.ast.impl.AbstractNodeWithTextCoordinates; -abstract class AbstractEcmascriptNode extends AbstractNode implements EcmascriptNode { +abstract class AbstractEcmascriptNode extends AbstractNodeWithTextCoordinates> implements EcmascriptNode { protected final T node; diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptNode.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptNode.java index b42a23672d..8af33ba419 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptNode.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptNode.java @@ -6,9 +6,9 @@ package net.sourceforge.pmd.lang.ecmascript.ast; import org.mozilla.javascript.ast.AstNode; -import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.ast.impl.GenericNode; -public interface EcmascriptNode extends Node { +public interface EcmascriptNode extends GenericNode> { /** * Accept the visitor. * diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspNode.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspNode.java index a036186852..8412c2a2de 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspNode.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspNode.java @@ -4,25 +4,13 @@ package net.sourceforge.pmd.lang.jsp.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; -public interface JspNode extends Node { +public interface JspNode extends JjtreeNode { /** * Accept the visitor. */ Object jjtAccept(JspParserVisitor visitor, Object data); - - @Override - JspNode getChild(int index); - - - @Override - JspNode getParent(); - - - @Override - NodeStream children(); } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaNode.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaNode.java index 387bece368..102da32f88 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaNode.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaNode.java @@ -4,14 +4,13 @@ package net.sourceforge.pmd.lang.modelica.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope; /** * Public interface for all Modelica AST nodes. */ -public interface ModelicaNode extends Node { +public interface ModelicaNode extends JjtreeNode { /** * Returns the lexical scope this node is contained in. @@ -26,15 +25,4 @@ public interface ModelicaNode extends Node { ModelicaScope getMostSpecificScope(); Object jjtAccept(ModelicaParserVisitor visitor, Object data); - - @Override - ModelicaNode getParent(); - - - @Override - ModelicaNode getChild(int index); - - - @Override - NodeStream children(); } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLNode.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLNode.java index 74c303f7c5..e9ab2f87ae 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLNode.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLNode.java @@ -4,12 +4,11 @@ package net.sourceforge.pmd.lang.plsql.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; import net.sourceforge.pmd.lang.symboltable.Scope; import net.sourceforge.pmd.lang.symboltable.ScopedNode; -public interface PLSQLNode extends Node, ScopedNode { +public interface PLSQLNode extends ScopedNode, JjtreeNode { /** Accept the visitor. **/ Object jjtAccept(PLSQLParserVisitor visitor, Object data); @@ -19,12 +18,4 @@ public interface PLSQLNode extends Node, ScopedNode { void setScope(Scope scope); - @Override - PLSQLNode getChild(int index); - - @Override - PLSQLNode getParent(); - - @Override - NodeStream children(); } diff --git a/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/AbstractScalaNode.java b/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/AbstractScalaNode.java index cf86e6f16f..224b90876a 100644 --- a/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/AbstractScalaNode.java +++ b/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/AbstractScalaNode.java @@ -5,7 +5,6 @@ package net.sourceforge.pmd.lang.scala.ast; import net.sourceforge.pmd.lang.ast.impl.AbstractNode; -import net.sourceforge.pmd.lang.ast.NodeStream; import scala.meta.Tree; import scala.meta.inputs.Position; @@ -17,7 +16,7 @@ import scala.meta.inputs.Position; * @param * the type of the Scala tree node */ -abstract class AbstractScalaNode extends AbstractNode implements ScalaNode { +abstract class AbstractScalaNode extends AbstractNode> implements ScalaNode { protected final T node; private final Position pos; @@ -33,12 +32,6 @@ abstract class AbstractScalaNode extends AbstractNode implements pos = node.pos(); } - @Override - @SuppressWarnings("unchecked") - public NodeStream> children() { - return (NodeStream>) super.children(); - } - @Override public boolean isImplicit() { return pos.end() - pos.start() == 0; @@ -64,30 +57,6 @@ abstract class AbstractScalaNode extends AbstractNode implements return pos.endColumn(); // no +1 } - @Override - @Deprecated - public void testingOnlySetBeginColumn(int i) { - throw new UnsupportedOperationException(); - } - - @Override - @Deprecated - public void testingOnlySetBeginLine(int i) { - throw new UnsupportedOperationException(); - } - - @Override - @Deprecated - public void testingOnlySetEndColumn(int i) { - throw new UnsupportedOperationException(); - } - - @Override - @Deprecated - public void testingOnlySetEndLine(int i) { - throw new UnsupportedOperationException(); - } - @Override public abstract R accept(ScalaParserVisitor visitor, D data); @@ -97,16 +66,6 @@ abstract class AbstractScalaNode extends AbstractNode implements return node; } - @Override - public ScalaNode getChild(int index) { - return (ScalaNode) super.getChild(index); - } - - @Override - public ScalaNode getParent() { - return (ScalaNode) super.getParent(); - } - @Override public String getXPathNodeName() { return node.productPrefix().replace(".", ""); diff --git a/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaNode.java b/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaNode.java index 7cd0a0c389..2852382aaa 100644 --- a/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaNode.java +++ b/pmd-scala/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaNode.java @@ -4,8 +4,7 @@ package net.sourceforge.pmd.lang.scala.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.GenericNode; import scala.meta.Tree; @@ -16,7 +15,7 @@ import scala.meta.Tree; * @param * The Scala node type that extends Scala's Tree trait */ -public interface ScalaNode extends Node { +public interface ScalaNode extends GenericNode> { /** * Accept a visitor and traverse this node. * @@ -54,16 +53,4 @@ public interface ScalaNode extends Node { // we could filter them out from violations transparently // Apex has the same problem boolean isImplicit(); - - - @Override - ScalaNode getChild(int idx); - - - @Override - ScalaNode getParent(); - - - @Override - NodeStream> children(); } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfNode.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfNode.java index b6ca6ff812..e4ea42ad4e 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfNode.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfNode.java @@ -4,26 +4,13 @@ package net.sourceforge.pmd.lang.vf.ast; -import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.ast.NodeStream; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; -public interface VfNode extends Node { +public interface VfNode extends JjtreeNode { /** * Accept the visitor. */ Object jjtAccept(VfParserVisitor visitor, Object data); - - @Override - VfNode getParent(); - - - @Override - VfNode getChild(int i); - - - - @Override - NodeStream children(); } diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmNode.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmNode.java index f6c7709217..b215b0ef93 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmNode.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmNode.java @@ -4,23 +4,12 @@ package net.sourceforge.pmd.lang.vm.ast; -import net.sourceforge.pmd.lang.ast.NodeStream; -import net.sourceforge.pmd.lang.ast.TextAvailableNode; +import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeNode; -public interface VmNode extends TextAvailableNode { +public interface VmNode extends JjtreeNode { /** * Accept the visitor. */ Object jjtAccept(VmParserVisitor visitor, Object data); - - @Override - VmNode getChild(int index); - - @Override - VmNode getParent(); - - @Override - NodeStream children(); - } diff --git a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/XmlParser.java b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/XmlParser.java index 1303adbb7b..7b3a9a2935 100644 --- a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/XmlParser.java +++ b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/XmlParser.java @@ -8,9 +8,9 @@ import java.io.Reader; import net.sourceforge.pmd.lang.AbstractParser; import net.sourceforge.pmd.lang.ParserOptions; -import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.xml.ast.internal.XmlParserImpl; +import net.sourceforge.pmd.lang.xml.ast.internal.XmlParserImpl.RootXmlNode; /** * Adapter for the XmlParser. @@ -22,7 +22,7 @@ public class XmlParser extends AbstractParser { } @Override - public Node parse(String fileName, Reader source) throws ParseException { + public RootXmlNode parse(String fileName, Reader source) throws ParseException { return new XmlParserImpl((XmlParserOptions) parserOptions).parse(source); } diff --git a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/XmlNode.java b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/XmlNode.java index 451bf39c2a..ade3d69ba8 100644 --- a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/XmlNode.java +++ b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/XmlNode.java @@ -4,13 +4,13 @@ package net.sourceforge.pmd.lang.xml.ast; -import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.ast.impl.GenericNode; /** * This interface represents all XML AST nodes. They are essentially thin * wrappers around the underlying DOM nodes. */ -public interface XmlNode extends Node { +public interface XmlNode extends GenericNode { /** * Provide access to the underlying DOM node. diff --git a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlNodeWrapper.java b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlNodeWrapper.java index 69a369f6cd..9780e02e3e 100644 --- a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlNodeWrapper.java +++ b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlNodeWrapper.java @@ -16,11 +16,11 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.w3c.dom.Text; -import net.sourceforge.pmd.lang.ast.impl.AbstractNode; -import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.xpath.Attribute; import net.sourceforge.pmd.lang.xml.ast.XmlNode; import net.sourceforge.pmd.util.CompoundIterator; +import net.sourceforge.pmd.util.DataMap; +import net.sourceforge.pmd.util.DataMap.DataKey; /** @@ -29,10 +29,15 @@ import net.sourceforge.pmd.util.CompoundIterator; * @author Clément Fournier * @since 6.1.0 */ -class XmlNodeWrapper extends AbstractNode implements XmlNode { +class XmlNodeWrapper implements XmlNode { + int beginLine = -1; + int endLine = -1; + int beginColumn = -1; + int endColumn = -1; + + private DataMap> dataMap; private final XmlParserImpl parser; - private Object userData; private final org.w3c.dom.Node node; @@ -63,7 +68,7 @@ class XmlNodeWrapper extends AbstractNode implements XmlNode { @Override - public Node getChild(int index) { + public XmlNode getChild(int index) { return parser.wrapDomNode(node.getChildNodes().item(index)); } @@ -93,10 +98,12 @@ class XmlNodeWrapper extends AbstractNode implements XmlNode { throw new UnsupportedOperationException(); } - @Override - public Object getUserData() { - return userData; + public DataMap> getUserMap() { + if (dataMap == null) { + dataMap = DataMap.newDataMap(); + } + return dataMap; } @@ -163,6 +170,25 @@ class XmlNodeWrapper extends AbstractNode implements XmlNode { return node; } + @Override + public int getBeginLine() { + return beginLine; + } + + @Override + public int getBeginColumn() { + return beginColumn; + } + + @Override + public int getEndLine() { + return endLine; + } + + @Override + public int getEndColumn() { + return endColumn; + } // package private, open only to DOMLineNumbers diff --git a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java index aaa17c9fd3..ddc433af6f 100644 --- a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java +++ b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java @@ -59,7 +59,7 @@ public class XmlParserImpl { } - public XmlNode parse(Reader reader) { + public RootXmlNode parse(Reader reader) { String xmlData; try { xmlData = IOUtils.toString(reader);