View Javadoc

    1   /*
    2    * SingularField.java
    3    *
    4    * Created on April 17, 2005, 9:49 PM
    5    */
    6   package net.sourceforge.pmd.rules;
    7
    8   import net.sourceforge.pmd.AbstractRule;
    9   import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
    10  import net.sourceforge.pmd.ast.ASTFieldDeclaration;
    11  import net.sourceforge.pmd.ast.ASTInitializer;
    12  import net.sourceforge.pmd.ast.ASTMethodDeclaration;
    13  import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
    14  import net.sourceforge.pmd.ast.SimpleNode;
    15  import net.sourceforge.pmd.symboltable.NameOccurrence;
    16
    17  import java.util.List;
    18
    19  /***
    20   * @author Eric Olander
    21   */
    22  public class SingularField extends AbstractRule {
    23
    24      public Object visit(ASTFieldDeclaration node, Object data) {
    25          if (node.isPrivate() && !node.isStatic()) {
    26              List list = node.findChildrenOfType(ASTVariableDeclaratorId.class);
    27              ASTVariableDeclaratorId declaration = (ASTVariableDeclaratorId) list.get(0);
    28              List usages = declaration.getUsages();
    29              SimpleNode decl = null;
    30              boolean violation = true;
    31              for (int ix = 0; ix < usages.size(); ix++) {
    32                  NameOccurrence no = (NameOccurrence) usages.get(ix);
    33                  SimpleNode location = no.getLocation();
    34
    35                  SimpleNode method = (SimpleNode) location.getFirstParentOfType(ASTMethodDeclaration.class);
    36                  if (method == null) {
    37                      method = (SimpleNode) location.getFirstParentOfType(ASTConstructorDeclaration.class);
    38                      if (method == null) {
    39                      	method = (SimpleNode) location.getFirstParentOfType(ASTInitializer.class);
    40                      	if (method == null) {
    41                      		continue;
    42                      	}
    43                      }
    44                  }
    45
    46                  if (decl == null) {
    47                      decl = method;
    48                      continue;
    49                  } else if (decl != method) {
    50
    51                      violation = false;
    52                  }
    53              }
    54
    55              if (violation && !usages.isEmpty()) {
    56                  addViolation(data, node, new Object[] { declaration.getImage() });
    57              }
    58          }
    59          return data;
    60      }
    61  }