Subject: Re: bug#64442: 29.0.92; treesit-beginning-of-defun fails in DEFUN functions in C

From: Yuan Fu <[email-masked]>
Date: Tue, 4 Jul 2023 01:41:22 -0700

> On Jul 3, 2023, at 10:13 AM, Eli Zaretskii <[email-masked]> wrote:
> 
> To reproduce:
> 
>  emacs -Q
>  C-x C-f src/dispnew.c RET
>  M-x c-ts-mode RET
>  C-u 220 M-g g
>  C-M-a
> 
> Observe that instead of going to the beginning of
> dump-redisplay-history, the function to which line 220 of dispnew.c
> belongs, point goes to the beginning of the previous function, which
> happens to be add_frame_display_history.
> 
> Can we please fix treesit-beginning-of-defun such that it recognizes C
> functions defined via DEFUN?

I’ve tried it when I was fixing fontification for DEFUN, but ultimately gave up. The tree-sitter defun movement functions searches for defun nodes bottom-up, and goes to the beginning or end of that node. 

The problem with DEFUN’s is that a DEFUN is really made of two nodes in the parse tree. One for the DEFUN part, one for the body, and there isn’t a parent node that encloses the two. 

The defun movement functions are not designed to handle a construct made of two adjacent nodes. They can find a node, go to the beginning/end of it; they can’t find a node, and go to the end of the next node.

It sounds easy to add some hack to handle it, but really isn’t. Defun movement need to support forward/backward to beg/end, that’s four movement types; on top of that you have nested defun’s.

Yuan