This commit is contained in:
Clément Fournier
2019-12-17 17:43:17 +01:00
parent 86b274c681
commit 627e258458
11 changed files with 46 additions and 187 deletions
+3
View File
@@ -77,6 +77,9 @@ You can identify them with the `@InternalApi` annotation. You'll also get a depr
{% jdoc !!java::lang.java.ast.ASTClassOrInterfaceDeclaration#getImage() %}, and
{% jdoc !!java::lang.java.ast.ASTEnumDeclaration#getImage() %}.
* Many methods on the {% jdoc core::lang.ast.Node %} interface
and {% jdoc core::lang.ast.AbstractNode %} base class. See their javadoc for details.
### External Contributions
@@ -1,75 +0,0 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.ast.impl;
import net.sourceforge.pmd.annotation.Experimental;
import net.sourceforge.pmd.lang.ast.Node;
/**
* Base class for tree visitors that take one parameter, and return a
* value.
*
* <p>Non-generic subclasses extend only the raw type of this class.
* This is to avoid source-level incompatibilities when generifying
* those classes. For example, For now {@code JavaParserVisitor <: BaseGenericVisitor},
* where the {@code AbstractVisitorAdapter} is a raw type. For 7.0.0,
* this relation will become {@code JavaParserVisitor<R, P> <: BaseGenericVisitor<JavaNode, R, P>}.
* Because {@code JavaParserVisitor} used to extend the raw type, the
* relation {@code JavaParserVisitor <: BaseGenericVisitor}, where
* now both are raw types, will still hold. On the other hand, if we today
* make {@code JavaParserVisitor} extend {@code BaseGenericVisitor<JavaNode, Object, Object>},
* then that relation will break in 7.0.0, as {@code JavaParserVisitor}
* as a raw type is not convertible to {@code BaseGenericVisitor<JavaNode, Object, Object>}
* anymore, only to the other raw type {@code BaseGenericVisitor}.
*
* @param <N> Type of node this visitor accepts
* @param <P> Type of parameter for the visitor
* @param <R> Return type of the visit methods
*/
@Experimental
public abstract class BaseGenericVisitor<N extends Node, R, P> {
/**
* Initial value when combining values returned by children.
* Note that non-generic subclasses return {@code data} today,
* which is only valid if {@code R = P}. In 7.0.0 this will
* be changed to return null.
*
* @param parent Parent node
* @param data Value of the parameter for the parent
*/
protected R zero(N parent, P data) {
return null;
}
/**
* Merge two values of type Object, used to combine values returned by children.
* By default returns the [newest] value.
*
* @param acc Accumulated value for the children preceding the current one
* @param newest Newest value to combine with the accumulator
* @param parent Parent node
* @param data Value of the parameter for the parent
* @param idx Index of the child in the parent, for which [newest] is the corresponding value
*/
protected R combine(R acc, R newest, N parent, P data, int idx) {
return newest;
}
/**
* Make the node accept this visitor with parameter [data].
*/
protected abstract R visitChildAt(N node, int idx, P data);
public R visit(N node, P data) {
R returnValue = zero(node, data);
for (int i = 0; i < node.getNumChildren(); ++i) {
returnValue = combine(returnValue, visitChildAt(node, i, data), node, data, i);
}
return returnValue;
}
}
@@ -4,6 +4,7 @@
package net.sourceforge.pmd.lang.java.ast.impl.javacc;
import net.sourceforge.pmd.annotation.Experimental;
import net.sourceforge.pmd.lang.ast.AbstractNode;
import net.sourceforge.pmd.lang.ast.GenericToken;
import net.sourceforge.pmd.lang.ast.Node;
@@ -13,7 +14,11 @@ import net.sourceforge.pmd.lang.ast.TokenBasedNode;
* Base class for node produced by JJTree. JJTree specific functionality
* present on the API of {@link Node} and {@link AbstractNode} will be
* moved here for 7.0.0.
*
* <p>This is experimental because it's expected to change for 7.0.0 in
* unforeseeable ways. Don't use it directly, use the node interfaces.
*/
@Experimental
public abstract class AbstractJjtreeNode<N extends Node, T extends GenericToken> extends AbstractNode implements TokenBasedNode<T> {
public AbstractJjtreeNode(int id) {
@@ -4,25 +4,11 @@
package net.sourceforge.pmd.lang.java.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class JavaParserVisitorAdapter extends BaseGenericVisitor implements JavaParserVisitor {
public class JavaParserVisitorAdapter implements JavaParserVisitor {
@Override
protected Object zero(Node parent, Object data) {
return data;
}
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((JavaNode) node).getChild(idx).jjtAccept(this, data);
}
@Override
@SuppressWarnings("unchecked")
public Object visit(JavaNode node, Object data) {
return super.visit(node, data);
return node.childrenAccept(this, data);
}
@Override
@@ -4,25 +4,12 @@
package net.sourceforge.pmd.lang.jsp.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class JspParserVisitorAdapter extends BaseGenericVisitor implements JspParserVisitor {
public class JspParserVisitorAdapter implements JspParserVisitor {
@Override
protected Object zero(Node parent, Object data) {
return data;
}
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((JspNode) node).getChild(idx).jjtAccept(this, data);
}
@Override
@SuppressWarnings("unchecked")
public Object visit(JspNode node, Object data) {
return super.visit(node, data);
node.childrenAccept(this, data);
return null;
}
@Override
@@ -4,7 +4,6 @@
package net.sourceforge.pmd.lang.modelica.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.javacc.AbstractJjtreeNode;
import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope;
@@ -17,7 +16,7 @@ import net.sourceforge.pmd.lang.modelica.resolver.ModelicaScope;
*
* @see ModelicaNode for public API.
*/
abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode, Token> implements Node, ModelicaNode {
abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode, Token> implements ModelicaNode {
private ModelicaParser parser;
private ModelicaScope ownScope;
@@ -38,16 +37,6 @@ abstract class AbstractModelicaNode extends AbstractJjtreeNode<ModelicaNode, Tok
return getClass().getSimpleName().substring(3);
}
@Override
public ModelicaNode jjtGetParent() {
return (ModelicaNode) super.jjtGetParent();
}
@Override
public ModelicaNode jjtGetChild(int index) {
return (ModelicaNode) super.jjtGetChild(index);
}
@Override
public void jjtOpen() {
if (beginLine == -1 && parser.token.next != null) {
@@ -4,19 +4,12 @@
package net.sourceforge.pmd.lang.modelica.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class ModelicaParserVisitorAdapter extends BaseGenericVisitor implements ModelicaParserVisitor {
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((ModelicaNode) node).getChild(idx).jjtAccept(this, data);
}
@SuppressWarnings("unchecked")
public class ModelicaParserVisitorAdapter implements ModelicaParserVisitor {
public Object visit(ModelicaNode node, Object data) {
return super.visit(node, data);
for (int i = 0; i < node.getNumChildren(); ++i) {
node.getChild(i).jjtAccept(this, data);
}
return data;
}
@Override
@@ -4,25 +4,11 @@
package net.sourceforge.pmd.lang.plsql.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class PLSQLParserVisitorAdapter extends BaseGenericVisitor implements PLSQLParserVisitor {
public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor {
@Override
protected Object zero(Node parent, Object data) {
return data;
}
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((PLSQLNode) node).getChild(idx).jjtAccept(this, data);
}
@Override
@SuppressWarnings("unchecked")
public Object visit(PLSQLNode node, Object data) {
return super.visit(node, data);
return node.childrenAccept(this, data);
}
@Override
@@ -4,8 +4,6 @@
package net.sourceforge.pmd.lang.scala.ast;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
import scala.meta.Case;
import scala.meta.Ctor;
import scala.meta.Decl;
@@ -35,11 +33,25 @@ import scala.meta.Type;
* @param <R>
* The type of the returned data
*/
public class ScalaParserVisitorAdapter<D, R> extends BaseGenericVisitor<ScalaNode<?>, R, D> implements ScalaParserVisitor<D, R> {
public class ScalaParserVisitorAdapter<D, R> implements ScalaParserVisitor<D, R> {
/** Initial value when combining values returned by children. */
protected R zero() {
return null;
}
/** Merge two values of type R, used to combine values returned by children. */
protected R combine(R acc, R r) {
return r;
}
@Override
protected R visitChildAt(ScalaNode<?> node, int idx, D data) {
return node.getChild(idx).accept(this, data);
public R visit(ScalaNode<?> node, D data) {
R returnValue = zero();
for (int i = 0; i < node.jjtGetNumChildren(); ++i) {
returnValue = combine(returnValue, node.jjtGetChild(i).accept(this, data));
}
return returnValue;
}
@Override
@@ -4,28 +4,14 @@
package net.sourceforge.pmd.lang.vf.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class VfParserVisitorAdapter extends BaseGenericVisitor implements VfParserVisitor {
public class VfParserVisitorAdapter implements VfParserVisitor {
@Override
protected Object zero(Node parent, Object data) {
public Object visit(VfNode node, Object data) {
node.childrenAccept(this, data);
return data;
}
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((VfNode) node).getChild(idx).jjtAccept(this, data);
}
@Override
@SuppressWarnings("unchecked")
public Object visit(VfNode node, Object data) {
return super.visit(node, data);
}
@Override
public Object visit(ASTCompilationUnit node, Object data) {
return visit((VfNode) node, data);
@@ -1,25 +1,12 @@
package net.sourceforge.pmd.lang.vm.ast;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.impl.BaseGenericVisitor;
public class VmParserVisitorAdapter extends BaseGenericVisitor implements VmParserVisitor {
public class VmParserVisitorAdapter implements VmParserVisitor {
@Override
protected Object zero(Node parent, Object data) {
return data;
}
@Override
protected Object visitChildAt(Node node, int idx, Object data) {
return ((VmNode) node).getChild(idx).jjtAccept(this, data);
}
@Override
@SuppressWarnings("unchecked")
public Object visit(VmNode node, Object data) {
return super.visit(node, data);
public Object visit(final VmNode node, final Object data) {
node.childrenAccept(this, data);
return null;
}
@Override