from tree_sitter import Language, Parser, Node, TreeCursor, Tree from typing import Tuple, List from dataclasses import dataclass # Language.build_library( # # Store the library in the `build` directory # 'build/compiled-languages.so', # # Include one or more languages # [ # '/home/joe/Repositories/tree-sitter/languages/tree-sitter-cpp', # '/home/joe/Repositories/tree-sitter/languages/tree-sitter-c', # '/home/joe/Repositories/tree-sitter/languages/tree-sitter-rust', # '/home/joe/Repositories/tree-sitter/languages/tree-sitter-python', # # 'vendor/tree-sitter-javascript', # # 'vendor/tree-sitter-python' # ] # ) C_LANGUAGE = Language('build/compiled-languages.so', 'c') # CPP_LANGUAGE = Language('build/compiled-languages.so', 'cpp') # PYTHON_LANGUAGE = Language('build/compiled-languages.so', 'python') # PY_LANGUAGE = Language('build/my-languages.so', 'python') c_parser: Parser = Parser() c_parser.set_language(C_LANGUAGE) # cpp_parser = Parser() # cpp_parser.set_language(CPP_LANGUAGE) # python_parser = Parser() # python_parser.set_language(PYTHON_LANGUAGE) def traverse_tree(tree: Tree): cursor = tree.walk() reached_root = False while reached_root == False: yield cursor.node if cursor.goto_first_child(): continue if cursor.goto_next_sibling(): continue retracing = True while retracing: if not cursor.goto_parent(): retracing = False reached_root = True if cursor.goto_next_sibling(): retracing = False # with open('treesitter.py', 'r') as f: # def dfs(node: Node, indent_level): # indent = "".join([' ' * (indent_level * 4)]) # # if node.grammar_name != node.type: # # print(node) # print(indent, '-', f"({node.type})", # node.range, # node.start_point, node.end_point, node.text) # for n in node.children: # dfs(n, indent_level + 1) # dfs(root, 0) @dataclass class ParsedRange: name: str line_num: int crange: Tuple[int, int] # def get_ts_nodes(text: str) -> List[ParsedRange]: def get_ts_nodes(text: str) -> List[Node]: tree = c_parser.parse(bytes(text, 'utf-8')) # root: Node = tree.root_node # query = C_LANGUAGE.query(root.sexp()) return [n for n in traverse_tree(tree)]