def executable_node_for( self, statement: stmt.Statement, ) -> ast.Module: """Transforms the given statement in an executable ast node. Args: statement: The statement that should be converted. Returns: An executable ast node. """ modules_before = len(self._modules_aliases.known_name_indices) visitor = stmt_to_ast.StatementToAstVisitor( self._modules_aliases, self._variable_names ) statement.accept(visitor) if modules_before != len(self._modules_aliases.known_name_indices): # new module added # TODO(fk) cleaner solution? self._global_namespace = ExecutionContext._create_global_namespace( self._modules_aliases ) assert ( len(visitor.ast_nodes) == 1 ), "Expected statement to produce exactly one ast node" return ExecutionContext._wrap_node_in_module(visitor.ast_nodes[0])
def after_statement_execution( self, statement: st.Statement, exec_ctx: ExecutionContext, exception: Optional[Exception] = None, ) -> None: if exception is not None: return if statement.return_value.is_none_type(): return visitor = NoneAssertionVisitor(exec_ctx, statement.return_value, self._trace) statement.accept(visitor)