emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How does c-ts-mode, tree-sitter indentation, and preprocessor direct


From: Eli Zaretskii
Subject: Re: How does c-ts-mode, tree-sitter indentation, and preprocessor directives work?
Date: Thu, 28 Nov 2024 09:30:57 +0200

> From: Björn Lindqvist <bjourne@gmail.com>
> Date: Thu, 28 Nov 2024 00:27:17 +0100
> 
> I've been trying to get c-ts-mode to indent like I want, but I'm
> running into problems related to preprocessor directives.

Preprocessor directives are difficult because the tree-sitter C/C++
grammars include only partial support for them.

> For
> example, consider a type definition nested in two #ifdefs:
> 
>     #ifdef X
>     #ifdef Y
>     typedef int foo;
>     #endif
>     #endif
> 
> Since both the parent and grand parent of the type_definition is a
> preproc_ifdef no rule matches.

But if you go back (up) the parent-child hierarchy, you will
eventually find a node which is not a preproc_SOMETHING, and can go
from there, no?

> Another issue is that I want my
> preprocessor directives kept at column 0, which unfortunately screws
> up all rules that refer to the parent. E.g.:
> 
>     ((parent-is "if_statement") standalone-parent 4)
> 
> Doesn't work for
> 
>     int main() {
>         if (true)
>     #ifdef A
>             prutt();
>     #else
>             fis();
>     #endif
>     }
> 
> The rule I'd like to express is "take the indent of the closest
> *indenting* parent and add one indent". That rule would match whether
> that parent is a "while_statement", "if_statement", "for_statement",
> etc. You can't express such rules with tree-sitter, can you?

Not sure, but Yuan will know.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]