Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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()
Exemplo n.º 4
0
    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