Subject: Re: bug#63086: 29.0.90; go-ts-mode treesit-query-error during jit-lock

From: Randy Taylor <[email-masked]>
Date: Wed, 26 Apr 2023 15:40:36 +0000

On Wednesday, April 26th, 2023 at 10:05, Randy Taylor <[email-masked]> wrote:

> On Wednesday, April 26th, 2023 at 09:44, Jimmy Wong <[email-masked]> wrote:
>
>> There hasn’t been any new releases since then, should emacs rely on devel packages?
>> On 26 Apr 2023 at 2:37 PM +0100, Eli Zaretskii <[email-masked]>, wrote:
>>
>>>> Date: Wed, 26 Apr 2023 14:26:09 +0100
>>>> From: Jimmy Wong <[email-masked]>
>>>> Cc: Yuan Fu <[email-masked]>, Eli Zaretskii <[email-masked]>,
>>>> [email-masked]
>>>>
>>>> I’m using tree-sitter-go 0.19.1 from Macports.
>>>
>>> That version was released 2 years ago. Maybe go-ts-mode.el relies on
>>>
>>> some newer functionality, or on some bug that was fixed since then?
>
> tree-sitter-go and a bunch of other grammars have dropped the ball of versioning, I think (some don't even try to version properly...). Since then there have plenty of changes, but it's stayed at the same version with no new tags. Anything packaging based on the tags of those repositories is going to be wildly out of date.
>
> You can try using `M-x treesit-install-language-grammar` to install the go grammar, which will get the latest and greatest.
>
>>
>
> If I had to guess what triggers the error, it's probably the (iota) match which seems to have been added Jan 5, 2022. You can try removing that from go-ts-mode and seeing if it fixes the issue for you (although maybe that will fix the current problem but reveal a bunch more...all of which will be easily resolved by using a more up to date grammar). I'll try to get that old version installed myself and see.
>
> I think java-ts-mode and some others have a helper that checks which queries are supported by testing them, I can make a patch for that if that's the direction we want to go.

I can reproduce this with the latest tagged tree-sitter-go version (v0.19.1 released on on Mar 3, 2021). I've attached a patch fixing it (i.e. go-ts-mode now runs and highlights), if we decide to support those older versions. Hopefully I didn't commit any elisp sins.

Please give it a try if you can, Jimmy. I still recommend that you upgrade to the latest tree-sitter-go (i.e. from the tip of the develop branch) yourself because v0.19.1 has other problems (some valid code can be highlighted as error if using the highest treesit-font-lock-level). And I would recommend that for all of the tree-sitter grammars.

From 90d6ff24b5a9281bbc736c5445008ea5492fcffd Mon Sep 17 00:00:00 2001
From: Randy Taylor <[email-masked]>
Date: Wed, 26 Apr 2023 11:15:45 -0400
Subject: [PATCH] go-ts-mode: Use iota query only if supported (Bug#63086)

iota query support was added on January 5, 2022.  To support older
versions of the tree-sitter-go grammar (like the latest tagged version,
v0.19.1, which was released on March 3, 2021), check if the query is
supported before trying to use it.

* lisp/progmodes/go-ts-mode.el (go-ts-mode--iota-query-supported-p): New
function.
(go-ts-mode--font-lock-settings): Use it.
---
 lisp/progmodes/go-ts-mode.el | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/lisp/progmodes/go-ts-mode.el b/lisp/progmodes/go-ts-mode.el
index 77c97ffac11..7d515263932 100644
--- a/lisp/progmodes/go-ts-mode.el
+++ b/lisp/progmodes/go-ts-mode.el
@@ -105,6 +105,12 @@ go-ts-mode--operators
     ">>" "%=" ">>=" "--" "!"  "..."  "&^" "&^=" "~")
   "Go operators for tree-sitter font-locking.")
 
+(defun go-ts-mode--iota-query-supported-p ()
+  "Returns t if the iota query is supported by the current version of
+the tree-sitter-go grammar."
+  (ignore-errors
+    (treesit-query-capture 'go '((iota) @font-lock-constant-face))))
+
 (defvar go-ts-mode--font-lock-settings
   (treesit-font-lock-rules
    :language 'go
@@ -117,7 +123,9 @@ go-ts-mode--font-lock-settings
 
    :language 'go
    :feature 'constant
-   '([(false) (iota) (nil) (true)] @font-lock-constant-face
+   `([(false) (nil) (true)] @font-lock-constant-face
+     ,@(when (go-ts-mode--iota-query-supported-p)
+         '((iota) @font-lock-constant-face))
      (const_declaration
       (const_spec name: (identifier) @font-lock-constant-face)))
 
-- 
2.40.1