Skip to content

Commit 724d01a

Browse files
committed
Fix Dart and R parsers for language pack 1.9
1 parent 30b57e5 commit 724d01a

5 files changed

Lines changed: 83 additions & 14 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies = [
3131
"tree-sitter-bash>=0.25.0",
3232
"tree-sitter-sql>=0.3.0",
3333
"tree-sitter-lua>=0.5.0",
34-
"tree-sitter-language-pack>=1.5.0,<1.6.3",
34+
"tree-sitter-language-pack>=1.9.0,<1.10.0",
3535
"pydantic-settings>=2.14.1",
3636
"pyyaml>=6.0",
3737
"httpx>=0.28.0",

server/parser/dart.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from tree_sitter_language_pack import get_parser
77

88
from server.parser.base import CodeSymbol, _node_text
9+
from server.parser.tree_sitter_compat import root_node_for_tree
910

1011
_FLUTTER_WIDGET_BASES = {
1112
"StatelessWidget",
@@ -282,7 +283,7 @@ def language(self) -> str:
282283
return "dart"
283284

284285
def parse_file(self, source: bytes, file_path: str) -> list[CodeSymbol]:
285-
tree = self._parser.parse(source)
286+
tree = self._parser.parse(source.decode("utf-8", errors="replace"))
286287
symbols: list[CodeSymbol] = []
287-
_walk(tree.root_node, source, file_path, symbols)
288+
_walk(root_node_for_tree(tree), source, file_path, symbols)
288289
return symbols

server/parser/r.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from tree_sitter_language_pack import get_parser
55

66
from server.parser.base import CodeSymbol, _node_text
7+
from server.parser.tree_sitter_compat import root_node_for_tree
78

89

910
def _docstring(node: Node, source: bytes) -> str | None:
@@ -123,9 +124,9 @@ def language(self) -> str:
123124
return "r"
124125

125126
def parse_file(self, source: bytes, file_path: str) -> list[CodeSymbol]:
126-
tree = self._parser.parse(source)
127+
tree = self._parser.parse(source.decode("utf-8", errors="replace"))
127128
symbols: list[CodeSymbol] = []
128-
for child in tree.root_node.children:
129+
for child in root_node_for_tree(tree).children:
129130
if child.type == "binary_operator":
130131
sym = _parse_assignment(child, source, file_path)
131132
if sym:
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from __future__ import annotations
2+
3+
from typing import Any
4+
5+
6+
class LanguagePackNode:
7+
def __init__(
8+
self,
9+
node: Any,
10+
parent: LanguagePackNode | None = None,
11+
index: int | None = None,
12+
) -> None:
13+
self._node = node
14+
self._parent = parent
15+
self._index = index
16+
17+
@property
18+
def type(self) -> str:
19+
return self._node.kind()
20+
21+
@property
22+
def children(self) -> list[LanguagePackNode]:
23+
return [
24+
LanguagePackNode(self._node.child(i), self, i)
25+
for i in range(self._node.child_count())
26+
]
27+
28+
@property
29+
def start_byte(self) -> int:
30+
return self._node.start_byte()
31+
32+
@property
33+
def end_byte(self) -> int:
34+
return self._node.end_byte()
35+
36+
@property
37+
def start_point(self) -> tuple[int, int]:
38+
point = self._node.start_position()
39+
return (point.row, point.column)
40+
41+
@property
42+
def end_point(self) -> tuple[int, int]:
43+
point = self._node.end_position()
44+
return (point.row, point.column)
45+
46+
@property
47+
def prev_sibling(self) -> LanguagePackNode | None:
48+
if self._parent is None or self._index is None or self._index == 0:
49+
return None
50+
index = self._index - 1
51+
return LanguagePackNode(self._parent._node.child(index), self._parent, index)
52+
53+
def child_by_field_name(self, name: str) -> LanguagePackNode | None:
54+
child = self._node.child_by_field_name(name)
55+
if child is None:
56+
return None
57+
for index in range(self._node.child_count()):
58+
if self._node.child(index) == child:
59+
return LanguagePackNode(child, self, index)
60+
return LanguagePackNode(child)
61+
62+
63+
def root_node_for_tree(tree: Any) -> Any:
64+
root_node = tree.root_node() if callable(tree.root_node) else tree.root_node
65+
if hasattr(root_node, "children"):
66+
return root_node
67+
return LanguagePackNode(root_node)

uv.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)