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.ASTInterfaceDeclaration;
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(ASTInterfaceDeclaration node, Object data) {
20          return data;
21      }
22  
23      public Object visit(ASTMethodDeclaration node, Object data) {
24          if (node.isAbstract()) {
25              return data;
26          }
27  
28          List returnNodes = new ArrayList();
29          node.findChildrenOfType(ASTReturnStatement.class, returnNodes, false);
30          if (returnNodes.size() > 1) {
31              RuleContext ctx = (RuleContext) data;
32              for (Iterator i = returnNodes.iterator(); i.hasNext();) {
33                  SimpleNode problem = (SimpleNode) i.next();
34                  // skip the last one, it's OK
35                  if (!i.hasNext()) {
36                      continue;
37                  }
38                  ctx.getReport().addRuleViolation(createRuleViolation(ctx, problem.getBeginLine()));
39              }
40          }
41          return data;
42      }
43  
44  }