[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#64442: 29.0.92; treesit-beginning-of-defun fails in DEFUN functions
From: |
Yuan Fu |
Subject: |
bug#64442: 29.0.92; treesit-beginning-of-defun fails in DEFUN functions in C |
Date: |
Tue, 4 Jul 2023 01:41:22 -0700 |
> On Jul 3, 2023, at 10:13 AM, Eli Zaretskii <eliz@gnu.org> 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