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 df223b717b..5dbe00176e 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 @@ -357,13 +357,18 @@ public abstract class AbstractNode implements Node { return list; } - // TODO : Add to Node interface in 7.0.0 + @Override public List findDescendantsOfType(final Class targetType, final boolean crossBoundaries) { final List list = new ArrayList<>(); findDescendantsOfType(this, targetType, list, crossBoundaries); return list; } + /** + * @deprecated Use {@link #findDescendantsOfType(Class, boolean)} instead, which + * returns a result list. + */ + @Deprecated @Override public void findDescendantsOfType(final Class targetType, final List results, final boolean crossBoundaries) { @@ -373,8 +378,7 @@ public abstract class AbstractNode implements Node { private static void findDescendantsOfType(final Node node, final Class targetType, final List results, final boolean crossFindBoundaries) { - for (int i = 0; i < node.getNumChildren(); i++) { - final Node child = node.getChild(i); + for (Node child : node.children()) { if (targetType.isAssignableFrom(child.getClass())) { results.add(targetType.cast(child)); } @@ -388,8 +392,7 @@ public abstract class AbstractNode implements Node { @Override public List findChildrenOfType(final Class targetType) { final List list = new ArrayList<>(); - for (int i = 0; i < getNumChildren(); i++) { - final Node child = getChild(i); + for (Node child : children()) { if (targetType.isInstance(child)) { list.add(targetType.cast(child)); } @@ -443,9 +446,7 @@ public abstract class AbstractNode implements Node { @Override public T getFirstChildOfType(final Class childType) { - int n = getNumChildren(); - for (int i = 0; i < n; i++) { - final Node child = getChild(i); + for (Node child : children()) { if (childType.isInstance(child)) { return childType.cast(child); } @@ -454,9 +455,7 @@ public abstract class AbstractNode implements Node { } private static T getFirstDescendantOfType(final Class descendantType, final Node node) { - final int n = node.getNumChildren(); - for (int i = 0; i < n; i++) { - final Node n1 = node.getChild(i); + for (Node n1 : node.children()) { if (descendantType.isAssignableFrom(n1.getClass())) { return descendantType.cast(n1); } 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 e1571e8a5f..e5222c8f61 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 @@ -295,9 +295,25 @@ public interface Node { * @param crossFindBoundaries * if false, recursion stops for nodes for which * {@link #isFindBoundary()} is true + * @deprecated Use {@link #findDescendantsOfType(Class, boolean)} instead, which + * returns a result list. */ + @Deprecated void findDescendantsOfType(Class targetType, List results, boolean crossFindBoundaries); + /** + * Traverses down the tree to find all the descendant instances of type + * descendantType. + * + * @param targetType + * class which you want to find. + * @param crossFindBoundaries + * if false, recursion stops for nodes for which + * {@link #isFindBoundary()} is true + * @return List of all matching descendants + */ + List findDescendantsOfType(Class targetType, boolean crossFindBoundaries); + /** * Traverses the children to find the first instance of type childType. * diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/AbstractNodeTransversalTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/AbstractNodeTransversalTest.java index d8023acf2d..50dbf99da1 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/AbstractNodeTransversalTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/AbstractNodeTransversalTest.java @@ -8,7 +8,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import java.util.ArrayList; import java.util.List; import org.junit.Before; @@ -63,8 +62,7 @@ public class AbstractNodeTransversalTest { public void testSearchIgnoringBoundary() { addChild(rootNode, addChild(newDummyNode(true), newDummyNode(false))); - List descendantsOfType = new ArrayList<>(); - rootNode.findDescendantsOfType(DummyNode.class, descendantsOfType, true); + List descendantsOfType = rootNode.findDescendantsOfType(DummyNode.class, true); assertEquals(2, descendantsOfType.size()); assertTrue(descendantsOfType.get(0).isFindBoundary()); assertFalse(descendantsOfType.get(1).isFindBoundary()); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/PreserveStackTraceRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/PreserveStackTraceRule.java index 374f22c8ec..dfe9c6c7ba 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/PreserveStackTraceRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/PreserveStackTraceRule.java @@ -4,7 +4,6 @@ package net.sourceforge.pmd.lang.java.rule.bestpractices; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -140,9 +139,7 @@ public class PreserveStackTraceRule extends AbstractJavaRule { private boolean checkForTargetUsage(String target, Node baseNode) { boolean match = false; if (target != null && baseNode != null) { - // TODO : use Node.findDescendantsOfType(ASTName.class, true) on 7.0.0 - List nameNodes = new ArrayList<>(); - baseNode.findDescendantsOfType(ASTName.class, nameNodes, true); + List nameNodes = baseNode.findDescendantsOfType(ASTName.class, true); for (ASTName nameNode : nameNodes) { if (target.equals(nameNode.getImage())) { boolean isPartOfStringConcatenation = isStringConcat(nameNode, baseNode); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java index 20b9f2ad44..bca558c9d0 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CloseResourceRule.java @@ -387,8 +387,7 @@ public class CloseResourceRule extends AbstractJavaRule { break; } - List exprs = new ArrayList<>(); - finallyBody.findDescendantsOfType(ASTStatementExpression.class, exprs, true); + List exprs = finallyBody.findDescendantsOfType(ASTStatementExpression.class, true); for (ASTStatementExpression stmt : exprs) { ASTPrimaryExpression expr = stmt.getFirstChildOfType(ASTPrimaryExpression.class); if (expr != null) { @@ -430,8 +429,7 @@ public class CloseResourceRule extends AbstractJavaRule { // in the other class since there is no way to // really check it. if (!closed) { - List suffixes = new ArrayList<>(); - expr.findDescendantsOfType(ASTPrimarySuffix.class, suffixes, true); + List suffixes = expr.findDescendantsOfType(ASTPrimarySuffix.class, true); for (ASTPrimarySuffix oSuffix : suffixes) { String suff = oSuffix.getImage(); if (closeTargets.contains(suff)) { @@ -465,8 +463,7 @@ public class CloseResourceRule extends AbstractJavaRule { // See if the variable is returned by the method, which means the // method is a utility for creating the db resource, which means of // course it can't be closed by the method, so it isn't an error. - List returns = new ArrayList<>(); - top.findDescendantsOfType(ASTReturnStatement.class, returns, true); + List returns = top.findDescendantsOfType(ASTReturnStatement.class, true); for (ASTReturnStatement returnStatement : returns) { ASTName name = returnStatement.getFirstDescendantOfType(ASTName.class); if (name != null && name.getImage().equals(variableToClose)) { @@ -491,8 +488,7 @@ public class CloseResourceRule extends AbstractJavaRule { } private boolean variableIsPassedToMethod(ASTPrimaryExpression expr, String variable) { - List methodParams = new ArrayList<>(); - expr.findDescendantsOfType(ASTName.class, methodParams, true); + List methodParams = expr.findDescendantsOfType(ASTName.class, true); for (ASTName pName : methodParams) { String paramName = pName.getImage(); // also check if we've got the a parameter (i.e if it's an argument diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/ConstructorCallsOverridableMethodRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/ConstructorCallsOverridableMethodRule.java index 47feec6da9..b5c7d59ea8 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/ConstructorCallsOverridableMethodRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/ConstructorCallsOverridableMethodRule.java @@ -949,8 +949,8 @@ public final class ConstructorCallsOverridableMethodRule extends AbstractJavaRul * Adds all methods called on this instance from within this Node. */ private static void addCalledMethodsOfNode(Node node, List calledMethods, String className) { - List expressions = new ArrayList<>(); - node.findDescendantsOfType(ASTPrimaryExpression.class, expressions, !(node instanceof AccessNode)); + List expressions = node.findDescendantsOfType(ASTPrimaryExpression.class, + !(node instanceof AccessNode)); addCalledMethodsOfNodeImpl(expressions, calledMethods, className); }