def _add_expression_statement_handlers(self, source): try: root = ast.parse(source) from thonny.ast_utils import mark_text_ranges mark_text_ranges(root, source) expr_stmts = [] for node in ast.walk(root): if isinstance(node, ast.Expr): expr_stmts.append(node) marker_prefix = "__thonny_helper.print_repl_value(" marker_suffix = ")" lines = source.splitlines(keepends=True) for node in reversed(expr_stmts): lines[node.end_lineno - 1] = (lines[node.end_lineno - 1][:node.end_col_offset] + marker_suffix + lines[node.end_lineno - 1][node.end_col_offset:]) lines[node.lineno - 1] = (lines[node.lineno - 1][:node.col_offset] + marker_prefix + lines[node.lineno - 1][node.col_offset:]) new_source = "".join(lines) # make sure it parses ast.parse(new_source) return new_source except Exception: logger.exception("Problem adding Expr handlers") return source
def _compile_source(self, source, filename, mode): root = ast.parse(source, filename, mode) ast_utils.mark_text_ranges(root, source) self._tag_nodes(root) self._insert_expression_markers(root) self._insert_statement_markers(root) self._instrumented_files.add(filename) return compile(root, filename, mode)
def check_marked_ast(source, expected_pretty_ast #,expected_for_py_34=None ): #if (sys.version_info[:2] == (3,4) # and expected_for_py_34 is not None): # expected_pretty_ast = expected_for_py_34 source = dedent(source) root = ast.parse(source) ast_utils.mark_text_ranges(root, source) actual_pretty_ast = pretty(root) #print("ACTUAL", actual_pretty_ast) #print("EXPECTED", expected_pretty_ast) assert actual_pretty_ast.strip() == expected_pretty_ast.strip()
def _avoid_printing_expression_statements(self, source): # temporary solution for https://github.com/thonny/thonny/issues/1441 try: root = ast.parse(source) from thonny.ast_utils import mark_text_ranges mark_text_ranges(root, source) expr_stmts = [] for node in ast.walk(root): if isinstance(node, ast.Expr): expr_stmts.append(node) marker_prefix = "" marker_suffix = " and None or None" lines = source.splitlines(keepends=True) for node in reversed(expr_stmts): lines[node.end_lineno - 1] = ( lines[node.end_lineno - 1][: node.end_col_offset] + marker_suffix + lines[node.end_lineno - 1][node.end_col_offset :] ) lines[node.lineno - 1] = ( lines[node.lineno - 1][: node.col_offset] + marker_prefix + lines[node.lineno - 1][node.col_offset :] ) new_source = "".join(lines) # make sure it parses ast.parse(new_source) return new_source except SyntaxError: return source except Exception as e: logger.warning("Problem adding Expr handlers", exc_info=e) return source