commit: 034010da930d5ae9086c9be6e2ee160f4cf5dbe3
Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 21 17:53:24 2025 +0000
Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Mon Jul 21 17:53:24 2025 +0000
URL:
https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=034010da
bash: update support to tree-sitter~=0.25
Also add backward compatible code for tree-sitter < 0.25.
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>
pyproject.toml | 4 ++--
src/pkgcheck/bash/__init__.py | 16 +++++++++++++---
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 40e0b757..28185765 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,7 +6,7 @@ requires = [
"lazy-object-proxy",
"lxml",
"pathspec",
- "tree-sitter~=0.24.0",
+ "tree-sitter~=0.25.0",
"tree-sitter-bash~=0.23.1",
"snakeoil~=0.10.11",
"pkgcore~=0.12.30",
@@ -45,7 +45,7 @@ dependencies = [
"lazy-object-proxy",
"lxml",
"pathspec",
- "tree-sitter~=0.24.0",
+ "tree-sitter~=0.25.0",
"tree-sitter-bash~=0.23.1",
"snakeoil~=0.10.11",
"pkgcore~=0.12.30",
diff --git a/src/pkgcheck/bash/__init__.py b/src/pkgcheck/bash/__init__.py
index 8cbacea0..0b5486b4 100644
--- a/src/pkgcheck/bash/__init__.py
+++ b/src/pkgcheck/bash/__init__.py
@@ -6,7 +6,17 @@ import tree_sitter_bash
from tree_sitter import Language, Parser, Query
lang = Language(tree_sitter_bash.language())
-query = lang.query
+
+try:
+ from tree_sitter import QueryCursor
+
+ def query(query_str: str) -> "QueryCursor":
+ return QueryCursor(Query(lang, query_str))
+except ImportError: # tree-sitter < 0.25
+ QueryCursor = Query
+ query = lang.query
+
+
parser = Parser(language=lang)
# various parse tree queries
@@ -29,14 +39,14 @@ class ParseTree:
"""Return the ebuild string associated with a given parse tree node."""
return self.data[node.start_byte : node.end_byte].decode("utf8")
- def global_query(self, query: Query):
+ def global_query(self, query: QueryCursor):
"""Run a given parse tree query returning only those nodes in global
scope."""
for x in self.tree.root_node.children:
# skip nodes in function scope
if x.type != "function_definition":
yield from chain.from_iterable(query.captures(x).values())
- def func_query(self, query: Query):
+ def func_query(self, query: QueryCursor):
"""Run a given parse tree query returning only those nodes in function
scope."""
for x in self.tree.root_node.children:
# only return nodes in function scope