import ast | |
import gast | |
def _generate_translators(to): | |
class Translator(ast.NodeTransformer): | |
def _visit(self, node): | |
if isinstance(node, list): | |
return [self._visit(n) for n in node] | |
elif isinstance(node, ast.AST): | |
return self.visit(node) | |
else: | |
return node | |
def generic_visit(self, node): | |
cls = type(node).__name__ | |
# handle nodes that are not part of the AST | |
if not hasattr(to, cls): | |
return | |
new_node = getattr(to, cls)() | |
for field in node._fields: | |
setattr(new_node, field, self._visit(getattr(node, field))) | |
for attr in getattr(node, '_attributes'): | |
if hasattr(node, attr): | |
setattr(new_node, attr, getattr(node, attr)) | |
return new_node | |
return Translator | |
AstToGAst = _generate_translators(gast) | |
GAstToAst = _generate_translators(ast) | |