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:
({()});
/(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:
>> (
>>
>>
>> );
>> 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 = (
>>
>>
>> );
>>
>> 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"))))))
>