76 lines
2.3 KiB
Python
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)]
|
|
|
|
|