From 1aabc53fa29c65a9e522d15c72dc6bbe5699fb2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 16 Dec 2019 23:58:18 +0100 Subject: [PATCH] Deprecate childrenAccept in all modules --- .../pmd/lang/apex/ast/ApexNode.java | 4 + .../pmd/lang/ast/AbstractNode.java | 12 +- .../pmd/lang/ast/TokenBasedNode.java | 2 +- .../ast/impl/javacc/AbstractJjtreeNode.java | 12 +- .../pmd/lang/java/ast/AbstractJavaNode.java | 2 +- .../pmd/lang/java/ast/JavaNode.java | 12 ++ .../java/ast/JavaParserVisitorAdapter.java | 16 ++- .../pmd/lang/java/rule/AbstractJavaRule.java | 128 +++++++++++++++++- .../lang/ecmascript/ast/EcmascriptNode.java | 4 + .../pmd/lang/jsp/ast/AbstractJspNode.java | 2 +- .../sourceforge/pmd/lang/jsp/ast/JspNode.java | 13 ++ .../lang/jsp/ast/JspParserVisitorAdapter.java | 20 ++- .../pmd/lang/jsp/rule/AbstractJspRule.java | 4 +- .../pmd/lang/plsql/ast/AbstractPLSQLNode.java | 2 +- .../pmd/lang/plsql/ast/PLSQLNode.java | 14 +- .../plsql/ast/PLSQLParserVisitorAdapter.java | 17 ++- .../lang/plsql/rule/AbstractPLSQLRule.java | 6 +- .../sourceforge/pmd/lang/vf/ast/VfNode.java | 12 ++ .../pmd/lang/vm/ast/AbstractVmNode.java | 2 +- .../sourceforge/pmd/lang/vm/ast/VmNode.java | 13 ++ .../lang/vm/ast/VmParserVisitorAdapter.java | 18 ++- .../pmd/lang/vm/rule/AbstractVmRule.java | 4 +- 22 files changed, 296 insertions(+), 23 deletions(-) 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 ee8971d798..fc2c9097d4 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 @@ -17,7 +17,11 @@ public interface ApexNode extends Node { /** * Accept the visitor. * + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(ApexParserVisitor visitor, Object data); /** diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AbstractNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AbstractNode.java index 07cc4bacf4..0401e8505f 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AbstractNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AbstractNode.java @@ -231,9 +231,10 @@ public abstract class AbstractNode implements Node { } /** - * @deprecated This will be removed with 7.0.0 to delegate to the tokens. + * @deprecated This will be removed with 7.0.0 */ @Deprecated + @InternalApi public void testingOnlySetBeginLine(int i) { this.beginLine = i; } @@ -252,9 +253,10 @@ public abstract class AbstractNode implements Node { } /** - * @deprecated This will be removed with 7.0.0 to delegate to the tokens. + * @deprecated This will be removed with 7.0.0 */ @Deprecated + @InternalApi public void testingOnlySetBeginColumn(final int i) { this.beginColumn = i; } @@ -265,9 +267,10 @@ public abstract class AbstractNode implements Node { } /** - * @deprecated This will be removed with 7.0.0 to delegate to the tokens. + * @deprecated This will be removed with 7.0.0 */ @Deprecated + @InternalApi public void testingOnlySetEndLine(final int i) { this.endLine = i; } @@ -278,9 +281,10 @@ public abstract class AbstractNode implements Node { } /** - * @deprecated This will be removed with 7.0.0 to delegate to the tokens. + * @deprecated This will be removed with 7.0.0 */ @Deprecated + @InternalApi public void testingOnlySetEndColumn(final int i) { this.endColumn = i; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/TokenBasedNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/TokenBasedNode.java index b693d63108..a8e814d32c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/TokenBasedNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/TokenBasedNode.java @@ -8,7 +8,7 @@ package net.sourceforge.pmd.lang.ast; * A {@link Node} that can provide access to the underlying * {@linkplain GenericToken tokens} produced by the lexer. */ -public interface TokenBasedNode { +public interface TokenBasedNode extends Node { /** * Returns the first token producing this node. diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/java/ast/impl/javacc/AbstractJjtreeNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/java/ast/impl/javacc/AbstractJjtreeNode.java index 9fa13cc09d..73acc1373c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/java/ast/impl/javacc/AbstractJjtreeNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/java/ast/impl/javacc/AbstractJjtreeNode.java @@ -14,7 +14,7 @@ import net.sourceforge.pmd.lang.ast.TokenBasedNode; * present on the API of {@link Node} and {@link AbstractNode} will be * moved here for 7.0.0. */ -public abstract class AbstractJjtreeNode extends AbstractNode implements TokenBasedNode { +public abstract class AbstractJjtreeNode extends AbstractNode implements TokenBasedNode { public AbstractJjtreeNode(int id) { super(id); @@ -36,4 +36,14 @@ public abstract class AbstractJjtreeNode extends Abstrac public T getLastToken() { return (T) super.jjtGetLastToken(); } + + @Override + public N getChild(int index) { + return (N) super.getChild(index); + } + + @Override + public N getParent() { + return (N) super.getParent(); + } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AbstractJavaNode.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AbstractJavaNode.java index 7af8f77579..10b7920fb0 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AbstractJavaNode.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AbstractJavaNode.java @@ -10,7 +10,7 @@ import net.sourceforge.pmd.lang.symboltable.Scope; @Deprecated @InternalApi -public abstract class AbstractJavaNode extends AbstractJjtreeNode implements JavaNode { +public abstract class AbstractJavaNode extends AbstractJjtreeNode implements JavaNode { protected JavaParser parser; private Scope scope; 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 4ce760a779..7748ab6a58 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 @@ -35,10 +35,22 @@ public interface JavaNode extends ScopedNode, TokenBasedNode { * * @param visitor Visitor to dispatch * @param data Visit data + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(JavaParserVisitor visitor, Object data); + @Override + JavaNode getChild(int index); + + + @Override + JavaNode getParent(); + + @InternalApi @Deprecated void setScope(Scope scope); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParserVisitorAdapter.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParserVisitorAdapter.java index 4f8b181003..3926683f94 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParserVisitorAdapter.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParserVisitorAdapter.java @@ -6,9 +6,23 @@ package net.sourceforge.pmd.lang.java.ast; public class JavaParserVisitorAdapter implements JavaParserVisitor { + /** Initial value when combining values returned by children. */ + protected Object zero() { + return null; + } + + /** Merge two values of type Object, used to combine values returned by children. */ + protected Object combine(Object acc, Object r) { + return r; + } + @Override public Object visit(JavaNode node, Object data) { - return node.childrenAccept(this, data); + Object returnValue = zero(); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + returnValue = combine(returnValue, node.getChild(i).jjtAccept(this, data)); + } + return returnValue; } @Override diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java index c43daded08..9f86feb1a8 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java @@ -10,7 +10,129 @@ import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.JavaLanguageModule; -import net.sourceforge.pmd.lang.java.ast.*; +import net.sourceforge.pmd.lang.java.ast.ASTAdditiveExpression; +import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression; +import net.sourceforge.pmd.lang.java.ast.ASTAndExpression; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotation; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotationMethodDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotationTypeBody; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotationTypeDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTAnnotationTypeMemberDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTArgumentList; +import net.sourceforge.pmd.lang.java.ast.ASTArguments; +import net.sourceforge.pmd.lang.java.ast.ASTArrayDimsAndInits; +import net.sourceforge.pmd.lang.java.ast.ASTArrayInitializer; +import net.sourceforge.pmd.lang.java.ast.ASTAssertStatement; +import net.sourceforge.pmd.lang.java.ast.ASTAssignmentOperator; +import net.sourceforge.pmd.lang.java.ast.ASTBlock; +import net.sourceforge.pmd.lang.java.ast.ASTBlockStatement; +import net.sourceforge.pmd.lang.java.ast.ASTBooleanLiteral; +import net.sourceforge.pmd.lang.java.ast.ASTBreakStatement; +import net.sourceforge.pmd.lang.java.ast.ASTCastExpression; +import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBody; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; +import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; +import net.sourceforge.pmd.lang.java.ast.ASTConditionalAndExpression; +import net.sourceforge.pmd.lang.java.ast.ASTConditionalExpression; +import net.sourceforge.pmd.lang.java.ast.ASTConditionalOrExpression; +import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTContinueStatement; +import net.sourceforge.pmd.lang.java.ast.ASTDefaultValue; +import net.sourceforge.pmd.lang.java.ast.ASTDoStatement; +import net.sourceforge.pmd.lang.java.ast.ASTEmptyStatement; +import net.sourceforge.pmd.lang.java.ast.ASTEnumBody; +import net.sourceforge.pmd.lang.java.ast.ASTEnumConstant; +import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTEqualityExpression; +import net.sourceforge.pmd.lang.java.ast.ASTExclusiveOrExpression; +import net.sourceforge.pmd.lang.java.ast.ASTExplicitConstructorInvocation; +import net.sourceforge.pmd.lang.java.ast.ASTExpression; +import net.sourceforge.pmd.lang.java.ast.ASTExtendsList; +import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTFinallyStatement; +import net.sourceforge.pmd.lang.java.ast.ASTForInit; +import net.sourceforge.pmd.lang.java.ast.ASTForStatement; +import net.sourceforge.pmd.lang.java.ast.ASTForUpdate; +import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter; +import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters; +import net.sourceforge.pmd.lang.java.ast.ASTIfStatement; +import net.sourceforge.pmd.lang.java.ast.ASTImplementsList; +import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTInclusiveOrExpression; +import net.sourceforge.pmd.lang.java.ast.ASTInitializer; +import net.sourceforge.pmd.lang.java.ast.ASTInstanceOfExpression; +import net.sourceforge.pmd.lang.java.ast.ASTLabeledStatement; +import net.sourceforge.pmd.lang.java.ast.ASTLambdaExpression; +import net.sourceforge.pmd.lang.java.ast.ASTLiteral; +import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTMarkerAnnotation; +import net.sourceforge.pmd.lang.java.ast.ASTMemberSelector; +import net.sourceforge.pmd.lang.java.ast.ASTMemberValue; +import net.sourceforge.pmd.lang.java.ast.ASTMemberValueArrayInitializer; +import net.sourceforge.pmd.lang.java.ast.ASTMemberValuePair; +import net.sourceforge.pmd.lang.java.ast.ASTMemberValuePairs; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator; +import net.sourceforge.pmd.lang.java.ast.ASTMethodReference; +import net.sourceforge.pmd.lang.java.ast.ASTModuleDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTModuleDirective; +import net.sourceforge.pmd.lang.java.ast.ASTModuleName; +import net.sourceforge.pmd.lang.java.ast.ASTMultiplicativeExpression; +import net.sourceforge.pmd.lang.java.ast.ASTName; +import net.sourceforge.pmd.lang.java.ast.ASTNameList; +import net.sourceforge.pmd.lang.java.ast.ASTNormalAnnotation; +import net.sourceforge.pmd.lang.java.ast.ASTNullLiteral; +import net.sourceforge.pmd.lang.java.ast.ASTPackageDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTPostfixExpression; +import net.sourceforge.pmd.lang.java.ast.ASTPreDecrementExpression; +import net.sourceforge.pmd.lang.java.ast.ASTPreIncrementExpression; +import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; +import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; +import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; +import net.sourceforge.pmd.lang.java.ast.ASTPrimitiveType; +import net.sourceforge.pmd.lang.java.ast.ASTRSIGNEDSHIFT; +import net.sourceforge.pmd.lang.java.ast.ASTRUNSIGNEDSHIFT; +import net.sourceforge.pmd.lang.java.ast.ASTReferenceType; +import net.sourceforge.pmd.lang.java.ast.ASTRelationalExpression; +import net.sourceforge.pmd.lang.java.ast.ASTResource; +import net.sourceforge.pmd.lang.java.ast.ASTResourceSpecification; +import net.sourceforge.pmd.lang.java.ast.ASTResources; +import net.sourceforge.pmd.lang.java.ast.ASTResultType; +import net.sourceforge.pmd.lang.java.ast.ASTReturnStatement; +import net.sourceforge.pmd.lang.java.ast.ASTShiftExpression; +import net.sourceforge.pmd.lang.java.ast.ASTSingleMemberAnnotation; +import net.sourceforge.pmd.lang.java.ast.ASTStatement; +import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; +import net.sourceforge.pmd.lang.java.ast.ASTStatementExpressionList; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchExpression; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabel; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabeledBlock; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabeledExpression; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchLabeledThrowStatement; +import net.sourceforge.pmd.lang.java.ast.ASTSwitchStatement; +import net.sourceforge.pmd.lang.java.ast.ASTSynchronizedStatement; +import net.sourceforge.pmd.lang.java.ast.ASTThrowStatement; +import net.sourceforge.pmd.lang.java.ast.ASTTryStatement; +import net.sourceforge.pmd.lang.java.ast.ASTType; +import net.sourceforge.pmd.lang.java.ast.ASTTypeArgument; +import net.sourceforge.pmd.lang.java.ast.ASTTypeArguments; +import net.sourceforge.pmd.lang.java.ast.ASTTypeBound; +import net.sourceforge.pmd.lang.java.ast.ASTTypeDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTTypeParameter; +import net.sourceforge.pmd.lang.java.ast.ASTTypeParameters; +import net.sourceforge.pmd.lang.java.ast.ASTUnaryExpression; +import net.sourceforge.pmd.lang.java.ast.ASTUnaryExpressionNotPlusMinus; +import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; +import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; +import net.sourceforge.pmd.lang.java.ast.ASTVariableInitializer; +import net.sourceforge.pmd.lang.java.ast.ASTWhileStatement; +import net.sourceforge.pmd.lang.java.ast.ASTWildcardBounds; +import net.sourceforge.pmd.lang.java.ast.ASTYieldStatement; +import net.sourceforge.pmd.lang.java.ast.JavaNode; +import net.sourceforge.pmd.lang.java.ast.JavaParserVisitor; import net.sourceforge.pmd.lang.rule.AbstractRule; import net.sourceforge.pmd.lang.rule.ImmutableLanguage; @@ -92,7 +214,9 @@ public abstract class AbstractJavaRule extends AbstractRule implements JavaParse // @Override public Object visit(JavaNode node, Object data) { - node.childrenAccept(this, data); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + node.getChild(i).jjtAccept(this, data); + } return null; } 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 cf8ea8c1bb..a4b8668bd0 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 @@ -17,7 +17,11 @@ public interface EcmascriptNode extends Node { /** * Accept the visitor. * + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(EcmascriptParserVisitor visitor, Object data); /** diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/AbstractJspNode.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/AbstractJspNode.java index 7cefac3840..6eaf4d7815 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/AbstractJspNode.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/AbstractJspNode.java @@ -6,7 +6,7 @@ package net.sourceforge.pmd.lang.jsp.ast; import net.sourceforge.pmd.lang.java.ast.impl.javacc.AbstractJjtreeNode; -public class AbstractJspNode extends AbstractJjtreeNode implements JspNode { +public class AbstractJspNode extends AbstractJjtreeNode implements JspNode { protected JspParser parser; 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 6e7441ea92..605e5f35cb 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 @@ -8,13 +8,26 @@ import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.TokenBasedNode; public interface JspNode extends Node, TokenBasedNode { + /** * Accept the visitor. * */ Object jjtAccept(JspParserVisitor visitor, Object data); + /** * Accept the visitor. * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(JspParserVisitor visitor, Object data); + + + @Override + JspNode getChild(int index); + + + @Override + JspNode getParent(); } diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParserVisitorAdapter.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParserVisitorAdapter.java index a167ecd04a..cd2f3dccd8 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParserVisitorAdapter.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParserVisitorAdapter.java @@ -6,12 +6,26 @@ package net.sourceforge.pmd.lang.jsp.ast; public class JspParserVisitorAdapter implements JspParserVisitor { - @Override - public Object visit(JspNode node, Object data) { - node.childrenAccept(this, data); + + /** Initial value when combining values returned by children. */ + protected Object zero() { return null; } + /** Merge two values of type R, used to combine values returned by children. */ + protected Object combine(Object acc, Object r) { + return r; + } + + @Override + public Object visit(final JspNode node, final Object data) { + Object returnValue = zero(); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + returnValue = combine(returnValue, node.getChild(i).jjtAccept(this, data)); + } + return returnValue; + } + @Override public Object visit(ASTCompilationUnit node, Object data) { return visit((JspNode) node, data); diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java index 350cc3313a..9d0b91fd93 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java @@ -68,7 +68,9 @@ public abstract class AbstractJspRule extends AbstractRule implements JspParserV @Override public Object visit(JspNode node, Object data) { - node.childrenAccept(this, data); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + node.getChild(i).jjtAccept(this, data); + } return null; } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/AbstractPLSQLNode.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/AbstractPLSQLNode.java index 310ec78518..86592f9d34 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/AbstractPLSQLNode.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/AbstractPLSQLNode.java @@ -10,7 +10,7 @@ package net.sourceforge.pmd.lang.plsql.ast; import net.sourceforge.pmd.lang.java.ast.impl.javacc.AbstractJjtreeNode; import net.sourceforge.pmd.lang.symboltable.Scope; -public abstract class AbstractPLSQLNode extends AbstractJjtreeNode implements PLSQLNode { +public abstract class AbstractPLSQLNode extends AbstractJjtreeNode implements PLSQLNode { protected Object value; protected PLSQLParser parser; protected Scope scope; 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 c31a01f885..1ebe835f26 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 @@ -14,7 +14,14 @@ public interface PLSQLNode extends Node, ScopedNode, TokenBasedNode { /** Accept the visitor. **/ Object jjtAccept(PLSQLParserVisitor visitor, Object data); - /** Accept the visitor. **/ + + /** + * Accept the visitor. + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node + */ + @Deprecated Object childrenAccept(PLSQLParserVisitor visitor, Object data); @Override @@ -22,4 +29,9 @@ public interface PLSQLNode extends Node, ScopedNode, TokenBasedNode { void setScope(Scope scope); + @Override + PLSQLNode getChild(int index); + + @Override + PLSQLNode getParent(); } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java index c9631b54b0..a349032f15 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java @@ -6,9 +6,24 @@ package net.sourceforge.pmd.lang.plsql.ast; public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor { + + /** Initial value when combining values returned by children. */ + protected Object zero() { + return null; + } + + /** Merge two values of type R, used to combine values returned by children. */ + protected Object combine(Object acc, Object r) { + return r; + } + @Override public Object visit(PLSQLNode node, Object data) { - return node.childrenAccept(this, data); + Object returnValue = zero(); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + returnValue = combine(returnValue, node.getChild(i).jjtAccept(this, data)); + } + return returnValue; } @Override diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java index bf8116a9e9..4b8eacab36 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java @@ -12,6 +12,8 @@ import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.plsql.PLSQLLanguageModule; import net.sourceforge.pmd.lang.plsql.ast.*; +import net.sourceforge.pmd.lang.plsql.ast.PLSQLNode; +import net.sourceforge.pmd.lang.plsql.ast.PLSQLParserVisitor; import net.sourceforge.pmd.lang.rule.AbstractRule; import net.sourceforge.pmd.lang.rule.ImmutableLanguage; @@ -94,7 +96,9 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar */ @Override public Object visit(PLSQLNode node, Object data) { - node.childrenAccept(this, data); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + node.getChild(i).jjtAccept(this, data); + } return null; } 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 c24b4406ab..e8ae5ce81f 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 @@ -17,6 +17,18 @@ public interface VfNode extends Node, TokenBasedNode { /** * Accept the visitor. * + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(VfParserVisitor visitor, Object data); + + + @Override + VfNode getParent(); + + + @Override + VfNode jjtGetChild(int i); } diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/AbstractVmNode.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/AbstractVmNode.java index 721f297630..a8138cbf32 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/AbstractVmNode.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/AbstractVmNode.java @@ -31,7 +31,7 @@ import net.sourceforge.pmd.lang.java.ast.impl.javacc.AbstractJjtreeNode; /** * */ -public class AbstractVmNode extends AbstractJjtreeNode implements VmNode { +public class AbstractVmNode extends AbstractJjtreeNode implements VmNode { /** */ // TODO - It seems that this field is only valid when parsing, and should 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 5e36ce749b..0d7750a80e 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 @@ -13,9 +13,22 @@ public interface VmNode extends Node, TokenBasedNode { */ Object jjtAccept(VmParserVisitor visitor, Object data); + /** * Accept the visitor. * + * + * @deprecated This method is not useful, the logic for combining + * children values should be present on the visitor, not the node */ + @Deprecated Object childrenAccept(VmParserVisitor visitor, Object data); + + @Override + VmNode getChild(int index); + + + @Override + VmNode getParent(); + } diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParserVisitorAdapter.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParserVisitorAdapter.java index 6a0d3678d0..047e9368dd 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParserVisitorAdapter.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParserVisitorAdapter.java @@ -3,10 +3,24 @@ package net.sourceforge.pmd.lang.vm.ast; public class VmParserVisitorAdapter implements VmParserVisitor { + + /** Initial value when combining values returned by children. */ + protected Object zero() { + return null; + } + + /** Merge two values of type R, used to combine values returned by children. */ + protected Object combine(Object acc, Object r) { + return r; + } + @Override public Object visit(final VmNode node, final Object data) { - node.childrenAccept(this, data); - return null; + Object returnValue = zero(); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + returnValue = combine(returnValue, node.getChild(i).jjtAccept(this, data)); + } + return returnValue; } @Override diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java index 2758a94509..bb3e27026d 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java @@ -82,7 +82,9 @@ public abstract class AbstractVmRule extends AbstractRule implements VmParserVis @Override public Object visit(final VmNode node, final Object data) { - node.childrenAccept(this, data); + for (int i = 0; i < node.jjtGetNumChildren(); ++i) { + node.getChild(i).jjtAccept(this, data); + } return null; }