View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.rules.design;
5   
6   import net.sourceforge.pmd.AbstractRule;
7   import net.sourceforge.pmd.RuleContext;
8   import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
9   import net.sourceforge.pmd.ast.ASTMethodDeclaration;
10  import net.sourceforge.pmd.ast.ASTReturnStatement;
11  import net.sourceforge.pmd.ast.SimpleNode;
12  
13  import java.util.ArrayList;
14  import java.util.Iterator;
15  import java.util.List;
16  
17  public class OnlyOneReturnRule extends AbstractRule {
18  
19      public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
20          if (node.isInterface()) {
21              return data;
22          }
23          return super.visit(node, data);
24      }
25  
26      public Object visit(ASTMethodDeclaration node, Object data) {
27          if (node.isAbstract()) {
28              return data;
29          }
30  
31          List returnNodes = new ArrayList();
32          node.findChildrenOfType(ASTReturnStatement.class, returnNodes, false);
33          if (returnNodes.size() > 1) {
34              RuleContext ctx = (RuleContext) data;
35              for (Iterator i = returnNodes.iterator(); i.hasNext();) {
36                  SimpleNode problem = (SimpleNode) i.next();
37                  // skip the last one, it's OK
38                  if (!i.hasNext()) {
39                      continue;
40                  }
41                  ctx.getReport().addRuleViolation(createRuleViolation(ctx, problem));
42              }
43          }
44          return data;
45      }
46  
47  }