Subject: bug#62086: 29.0.60; ruby-ts-mode regressions

From: Juri Linkov <[email-masked]>
Date: Wed, 05 Apr 2023 09:24:24 +0300

>> I wonder is it possible to fix more.
>> Many parens/brackets are still not matched in e.g.
>> test/lisp/progmodes/ruby-mode-resources/ruby.rb
>> such as parens in def argument list:
>>    def test1(arg)
>
> This one was a regression from the addition of strict bos/eos anchors, now
> fixed.

Maybe there are more types that now are not found, but probably easier
to add them one by one after testing than to try finding all of them in
https://github.com/tree-sitter/tree-sitter-ruby/blob/master/src/node-types.json
or in
https://github.com/tree-sitter/tree-sitter-ruby/blob/master/src/grammar.json

>> and in
>>    method (a + b),
>
> When you say that this is broken, do you mean that these parens get jumped
> over unexpectedly (with forward-sexp movement ending at the end of the
> arguments list)?

It seems natural to expect that when point is on an opening paren/bracket
then 'C-M-f' should jump to its closing pair.  At least, this is more WYSIWYG.

> This is an artefact of the implementation of treesit-forward-sexp.
> It might be possible to improve, but from a brief dig, it has some
> internal logic. So some care would need to be taken to decide which
> contract nedds changing.

This is an example where explicit parens conflict with implicit parens.
Visible parens have the type "parenthesized_statements", but invisible
parens have the type "argument_list".  Both start at the same position.
So maybe treesit-forward-sexp should prefer the former over the latter?
And in a similar case

  method [],
         arg2

maybe "array" should take precedence over "argument_list".

>> Also square brackets are not matched by 'C-M-f' in
>>    h[:key]
>
> And this, surprisingly, seems impossible to handle just using
> treesit-sexp-type-regexp. The brackets are present in the tree, but they
> are not at the ends of any node. So that will require some custom Lisp,
> I guess.

This is the same problem that occurs in other places such as in "#{ddf}"
where only '#' but not '{' matches '}'.  So adding "element_reference"
will allow to jump only from the beginning of an identifier.