def _assert_recur_is_tail(node: Node) -> None:  
if node.op == NodeOp.DO:<EOL><INDENT>assert isinstance(node, Do)<EOL>for child in node.statements:<EOL><INDENT>_assert_no_recur(child)<EOL><DEDENT>_assert_recur_is_tail(node.ret)<EOL><DEDENT>elif node.op in {NodeOp.FN, NodeOp.FN_METHOD, NodeOp.METHOD}:<EOL><INDENT>assert isinstance(node, (Fn, FnMethod, Method))<EOL>node.visit(_assert_recur_is_tail)<EOL><DEDENT>elif node.op == NodeOp.IF:<EOL><INDENT>assert isinstance(node, If)<EOL>_assert_no_recur(node.test)<EOL>_assert_recur_is_tail(node.then)<EOL>_assert_recur_is_tail(node.else_)<EOL><DEDENT>elif node.op in {NodeOp.LET, NodeOp.LETFN}:<EOL><INDENT>assert isinstance(node, (Let, LetFn))<EOL>for binding in node.bindings:<EOL><INDENT>assert binding.init is not None<EOL>_assert_no_recur(binding.init)<EOL><DEDENT>_assert_recur_is_tail(node.body)<EOL><DEDENT>elif node.op == NodeOp.LOOP:<EOL><INDENT>assert isinstance(node, Loop)<EOL>for binding in node.bindings:<EOL><INDENT>assert binding.init is not None<EOL>_assert_no_recur(binding.init)<EOL><DEDENT><DEDENT>elif node.op == NodeOp.RECUR:<EOL><INDENT>pass<EOL><DEDENT>elif node.op == NodeOp.TRY:<EOL><INDENT>assert isinstance(node, Try)<EOL>_assert_recur_is_tail(node.body)<EOL>for catch in node.catches:<EOL><INDENT>_assert_recur_is_tail(catch)<EOL><DEDENT>if node.finally_:<EOL><INDENT>_assert_no_recur(node.finally_)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>node.visit(_assert_no_recur)<EOL><DEDENT>
Assert that `recur` forms only appear in the tail position of this
    or child AST nodes.

    `recur` forms may only appear in `do` nodes (both literal and synthetic
    `do` nodes) and in either the :then or :else expression of an `if` node.