From e6ddfb9af38a51929bdbd09b8919368422bb4a27 Mon Sep 17 00:00:00 2001 From: Kristian Scheibe Date: Sat, 8 Dec 2018 16:16:25 +0100 Subject: [PATCH] LocalVariableCouldBeFinal: Added property to allow ignoring variables declared in a for-each statement. --- .../codestyle/LocalVariableCouldBeFinalRule.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/LocalVariableCouldBeFinalRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/LocalVariableCouldBeFinalRule.java index 7bf3bb424a..02678cf884 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/LocalVariableCouldBeFinalRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/LocalVariableCouldBeFinalRule.java @@ -4,22 +4,36 @@ package net.sourceforge.pmd.lang.java.rule.codestyle; +import static net.sourceforge.pmd.properties.PropertyFactory.booleanProperty; + import java.util.List; import java.util.Map; +import net.sourceforge.pmd.lang.java.ast.ASTForStatement; import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration; import net.sourceforge.pmd.lang.java.rule.performance.AbstractOptimizationRule; import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration; import net.sourceforge.pmd.lang.symboltable.NameOccurrence; import net.sourceforge.pmd.lang.symboltable.Scope; +import net.sourceforge.pmd.properties.PropertyDescriptor; public class LocalVariableCouldBeFinalRule extends AbstractOptimizationRule { + private static final PropertyDescriptor IGNORE_FOR_EACH = + booleanProperty("ignoreForEachDecl").defaultValue(false).desc("Ignore non-final loop variables in a for-each statement.").build(); + + public LocalVariableCouldBeFinalRule() { + definePropertyDescriptor(IGNORE_FOR_EACH); + } + @Override public Object visit(ASTLocalVariableDeclaration node, Object data) { if (node.isFinal()) { return data; } + if (getProperty(IGNORE_FOR_EACH) && node.jjtGetParent() instanceof ASTForStatement) { + return data; + } Scope s = node.getScope(); Map> decls = s.getDeclarations(VariableNameDeclaration.class); for (Map.Entry> entry : decls.entrySet()) {