/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.rules.design; import net.sourceforge.pmd.AbstractRule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.ast.ASTInterfaceDeclaration; import net.sourceforge.pmd.ast.ASTMethodDeclaration; import net.sourceforge.pmd.ast.ASTReturnStatement; import net.sourceforge.pmd.ast.SimpleNode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class OnlyOneReturnRule extends AbstractRule { public Object visit(ASTInterfaceDeclaration node, Object data) { return data; } public Object visit(ASTMethodDeclaration node, Object data) { if (node.isAbstract()) { return data; } List returnNodes = new ArrayList(); node.findChildrenOfType(ASTReturnStatement.class, returnNodes, false); if (returnNodes.size() > 1) { RuleContext ctx = (RuleContext) data; for (Iterator i = returnNodes.iterator(); i.hasNext();) { SimpleNode problem = (SimpleNode) i.next(); // skip the last one, it's OK if (!i.hasNext()) { continue; } ctx.getReport().addRuleViolation(createRuleViolation(ctx, problem.getBeginLine())); } } return data; } }