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
38 if (!i.hasNext()) {
39 continue;
40 }
41 ctx.getReport().addRuleViolation(createRuleViolation(ctx, problem));
42 }
43 }
44 return data;
45 }
46
47 }