Subject: bug#66183: elixir-ts-mode test failure

From: Yuan Fu <[email-masked]>
Date: Tue, 26 Sep 2023 11:00:23 -0700

> On Sep 26, 2023, at 9:30 AM, Wilhelm Kirschbaum <[email-masked]> wrote:
> 
> 
> Yuan Fu <[email-masked]> writes:
> 
>>> On Sep 24, 2023, at 9:53 AM, john muhl via Bug reports for GNU
>>> Emacs, the Swiss army knife of text editors <[email-masked]>
>>> wrote:
>>> The change in 5cba5ee8905 caused an elixir test to start failing. The
>>> white space at the start of the test is now in a heex range so pressing
>>> tab there matches a heex rule instead of the elixir one. Moving the
>>> dummy range to the end fixes the test.
>> 
>> Thank you. I’ll make sure to remember also running elixir tests when I make a change.
>> 
>> I looked around and found elixir-mode’s language-at-point function
>> works in a way that isn’t what tree-sitter functions
>> expect. Tree-sitter functions expect the major mode to derive language
>> at point by querying the host language and do some pattern matching,
>> rather than using language parser’s range. I took a quick look at
>> elixir’s grammar and came up with this version for a POC. You probably
> 
> Sorry about that.  I had absolutely no idea how it was expected to work.

It’s absolutely my fault :-) Several people have had confusion about it, because the docstring wasn’t clear enough. I’ve updated the docstring so hopefully this confusion won’t occur in the future.

> 
>> need to adjust it but the idea is there.
>> 
>> With the new language-at-point definition, treesit-language-at can
>> return the correct language, and the test passes again.
>> 
>> Yuan
>> 
>> [2. text/x-patch; example.diff]...
> 
> This seems to work if you set named on: treesit-node-prev-sibling,
> otherwise it just tries to match the \"\"\" against H or F.
> 
>  (let* ((node (treesit-node-at point 'elixir)))
>    (if (and (equal (treesit-node-type node) "quoted_content")
>             (string-match-p
>              (rx bos (or "H" "F") eos)
> -              (treesit-node-text (treesit-node-prev-sibling               node))))
> +              (treesit-node-text (treesit-node-prev-sibling node t))))
>        'heex
>      'elixir)))
> 
> I will spend some time in the next couple of hours to catch up to all
> the changes.

Ah, right. I’ll leave the specifics to you. As long as the language is derived from the node at point rather than parser range, it will be fine. Also, there’s no rush.

Yuan