bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#74963: Ambiguous treesit named and anonymous nodes in ruby-ts-mode


From: Dmitry Gutov
Subject: bug#74963: Ambiguous treesit named and anonymous nodes in ruby-ts-mode
Date: Wed, 25 Dec 2024 05:25:24 +0200
User-agent: Mozilla Thunderbird

Hi Juri,

On 24/12/2024 09:17, Juri Linkov wrote:
While addition of '(and named "unless")' would be appreciated,
I see that currently it's possible to do this by proving a predicate
like there is 'ruby-ts--sexp-p' in

   (setq-local treesit-thing-settings
               `((ruby
                  (sexp ,(cons (rx
                                bol
                                (or
                                 "class"
                                 ...
                                 )
                                eol)
                               #'ruby-ts--sexp-p))

Then 'ruby-ts--sexp-p' could check for the named node "unless" as well.

But it seems such solution is less efficient than adding '(and named "unless")'.

Given that we're already calling a predicate every time (in ruby-ts-mode), we might as well add one more check. See the patch at the end.

Speaking of tricky examples though, here's a definition:

  module Bar
    class Foo
      def baz
      end
    end
  end

If you move point inside the keyword "module" or "class", C-M-f wouldn't move forward either as of the latest master. No such problem with "def".

Adding the check for "named" fixes the first two cases, but then C-M-f inside "def" jumps to after "baaz". Could be worked around with a special case, but I wonder what this difference comes from (haven't properly debugged yet).

diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el
index 4ef0cb18eae..4b15c6cbf27 100644
--- a/lisp/progmodes/ruby-ts-mode.el
+++ b/lisp/progmodes/ruby-ts-mode.el
@@ -1120,6 +1120,10 @@ ruby-ts--sexp-p
       (equal (treesit-node-type (treesit-node-child node 0))
              "(")))

+(defun ruby-ts--sexp-list-p (node)
+  (when (treesit-node-check node 'named)
+    (ruby-ts--sexp-p node)))
+
 (defvar-keymap ruby-ts-mode-map
   :doc "Keymap used in Ruby mode"
   :parent prog-mode-map
@@ -1235,7 +1239,7 @@ ruby-ts-mode
                            "array"
                            "hash")
                           eol)
-                         #'ruby-ts--sexp-p))
+                         #'ruby-ts--sexp-list-p))
                  (text ,(lambda (node)
                           (or (member (treesit-node-type node)
'("comment" "string_content" "heredoc_content"))






reply via email to

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