| | from astn import AstToGAst, GAstToAst |
| | import ast |
| | import gast |
| |
|
| |
|
| | class Ast2ToGAst(AstToGAst): |
| |
|
| | |
| | def visit_Module(self, node): |
| | new_node = gast.Module( |
| | self._visit(node.body), |
| | [] |
| | ) |
| | return new_node |
| |
|
| | |
| | def visit_FunctionDef(self, node): |
| | new_node = gast.FunctionDef( |
| | self._visit(node.name), |
| | self._visit(node.args), |
| | self._visit(node.body), |
| | self._visit(node.decorator_list), |
| | None, |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_ClassDef(self, node): |
| | new_node = gast.ClassDef( |
| | self._visit(node.name), |
| | self._visit(node.bases), |
| | [], |
| | self._visit(node.body), |
| | self._visit(node.decorator_list), |
| | ) |
| |
|
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_For(self, node): |
| | new_node = gast.For( |
| | self._visit(node.target), |
| | self._visit(node.iter), |
| | self._visit(node.body), |
| | self._visit(node.orelse), |
| | [] |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_With(self, node): |
| | new_node = gast.With( |
| | [gast.withitem( |
| | self._visit(node.context_expr), |
| | self._visit(node.optional_vars) |
| | )], |
| | self._visit(node.body), |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Raise(self, node): |
| | ntype = self._visit(node.type) |
| | ninst = self._visit(node.inst) |
| | ntback = self._visit(node.tback) |
| |
|
| | what = ntype |
| |
|
| | if ninst is not None: |
| | what = gast.Call(ntype, [ninst], []) |
| | gast.copy_location(what, node) |
| | what.end_lineno = what.end_col_offset = None |
| |
|
| | if ntback is not None: |
| | attr = gast.Attribute(what, 'with_traceback', gast.Load()) |
| | gast.copy_location(attr, node) |
| | attr.end_lineno = attr.end_col_offset = None |
| |
|
| | what = gast.Call( |
| | attr, |
| | [ntback], |
| | [] |
| | ) |
| | gast.copy_location(what, node) |
| | what.end_lineno = what.end_col_offset = None |
| |
|
| | new_node = gast.Raise(what, None) |
| |
|
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_TryExcept(self, node): |
| | new_node = gast.Try( |
| | self._visit(node.body), |
| | self._visit(node.handlers), |
| | self._visit(node.orelse), |
| | [] |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_TryFinally(self, node): |
| | new_node = gast.Try( |
| | self._visit(node.body), |
| | [], |
| | [], |
| | self._visit(node.finalbody) |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | |
| |
|
| | def visit_Name(self, node): |
| | new_node = gast.Name( |
| | self._visit(node.id), |
| | self._visit(node.ctx), |
| | None, |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Num(self, node): |
| | new_node = gast.Constant( |
| | node.n, |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Subscript(self, node): |
| | new_slice = self._visit(node.slice) |
| | new_node = gast.Subscript( |
| | self._visit(node.value), |
| | new_slice, |
| | self._visit(node.ctx), |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Ellipsis(self, node): |
| | new_node = gast.Constant( |
| | Ellipsis, |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Index(self, node): |
| | return self._visit(node.value) |
| |
|
| | def visit_ExtSlice(self, node): |
| | new_dims = self._visit(node.dims) |
| | new_node = gast.Tuple(new_dims, gast.Load()) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Str(self, node): |
| | new_node = gast.Constant( |
| | node.s, |
| | None, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Call(self, node): |
| | if node.starargs: |
| | star = gast.Starred(self._visit(node.starargs), gast.Load()) |
| | gast.copy_location(star, node) |
| | star.end_lineno = star.end_col_offset = None |
| | starred = [star] |
| | else: |
| | starred = [] |
| |
|
| | if node.kwargs: |
| | kwargs = [gast.keyword(None, self._visit(node.kwargs))] |
| | else: |
| | kwargs = [] |
| |
|
| | new_node = gast.Call( |
| | self._visit(node.func), |
| | self._visit(node.args) + starred, |
| | self._visit(node.keywords) + kwargs, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_comprehension(self, node): |
| | new_node = gast.comprehension( |
| | target=self._visit(node.target), |
| | iter=self._visit(node.iter), |
| | ifs=self._visit(node.ifs), |
| | is_async=0, |
| | ) |
| | gast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | |
| | def visit_arguments(self, node): |
| | |
| | if node.vararg: |
| | vararg = ast.Name(node.vararg, ast.Param()) |
| | else: |
| | vararg = None |
| |
|
| | if node.kwarg: |
| | kwarg = ast.Name(node.kwarg, ast.Param()) |
| | else: |
| | kwarg = None |
| |
|
| | if node.vararg: |
| | vararg = ast.Name(node.vararg, ast.Param()) |
| | else: |
| | vararg = None |
| |
|
| | new_node = gast.arguments( |
| | self._visit(node.args), |
| | [], |
| | self._visit(vararg), |
| | [], |
| | [], |
| | self._visit(kwarg), |
| | self._visit(node.defaults), |
| | ) |
| | return new_node |
| |
|
| |
|
| | class GAstToAst2(GAstToAst): |
| |
|
| | |
| | def visit_Module(self, node): |
| | new_node = ast.Module(self._visit(node.body)) |
| | return new_node |
| |
|
| | |
| | def visit_FunctionDef(self, node): |
| | new_node = ast.FunctionDef( |
| | self._visit(node.name), |
| | self._visit(node.args), |
| | self._visit(node.body), |
| | self._visit(node.decorator_list), |
| | ) |
| | |
| | if node.args.vararg: |
| | ast.copy_location(node.args.vararg, node) |
| | if node.args.kwarg: |
| | ast.copy_location(node.args.kwarg, node) |
| |
|
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_ClassDef(self, node): |
| | new_node = ast.ClassDef( |
| | self._visit(node.name), |
| | self._visit(node.bases), |
| | self._visit(node.body), |
| | self._visit(node.decorator_list), |
| | ) |
| |
|
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_For(self, node): |
| | new_node = ast.For( |
| | self._visit(node.target), |
| | self._visit(node.iter), |
| | self._visit(node.body), |
| | self._visit(node.orelse), |
| | ) |
| |
|
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_With(self, node): |
| | new_node = ast.With( |
| | self._visit(node.items[0].context_expr), |
| | self._visit(node.items[0].optional_vars), |
| | self._visit(node.body) |
| | ) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_Raise(self, node): |
| | if isinstance(node.exc, gast.Call) and \ |
| | isinstance(node.exc.func, gast.Attribute) and \ |
| | node.exc.func.attr == 'with_traceback': |
| | raised = self._visit(node.exc.func.value) |
| | traceback = self._visit(node.exc.args[0]) |
| | else: |
| | raised = self._visit(node.exc) |
| | traceback = None |
| | new_node = ast.Raise(raised, None, traceback) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_Try(self, node): |
| | if node.finalbody: |
| | new_node = ast.TryFinally( |
| | self._visit(node.body), |
| | self._visit(node.finalbody) |
| | ) |
| | else: |
| | new_node = ast.TryExcept( |
| | self._visit(node.body), |
| | self._visit(node.handlers), |
| | self._visit(node.orelse), |
| | ) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | |
| |
|
| | def visit_Name(self, node): |
| | new_node = ast.Name( |
| | self._visit(node.id), |
| | self._visit(node.ctx), |
| | ) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_Constant(self, node): |
| | if isinstance(node.value, (bool, int, long, float, complex)): |
| | new_node = ast.Num(node.value) |
| | elif node.value is Ellipsis: |
| | new_node = ast.Ellipsis() |
| | else: |
| | new_node = ast.Str(node.value) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_Subscript(self, node): |
| | def adjust_slice(s): |
| | if isinstance(s, (ast.Slice, ast.Ellipsis)): |
| | return s |
| | else: |
| | return ast.Index(s) |
| | if isinstance(node.slice, gast.Tuple): |
| | new_slice = ast.ExtSlice([adjust_slice(self._visit(elt)) |
| | for elt in node.slice.elts]) |
| | else: |
| | new_slice = adjust_slice(self._visit(node.slice)) |
| | ast.copy_location(new_slice, node.slice) |
| |
|
| | new_node = ast.Subscript( |
| | self._visit(node.value), |
| | new_slice, |
| | self._visit(node.ctx), |
| | ) |
| | ast.copy_location(new_node, node) |
| | new_node.end_lineno = new_node.end_col_offset = None |
| | return new_node |
| |
|
| | def visit_Call(self, node): |
| | if node.args and isinstance(node.args[-1], gast.Starred): |
| | args = node.args[:-1] |
| | starargs = node.args[-1].value |
| | else: |
| | args = node.args |
| | starargs = None |
| |
|
| | if node.keywords and node.keywords[-1].arg is None: |
| | keywords = node.keywords[:-1] |
| | kwargs = node.keywords[-1].value |
| | else: |
| | keywords = node.keywords |
| | kwargs = None |
| |
|
| | new_node = ast.Call( |
| | self._visit(node.func), |
| | self._visit(args), |
| | self._visit(keywords), |
| | self._visit(starargs), |
| | self._visit(kwargs), |
| | ) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | def visit_arg(self, node): |
| | new_node = ast.Name(node.arg, ast.Param()) |
| | ast.copy_location(new_node, node) |
| | return new_node |
| |
|
| | |
| | def visit_arguments(self, node): |
| | vararg = node.vararg and node.vararg.id |
| | kwarg = node.kwarg and node.kwarg.id |
| |
|
| | new_node = ast.arguments( |
| | self._visit(node.args), |
| | self._visit(vararg), |
| | self._visit(kwarg), |
| | self._visit(node.defaults), |
| | ) |
| | return new_node |
| |
|
| |
|
| | def ast_to_gast(node): |
| | return Ast2ToGAst().visit(node) |
| |
|
| |
|
| | def gast_to_ast(node): |
| | return GAstToAst2().visit(node) |
| |
|