Subject: bug#64922: closed (Re: bug#64922: treesit-query-error due to a recent change to tree-sitter-cmake grammar definition)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 29 Jul 2023 19:26:02 +0000

Your bug report

#64922: treesit-query-error due to a recent change to tree-sitter-cmake grammar definition

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
64922: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=64922
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#64922: treesit-query-error due to a recent change to tree-sitter-cmake grammar definition
From: Eli Zaretskii <[email-masked]>
To: Theodor Thornhill <[email-masked]>
Cc: [email-masked], [email-masked], [email-masked]
Date: Sat, 29 Jul 2023 22:24:59 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Theodor Thornhill <[email-masked]>
> Cc: [email-masked], [email-masked], [email-masked]
> Date: Sat, 29 Jul 2023 21:19:38 +0200
> 
> Installed.

Thanks!

Subject: treesit-query-error due to a recent change to tree-sitter-cmake grammar definition
From: Vincenzo Pupillo <[email-masked]>
To: [email-masked]
Date: Fri, 28 Jul 2023 22:59:27 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi, a recent commit (commit fe9b5e022950d53cb23959b76c240e1da27ff0a5) changed 
the definition of the cmake grammar, now there is a new node argument_list used 
to wrap nodes of type argument. 
This causes the following error:
Error during redisplay: (jit-lock-function 1) signaled (treesit-query-error 
"Structure error at" 19 "((foreach_command ((argument) @font-lock-constant-
face (#match \"\\\\(?:^\\\\(?:I\\\\(?:N\\\\|TEMS\\\\)\\\\|LISTS\\\\|RANGE\\\\|
ZIP_LISTS\\\\)$\\\\)\" @font-lock-constant-face)))) ((if_command ((argument) 
@font-lock-constant-face (#match \"\\\\(?:^\\\\(?:AND\\\\|COMMAND\\\\|DEFINED\
\\\|E\\\\(?:QUAL\\\\|XISTS\\\\)\\\\|GREATER\\\\(?:_EQUAL\\\\)?\\\\|LESS\\\\
(?:_EQUAL\\\\)?\\\\|MATCHES\\\\|NOT\\\\|OR\\\\|PATH_EQUAL\\\\|STR\\\\(?:EQUAL\
\\\|GREATER\\\\(?:_EQUAL\\\\)?\\\\|LESS\\\\(?:_EQUAL\\\\)?\\\\)\\\\|VERSION_\\
\\(?:EQUAL\\\\|GREATER\\\\(?:_EQUAL\\\\)?\\\\|LESS\\\\(?:_EQUAL\\\\)?\\\\)\\\
\)$\\\\)\" @font-lock-constant-face))))" "Debug the query with `treesit-query-
validate'")

The attached patch supports both the old and the new grammar.
Thanks.
Vincenzo

>From 33a53c86b38624dcfe88aca24f6f1f94ab339463 Mon Sep 17 00:00:00 2001
From: Vincenzo Pupillo <[email-masked]>
Date: Fri, 28 Jul 2023 22:37:02 +0200
Subject: [PATCH] Updated CMake support due to changes in tree-sitter-cmake

A recent change in tree-sitter-cmake grammar support for CMake (commit
fe9b5e0), now put arguments are wrapped in a new argument_list node.
To support the old and new version of the grammar, a new function was
added on which string syntax highlighting now depends.

* lisp/progmodes/cmake-ts-mode.el: (cmake-ts-mode--font-lock-compatibility-fe9b5e0):
  indent helper function for handle different tree-sitter-cmake
  version
* lisp/progmodes/cmake-ts-mode.el: (cmake-ts-mode--font-lock-settings): use the new
  function to handle the new argument_list node.
---
 lisp/progmodes/cmake-ts-mode.el | 54 ++++++++++++++++++++++++---------
 1 file changed, 39 insertions(+), 15 deletions(-)

diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el
index 9d35d8077bd..9fcd8a7a2ab 100644
--- a/lisp/progmodes/cmake-ts-mode.el
+++ b/lisp/progmodes/cmake-ts-mode.el
@@ -31,6 +31,7 @@
 (eval-when-compile (require 'rx))
 
 (declare-function treesit-parser-create "treesit.c")
+(declare-function treesit-query-capture "treesit.c")
 (declare-function treesit-induce-sparse-tree "treesit.c")
 (declare-function treesit-node-child "treesit.c")
 (declare-function treesit-node-start "treesit.c")
@@ -87,6 +88,42 @@
     "VERSION_GREATER_EQUAL" "VERSION_LESS" "VERSION_LESS_EQUAL")
   "CMake if conditions for tree-sitter font-locking.")
 
+(defun cmake-ts-mode--font-lock-compatibility-fe9b5e0 ()
+  "Indent rules helper, to handle different releases of tree-sitter-cmake.
+Check if a node type is available, then return the right indent rules."
+  ;; handle commit fe9b5e0
+  (condition-case nil
+      (progn (treesit-query-capture 'cmake '((argument_list) @capture))
+             `(((foreach_command
+                 ((argument_list) @font-lock-constant-face
+                  (:match ,(rx-to-string
+                            `(seq bol
+                                  (or ,@cmake-ts-mode--foreach-options)
+                                  eol))
+                          @font-lock-constant-face))))
+               ((if_command
+                 ((argument_list) @font-lock-constant-face
+                  (:match ,(rx-to-string
+                            `(seq bol
+                                  (or ,@cmake-ts-mode--if-conditions)
+                                  eol))
+                          @font-lock-constant-face))))))
+    (error
+     `(((foreach_command
+         ((argument) @font-lock-constant-face
+          (:match ,(rx-to-string
+                    `(seq bol
+                          (or ,@cmake-ts-mode--foreach-options)
+                          eol))
+                  @font-lock-constant-face))))
+       ((if_command
+         ((argument) @font-lock-constant-face
+          (:match ,(rx-to-string
+                    `(seq bol
+                          (or ,@cmake-ts-mode--if-conditions)
+                          eol))
+                  @font-lock-constant-face))))))))
+
 (defvar cmake-ts-mode--font-lock-settings
   (treesit-font-lock-rules
    :language 'cmake
@@ -95,21 +132,8 @@
 
    :language 'cmake
    :feature 'builtin
-   `(((foreach_command
-       ((argument) @font-lock-constant-face
-        (:match ,(rx-to-string
-                  `(seq bol
-                        (or ,@cmake-ts-mode--foreach-options)
-                        eol))
-                @font-lock-constant-face))))
-     ((if_command
-       ((argument) @font-lock-constant-face
-        (:match ,(rx-to-string
-                  `(seq bol
-                        (or ,@cmake-ts-mode--if-conditions)
-                        eol))
-                @font-lock-constant-face)))))
-
+   (cmake-ts-mode--font-lock-compatibility-fe9b5e0)
+   
    :language 'cmake
    :feature 'comment
    '([(bracket_comment) (line_comment)] @font-lock-comment-face)
-- 
2.41.0