from tree_sitter import Language, Parser # Run with python 3: # /usr/bin/python3 parent_test.py SOURCE_CODE = bytes(""" def main(): a = 2 """, "utf8") def setup(): Language.build_library('build/my-languages.so', ['../tree-sitter-python']) py_language = Language('build/my-languages.so', 'python') return py_language def main(): py_language = setup() parser = Parser() parser.set_language(py_language) source_code = SOURCE_CODE print(f"Using source code: ") print('-------------------------------') print(f"{source_code.decode('utf8')}") print('-------------------------------') tree = parser.parse(source_code) local_defs = [] walker(source_code, tree.root_node, None) print('Done..\n') def get_id(node): node_id = id(node) if node is None: node_id = None return node_id def walker(source_code, node, parent): code_from_node = source_code[node.start_byte : node.end_byte][:30] node_parent_id = get_id(node.parent) actual_parent_id = get_id(parent) node_label = f"id:{id(node)}, node.parent_id: {node_parent_id}, actual_parent_id:{actual_parent_id}, {code_from_node}" print(f'Visiting node: {node_label}') num_children = len(node.children) print(f'Node has {num_children} children..') for child in range(num_children): if node.children[child]: print(f'Traversing child: {child}') walker(source_code, node.children[child], node) print(f'Finished visiting node: {node_label}') return if __name__ == "__main__": main()