private boolean ifVerify(ASTIfStatement is, String varname) {
   List finder = new ArrayList();
   is.findChildrenOfType(ASTPrimaryExpression.class, finder, true);
   if (finder.size() > 1) {
     ASTPrimaryExpression apeLeft = (ASTPrimaryExpression) finder.get(0);
     if (matchName(apeLeft, varname)) {
       ASTPrimaryExpression apeRight = (ASTPrimaryExpression) finder.get(1);
       if ((apeRight.jjtGetNumChildren() == 1)
           && (apeRight.jjtGetChild(0) instanceof ASTPrimaryPrefix)) {
         ASTPrimaryPrefix pp2 = (ASTPrimaryPrefix) apeRight.jjtGetChild(0);
         if ((pp2.jjtGetNumChildren() == 1) && (pp2.jjtGetChild(0) instanceof ASTLiteral)) {
           ASTLiteral lit = (ASTLiteral) pp2.jjtGetChild(0);
           if ((lit.jjtGetNumChildren() == 1) && (lit.jjtGetChild(0) instanceof ASTNullLiteral)) {
             return true;
           }
         }
       }
     }
   }
   return false;
 }
  public Object visit(ASTMethodDeclaration node, Object data) {
    if (interfaceSkipper == true) { // skip methods in interfaces
      return super.visit(node, data);
    }
    ASTResultType rt = (ASTResultType) node.jjtGetChild(0);
    if (rt.isVoid() == true) {
      return super.visit(node, data);
    }
    ASTType t = (ASTType) rt.jjtGetChild(0);
    if (t.jjtGetNumChildren() == 0 || !(t.jjtGetChild(0) instanceof ASTName)) {
      return super.visit(node, data);
    }
    String returnVariableName = null;
    List finder = new ArrayList();
    GET_RETURN_VARIABLE_NAME:
    {
      node.findChildrenOfType(ASTReturnStatement.class, finder, true);
      if (finder.size() != 1) {
        return super.visit(node, data);
      }
      ASTReturnStatement rs =
          (ASTReturnStatement)
              finder.get(0); // EXPLODES IF THE CLASS IS AN INTERFACE SINCE NO RETURN

      finder.clear();
      rs.findChildrenOfType(ASTPrimaryExpression.class, finder, true);
      ASTPrimaryExpression ape = (ASTPrimaryExpression) finder.get(0);
      Node lastChild = ape.jjtGetChild(ape.jjtGetNumChildren() - 1);
      if (lastChild instanceof ASTPrimaryPrefix) {
        returnVariableName = getNameFromPrimaryPrefix((ASTPrimaryPrefix) lastChild);
      }
      if (returnVariableName == null) {
        return super.visit(node, data);
      }
    }
    CHECK_OUTER_IF:
    {
      finder.clear();
      node.findChildrenOfType(ASTIfStatement.class, finder, true);
      if (finder.size() == 2) {
        ASTIfStatement is = (ASTIfStatement) finder.get(0);
        if (ifVerify(is, returnVariableName)) {
          // find synchronized
          finder.clear();
          is.findChildrenOfType(ASTSynchronizedStatement.class, finder, true);
          if (finder.size() == 1) {
            ASTSynchronizedStatement ss = (ASTSynchronizedStatement) finder.get(0);
            finder.clear();
            ss.findChildrenOfType(ASTIfStatement.class, finder, true);
            if (finder.size() == 1) {
              ASTIfStatement is2 = (ASTIfStatement) finder.get(0);
              if (ifVerify(is2, returnVariableName)) {
                finder.clear();
                is2.findChildrenOfType(ASTStatementExpression.class, finder, true);
                if (finder.size() == 1) {
                  ASTStatementExpression se = (ASTStatementExpression) finder.get(0);
                  if (se.jjtGetNumChildren()
                      == 3) { // primaryExpression, AssignmentOperator, Expression
                    if (se.jjtGetChild(0) instanceof ASTPrimaryExpression) {
                      ASTPrimaryExpression pe = (ASTPrimaryExpression) se.jjtGetChild(0);
                      if (matchName(pe, returnVariableName)) {
                        if (se.jjtGetChild(1) instanceof ASTAssignmentOperator) {
                          RuleContext ctx = (RuleContext) data;
                          ctx.getReport()
                              .addRuleViolation(createRuleViolation(ctx, node.getBeginLine()));
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    return super.visit(node, data);
  }