Subject: bug#66988: 30.0.50; treesit-forward-sexp not working properly in js-ts-mode and tsx-ts-mode

From: Loïc Lemaître <[email-masked]>
Date: Sat, 11 Nov 2023 16:43:06 +0100

Thanks for the patch ! It fixes the bug.
But unfortunatly, there is another similar bug in 
/treesit-forward-sexp/, that you can reproduce with that example:
({(<A></A>)});

/(treesit-forward-sexp)/ does not work as expected for both the opening 
parentheses and the brace.

I have checked that it is not a regression due to the patch. That said,  
the patch changes the results (that are not what we expect in any cases).

Loïc

Le 10/11/2023 à 02:41, Dmitry Gutov a écrit :
> Hi!
>
> On 07/11/2023 16:56, Loïc Lemaître wrote:
>> Hi Emacs team,
>>
>> Here the steps to demonstrate the bug :
>>
>> 1. Compile Emacs from master branch with tree-sitter support
>> 2. Install javascript and tsx languages
>> 3. Run Emacs
>> 4. Create a new buffer
>> 5. Turn major mode to either js-ts-mode or tsx-ts-mode
>> 6. Past the following content into the buffer:
>> (
>>    <div>
>>    </div>
>> );
>> 7. Place point before opening parenthese
>> 8. M-x forward-sexp (which will call treesit-forward-sexp)
>>
>> => New position is right after the semi-colon instead of being before 
>> the semi-colon.
>>
>> Note that the bug disappear if the buffer content is changed for :
>> const component = (
>>    <div>
>>    </div>
>> );
>>
>> But previous content, while not being very usefull, is valid JSX, as 
>> far as I know.
>> I use this syntax for unit test purpose, since it is very short.
>
> Thanks for the report.
>
> The patch below should fix it.
>
> Yuan, what do you think? A similar change (bos and eos anchors) might 
> be useful for other things and other modes.
>
> Alternatively, treesit-thing-settings could be interpreted to imply 
> full matches, then the code using it should not only match against the 
> regexps but also check that the entire string (type name) is matched.
>
> Also Cc'ing Theodor.
>
> diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
> index 5a669fdbd42..d81fa9ed322 100644
> --- a/lisp/progmodes/js.el
> +++ b/lisp/progmodes/js.el
> @@ -3843,6 +3843,7 @@ js--treesit-sexp-nodes
>      "undefined"
>      "arguments"
>      "pair"
> +    "parenthesized_expression"
>      "jsx")
>    "Nodes that designate sexps in JavaScript.
>  See `treesit-thing-settings' for more information.")
> @@ -3886,7 +3887,7 @@ js-ts-mode
>
>      (setq-local treesit-thing-settings
>                  `((javascript
> -                   (sexp ,(regexp-opt js--treesit-sexp-nodes))
> +                   (sexp ,(format "\\`%s\\'" (regexp-opt 
> js--treesit-sexp-nodes)))
>                     (sentence ,(regexp-opt js--treesit-sentence-nodes))
>                     (text ,(regexp-opt '("comment"
>                                          "template_string"))))))
>