'Return the AST statements to replace the ast.Assert instance.
This re-writes the test of an assertion to provide
intermediate values and replace it with an if statement which
raises an assertion error with a detailed explanation in case
the expression is false.'

def visit_Assert(self, assert_):

    if (isinstance(assert_.test, ast.Tuple) and (self.config is not None)):
        fslocation = (self.module_path, assert_.lineno)
        self.config.warn('R1', 'assertion    is    always    true,    perhaps    remove    parentheses?', fslocation=fslocation)
    self.statements = []
    self.variables = []
    self.variable_counter = itertools.count()
    self.stack = []
    self.on_failure = []
    self.push_format_context()
    (top_condition, explanation) = self.visit(assert_.test)
    body = self.on_failure
    negation = ast.UnaryOp(ast.Not(), top_condition)
    self.statements.append(ast.If(negation, body, []))
    if assert_.msg:
        assertmsg = self.helper('format_assertmsg', assert_.msg)
        explanation = ('\n>assert    ' + explanation)
    else:
        assertmsg = ast.Str('')
        explanation = ('assert    ' + explanation)
    template = ast.BinOp(assertmsg, ast.Add(), ast.Str(explanation))
    msg = self.pop_format_context(template)
    fmt = self.helper('format_explanation', msg)
    err_name = ast.Name('AssertionError', ast.Load())
    exc = ast_Call(err_name, [fmt], [])
    if (sys.version_info[0] >= 3):
        raise_ = ast.Raise(exc, None)
    else:
        raise_ = ast.Raise(exc, None, None)
    body.append(raise_)
    if self.variables:
        variables = [ast.Name(name, ast.Store()) for name in self.variables]
        clear = ast.Assign(variables, _NameConstant(None))
        self.statements.append(clear)
    for stmt in self.statements:
        set_location(stmt, assert_.lineno, assert_.col_offset)
    return self.statements
