Source code for pycropml.transpiler.interface
from pycropml.transpiler.pseudo_tree import Node
import copy
[docs]
class TreeInterface():
'''
Extract specific node
visits recursively nodes of the tree
with defined transform_<node_type> methods and transforms in place
'''
def __init__(self, tree):
self.tree=tree
self.ForSequence = False
self.nbForSeq=0
self.dependencies=[]
self.indexNames=[]
self.returns=[]
[docs]
def transform(self, tree, in_block=False):
self.nameIndex=[]
if isinstance(tree, Node):
if tree.type =="for_sequence":
self.ForSequence = True
self.nbForSeq =self.nbForSeq+1
if tree.type == "custom_call" and tree.function not in self.dependencies:
self.dependencies.append(tree.function)
if tree.type=="list" and "list" not in self.dependencies:
self.dependencies.append("list")
if tree.type=="function_definition":
for inp in tree.params:
if isinstance(inp.pseudo_type, list):
if inp.pseudo_type[0]=="list" and "list" not in self.dependencies:
self.dependencies.append("list")
if tree.type=="importfrom":
self.dependencies.append(tree.name[0])
if tree.type=="implicit_return":
self.returns.append(tree)
else:
tree = self.transform_default(tree)
return tree
elif isinstance(tree, list):
return [self.transform(child) for child in tree]
else:
return tree
[docs]
def transform_default(self, tree):
for field, child in tree.__dict__.items():
if not field.endswith('type'):
if isinstance(child, Node):
setattr(tree, field, self.transform(child, False))
elif isinstance(child, list) and field == 'block' or field == 'main':
setattr(tree, field, self.transform_block(child))
elif isinstance(child, list):
setattr(tree, field, self.transform(child))
return tree
[docs]
def transform_block(self, tree):
results = []
for child in tree:
result = self.transform(child, True)
if not isinstance(result, list):
results.append(result)
else:
results += result
return results