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

Reply via email to