Clover coverage report - PMD - 3.3
Coverage timestamp: Thu Sep 15 2005 17:59:57 EDT
file stats: LOC: 59   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    *
 23    * @author Eric Olander
 24    */
 25    public class AssignmentToNonFinalStatic extends AbstractRule {
 26   
 27  2 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
 28  2 Map vars = node.getScope().getVariableDeclarations();
 29  2 for (Iterator i = vars.keySet().iterator(); i.hasNext();) {
 30  2 VariableNameDeclaration decl = (VariableNameDeclaration) i.next();
 31  2 if (!decl.getAccessNodeParent().isStatic() || decl.getAccessNodeParent().isFinal()) {
 32  1 continue;
 33    }
 34   
 35  1 if (initializedInConstructor((List)vars.get(decl))) {
 36  1 addViolation(data, decl.getNode(), decl.getImage());
 37    }
 38    }
 39  2 return super.visit(node, data);
 40    }
 41   
 42  1 private boolean initializedInConstructor(List usages) {
 43  1 boolean initInConstructor = false;
 44   
 45  1 for (Iterator j = usages.iterator(); j.hasNext();) {
 46  1 NameOccurrence occ = (NameOccurrence)j.next();
 47  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.
 48  1 SimpleNode node = occ.getLocation();
 49  1 SimpleNode constructor = (SimpleNode)node.getFirstParentOfType(ASTConstructorDeclaration.class);
 50  1 if (constructor != null) {
 51  1 initInConstructor = true;
 52    }
 53    }
 54    }
 55   
 56  1 return initInConstructor;
 57    }
 58   
 59    }