GNU bug report logs - #66845
29.1; cmake-ts-mode indentation broken

Previous Next

Package: emacs;

Reported by: Juan Palacios <jpalaciosdev <at> gmail.com>

Date: Tue, 31 Oct 2023 11:37:02 UTC

Severity: normal

Tags: patch

Found in version 29.1

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #11 received at 66845 <at> debbugs.gnu.org (full text, mbox):

From: Randy Taylor <dev <at> rjt.dev>
To: Juan Palacios <jpalaciosdev <at> gmail.com>
Cc: 66845 <at> debbugs.gnu.org, Yuan Fu <casouri <at> gmail.com>
Subject: Re: bug#66845: 29.1; cmake-ts-mode indentation broken
Date: Wed, 01 Nov 2023 02:45:26 +0000
[Message part 1 (text/plain, inline)]
On Tuesday, October 31st, 2023 at 07:35, Juan Palacios <jpalaciosdev <at> gmail.com> wrote:
> Using cmake grammar from https://github.com/uyha/tree-sitter-cmake
> 
> Reproduction:
> 1. emacs -q
> 2. C-x C-f test.cmake
> 3. M-x cmake-ts-mode
> 4. Insert the following text:
> if(TRUE)
> message("indent")
> endif()
> 5. Move the point to the beginning of the second line.
> 6. TAB
> 7. Notice that no indentation is performed.
> 
> treesit-simple-indent-rules local value:
> ((cmake
> ((node-is ")")
> parent-bol 0)
> ((node-is "else_command")
> parent-bol 0)
> ((node-is "elseif_command")
> parent-bol 0)
> ((node-is "endforeach_command")
> parent-bol 0)
> ((node-is "endfunction_command")
> parent-bol 0)
> ((node-is "endif_command")
> parent-bol 0)
> ((parent-is "foreach_loop")
> parent-bol cmake-ts-mode-indent-offset)
> ((parent-is "function_def")
> parent-bol cmake-ts-mode-indent-offset)
> ((parent-is "if_condition")
> parent-bol cmake-ts-mode-indent-offset)
> ((parent-is "normal_command")
> parent-bol cmake-ts-mode-indent-offset)))
> 
> treesit-explore-mode shows:
> (if_condition
> (if_command (if) (
> (argument_list
> (argument (unquoted_argument)))
> ))
> (body
> (normal_command (identifier) (
> (argument_list
> (argument
> (quoted_argument " (quoted_element) ")))
> )))
> (endif_command (endif) ( )))
> 

I've attached a patch fixing this while retaining compatibility with
older grammars. 2 new versions of the grammar, v0.3.0 and v0.4.0
(and anything beyond for now) wrap things in new nodes.

Yuan,
It's been awhile since I've touched any tree-sitter stuff so I'm
probably missing something obvious, but it seems to me like the
function I've added in the patch
(cmake-ts-mode--argument-list-body-offset) is working around a bug
somewhere? I'm not sure why the start of line_comment is considered
parent-bol for indentation.

For example, with this test cmake file: (test.cmake)
if(TRUE)
  # Comment.
  message("indent")
endif()

We get:
(source_file
 (if_condition
  (if_command (if) (
   (argument_list
    (argument (unquoted_argument)))
   ))
  (body (line_comment)
   (normal_command (identifier) (
    (argument_list
     (argument
      (quoted_argument " (quoted_element) ")))
    )))
  (endif_command (endif) ( ))))

With cmake-ts-mode--argument-list-body-offset always returning
cmake-ts-mode-indent-offset (which is what I would expect), the
`parent-is "body"` rule will cause this indentation:
if(TRUE)
  # Comment.
    message("indent")
endif()

Am I being silly or is there indeed something odd going on?
[0001-Fix-cmake-ts-mode-indentation-Bug-66845.patch (text/x-patch, attachment)]

This bug report was last modified 1 year and 195 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.