Subject: bug#59853: 30.0.50; tree-sitter modes have unexpected beginning-of-defun behavior

From: Theodor Thornhill <[email-masked]>
Date: Tue, 06 Dec 2022 11:36:31 +0100

Brian Leung <[email-masked]> writes:

> Thanks for your response!
>
> Theodor Thornhill <[email-masked]> writes:
>
>>> public abstract class Class {
>>>     public static interface Interface {
>>>         void someMethod();
>>>
>>>         void [o]therMethod();
>>>     }
>>> }
>>>
>>> If point is at the "o" in otherMethod, pressing C-M-a in 
>>> java-ts-mode
>>> moves point to the beginning of that line. However, in 
>>> java-mode, point
>>> moves to the beginning of Interface's declaration.
>>>
>>
>> I see.  To me this looks like java-ts-mode is "correct", in that 
>> the
>> next step "outwards" is to the method start itself.  The point 
>> is in
>> fact inside the method still, IIUC.  
>
> I don't actually know Java, so my expectations/intuition for what 
> is "right" may be off. But from what I've read about, interfaces 
> should be used to group methods with empty bodies. Body-less forms 
> don't particularly feel like defuns to me, which is why I bring 
> this up. Additionally, interactively using narrow-to-defun in 
> java-ts-mode when point is inside the interface body produces 
> unusual results:
>
>> public abstract class Class {
>>     public static interface Interface {
>>         void someMethod();
>> * *
>>         void otherMethod();
>>     *}*
>> }

Not sure I can reproduce this.  I made two files:

```
package Foo;

import some.thing;

interface Foo {
    void foo();
}
````

```
package Foo;

import some.thing;

public abstract class Fooo {
    public static interface Foo {
        void foo();
    }
}
```

In the first one, when point is on the 'f' of 'foo()' I get narrowed to
that line.  If I'm at column 0 of the same line, I see the whole
interface, but not the package declaration or import statement.  That
seems correct to me.  Also I see similar results on the other file.

What am I missing?

>>> def outer():
>>>     def inner(i):
>>>         return i
>>>
>>>     [r]eturn 42
>>>
>>> If point is at the "r" in the outer return statement, pressing 
>>> C-M-a in
>>> python-ts-mode moves point to the beginning of the line where 
>>> the
>>> function "inner" is declared. However, in python-mode, point 
>>> moves to
>>> the beginning of the line where "outer" is declared.
>>>
>>
>> In this case I think python-mode is correct, becase the 'inner' 
>> function
>> is a sibling to the return statement, and it would make sense to 
>> go
>> directly to outer.
>
> Yeah, I agree here.

Great! This sounds like a different bug report though.

Theo