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.ast.ASTClassOrInterfaceDeclaration;
8 import net.sourceforge.pmd.ast.ASTMethodDeclaration;
9 import net.sourceforge.pmd.ast.ASTReturnStatement;
10 import net.sourceforge.pmd.ast.SimpleNode;
11
12 import java.util.ArrayList;
13 import java.util.Iterator;
14 import java.util.List;
15
16 public class OnlyOneReturnRule extends AbstractRule {
17
18 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
19 if (node.isInterface()) {
20 return data;
21 }
22 return super.visit(node, data);
23 }
24
25 public Object visit(ASTMethodDeclaration node, Object data) {
26 if (node.isAbstract()) {
27 return data;
28 }
29
30 List returnNodes = new ArrayList();
31 node.findChildrenOfType(ASTReturnStatement.class, returnNodes, false);
32 if (returnNodes.size() > 1) {
33 for (Iterator i = returnNodes.iterator(); i.hasNext();) {
34 SimpleNode problem = (SimpleNode) i.next();
35
36 if (!i.hasNext()) {
37 continue;
38 }
39 addViolation(data, problem);
40 }
41 }
42 return data;
43 }
44
45 }