Clover coverage report - PMD - 3.7
Coverage timestamp: Wed May 31 2006 09:25:59 EDT
file stats: LOC: 58   Methods: 2
NCLOC: 39   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
AssignmentToNonFinalStatic.java 75% 100% 100% 90.3%
coverage coverage
 1    /*
 2    * AssignmentToNonFinalStaticRule.java
 3    *
 4    * Created on October 24, 2004, 8:56 AM
 5    */
 6   
 7    package net.sourceforge.pmd.rules.design;
 8   
 9    import net.sourceforge.pmd.AbstractRule;
 10    import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
 11    import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
 12    import net.sourceforge.pmd.ast.SimpleNode;
 13    import net.sourceforge.pmd.symboltable.NameOccurrence;
 14    import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
 15   
 16    import java.util.Iterator;
 17    import java.util.List;
 18    import java.util.Map;
 19   
 20   
 21    /**
 22    * @author Eric Olander
 23    */
 24    public class AssignmentToNonFinalStatic extends AbstractRule {
 25   
 26  2 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
 27  2 Map vars = node.getScope().getVariableDeclarations();
 28  2 for (Iterator i = vars.keySet().iterator(); i.hasNext();) {
 29  2 VariableNameDeclaration decl = (VariableNameDeclaration) i.next();
 30  2 if (!decl.getAccessNodeParent().isStatic() || decl.getAccessNodeParent().isFinal()) {
 31  1 continue;
 32    }
 33   
 34  1 if (initializedInConstructor((List) vars.get(decl))) {
 35  1 addViolation(data, decl.getNode(), decl.getImage());
 36    }
 37    }
 38  2 return super.visit(node, data);
 39    }
 40   
 41  1 private boolean initializedInConstructor(List usages) {
 42  1 boolean initInConstructor = false;
 43   
 44  1 for (Iterator j = usages.iterator(); j.hasNext();) {
 45  1 NameOccurrence occ = (NameOccurrence) j.next();
 46  1 if (occ.isOnLeftHandSide()) { // specifically omitting prefix and postfix operators as there are legitimate usages of these with static fields, e.g. typesafe enum pattern.
 47  1 SimpleNode node = occ.getLocation();
 48  1 SimpleNode constructor = (SimpleNode) node.getFirstParentOfType(ASTConstructorDeclaration.class);
 49  1 if (constructor != null) {
 50  1 initInConstructor = true;
 51    }
 52    }
 53    }
 54   
 55  1 return initInConstructor;
 56    }
 57   
 58    }