|
|
- from gast.astn import AstToGAst, GAstToAst
- import gast
- import ast
- import sys
-
-
- class Ast3ToGAst(AstToGAst):
-
- def visit_Name(self, node):
- new_node = gast.Name(
- self._visit(node.id),
- self._visit(node.ctx),
- None,
- )
- return ast.copy_location(new_node, node)
-
- def visit_arg(self, node):
- new_node = gast.Name(
- self._visit(node.arg),
- gast.Param(),
- self._visit(node.annotation),
- )
- return ast.copy_location(new_node, node)
-
- def visit_ExceptHandler(self, node):
- if node.name:
- new_node = gast.ExceptHandler(
- self._visit(node.type),
- gast.Name(node.name, gast.Store(), None),
- self._visit(node.body))
- return ast.copy_location(new_node, node)
- else:
- return self.generic_visit(node)
-
- if sys.version_info.minor < 5:
-
- def visit_Call(self, node):
- if node.starargs:
- star = gast.Starred(self._visit(node.starargs), gast.Load())
- ast.copy_location(star, node)
- 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,
- )
- ast.copy_location(new_node, node)
- return new_node
-
- if 2 <= sys.version_info.minor <= 3:
-
- def _make_annotated_arg(self, parent, identifier, annotation):
- if identifier is None:
- return None
- new_node = gast.Name(
- self._visit(identifier),
- gast.Param(),
- self._visit(annotation),
- )
- return ast.copy_location(new_node, parent)
-
- def visit_arguments(self, node):
- new_node = gast.arguments(
- [self._visit(n) for n in node.args],
- self._make_annotated_arg(node,
- node.vararg,
- self._visit(node.varargannotation)),
- [self._visit(n) for n in node.kwonlyargs],
- self._visit(node.kw_defaults),
- self._make_annotated_arg(node,
- node.kwarg,
- self._visit(node.kwargannotation)),
- self._visit(node.defaults),
- )
- return new_node
-
- if sys.version_info.minor < 6:
-
- 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,
- )
- return ast.copy_location(new_node, node)
-
-
- class GAstToAst3(GAstToAst):
-
- def _make_arg(self, node):
- if node is None:
- return None
- new_node = ast.arg(
- self._visit(node.id),
- self._visit(node.annotation),
- )
- return ast.copy_location(new_node, node)
-
- def visit_Name(self, node):
- new_node = ast.Name(
- self._visit(node.id),
- self._visit(node.ctx),
- )
- return ast.copy_location(new_node, node)
-
- def visit_ExceptHandler(self, node):
- if node.name:
- new_node = ast.ExceptHandler(
- self._visit(node.type),
- node.name.id,
- self._visit(node.body))
- return ast.copy_location(new_node, node)
- else:
- return self.generic_visit(node)
-
- if sys.version_info.minor < 5:
-
- 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_ClassDef(self, node):
- self.generic_visit(node)
- new_node = ast.ClassDef(
- name=self._visit(node.name),
- bases=self._visit(node.bases),
- keywords=self._visit(node.keywords),
- body=self._visit(node.body),
- decorator_list=self._visit(node.decorator_list),
- starargs=None,
- kwargs=None,
- )
- return ast.copy_location(new_node, node)
-
- if 2 <= sys.version_info.minor <= 3:
-
- def visit_arguments(self, node):
- if node.vararg is None:
- vararg = None
- varargannotation = None
- else:
- vararg = node.vararg.id
- varargannotation = self._visit(node.vararg.annotation)
- if node.kwarg is None:
- kwarg = None
- kwargannotation = None
- else:
- kwarg = node.kwarg.id
- kwargannotation = self._visit(node.kwarg.annotation)
-
- new_node = ast.arguments(
- [self._make_arg(n) for n in node.args],
- vararg, varargannotation,
- [self._make_arg(n) for n in node.kwonlyargs],
- kwarg, kwargannotation,
- self._visit(node.defaults),
- self._visit(node.kw_defaults),
- )
- return new_node
- else:
- def visit_arguments(self, node):
- new_node = ast.arguments(
- [self._make_arg(n) for n in node.args],
- self._make_arg(node.vararg),
- [self._make_arg(n) for n in node.kwonlyargs],
- self._visit(node.kw_defaults),
- self._make_arg(node.kwarg),
- self._visit(node.defaults),
- )
- return new_node
-
-
- def ast_to_gast(node):
- return Ast3ToGAst().visit(node)
-
-
- def gast_to_ast(node):
- return GAstToAst3().visit(node)
|