View Javadoc

1   package net.sourceforge.pmd.rules.design;
2   
3   import net.sourceforge.pmd.AbstractRule;
4   import net.sourceforge.pmd.ast.ASTLiteral;
5   import net.sourceforge.pmd.ast.ASTName;
6   import net.sourceforge.pmd.ast.ASTPrimaryExpression;
7   import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
8   import net.sourceforge.pmd.ast.ASTPrimarySuffix;
9   
10  import java.util.List;
11  
12  public class PositionLiteralsFirstInComparisons extends AbstractRule {
13  
14      public Object visit(ASTPrimaryExpression exp, Object data) {
15          // the first prefix ends with a '.equals'
16          if (exp.jjtGetNumChildren() < 2 ||  !(exp.jjtGetChild(0) instanceof ASTPrimaryPrefix)) {
17              return data;
18          }
19          ASTPrimaryPrefix prefix = (ASTPrimaryPrefix)exp.jjtGetChild(0);
20          if (prefix.jjtGetNumChildren() != 1 || !(prefix.jjtGetChild(0) instanceof ASTName)) {
21              return data;
22          }
23          ASTName name = (ASTName)prefix.jjtGetChild(0);
24          if (name.getImage() == null || !name.getImage().endsWith(".equals")) {
25              return data;
26          }
27  
28          // second child is suffix that has a Literal child
29          if (!(exp.jjtGetChild(1) instanceof ASTPrimarySuffix)) {
30              return data;
31          }
32          ASTPrimarySuffix suffix = (ASTPrimarySuffix)exp.jjtGetChild(1);
33          List literals = suffix.findChildrenOfType(ASTLiteral.class);
34          if (literals.isEmpty()) {
35              return data;
36          }
37  
38          addViolation(data, exp);
39  
40          return data;
41      }
42  }