fide/treesitter.py

76 lines
2.3 KiB
Python

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)]