%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/analyses/ |
| Current File : //lib/python3/dist-packages/pythran/analyses/ancestors.py |
"""
Ancestors computes the ancestors of each node
"""
from pythran.passmanager import ModuleAnalysis
from pythran.utils import pushpop
class Ancestors(ModuleAnalysis):
'''
Associate each node with the list of its ancestors
Based on the tree view of the AST: each node has the Module as parent.
The result of this analysis is a dictionary with nodes as key,
and list of nodes as values.
'''
def __init__(self):
self.result = dict()
self.current = list()
super(Ancestors, self).__init__()
def generic_visit(self, node):
self.result[node] = list(self.current)
with pushpop(self.current, node):
super(Ancestors, self).generic_visit(node)
class AncestorsWithBody(Ancestors):
def visit_metadata(self, node):
if hasattr(node, 'metadata'):
self.generic_visit(node.metadata)
def visit_body(self, body):
body_as_tuple = tuple(body)
self.result[body_as_tuple] = list(self.current)
with pushpop(self.current, body_as_tuple):
for stmt in body:
self.generic_visit(stmt)
def visit_If(self, node):
self.result[node] = list(self.current)
with pushpop(self.current, node):
self.generic_visit(node.test)
self.visit_metadata(node)
self.visit_body(node.body)
self.visit_body(node.orelse)
def visit_While(self, node):
self.result[node] = list(self.current)
with pushpop(self.current, node):
self.generic_visit(node.test)
self.visit_metadata(node)
self.visit_body(node.body)
self.visit_body(node.orelse)
def visit_For(self, node):
self.result[node] = list(self.current)
with pushpop(self.current, node):
self.generic_visit(node.target)
self.generic_visit(node.iter)
self.visit_metadata(node)
self.visit_body(node.body)
self.visit_body(node.orelse)
def visit_Try(self, node):
self.result[node] = list(self.current)
with pushpop(self.current, node):
self.visit_metadata(node)
self.visit_body(node.body)
for handler in node.handlers:
self.generic_visit(handler)
self.visit_body(node.orelse)
self.visit_body(node.finalbody)