]> git.eshelyaron.com Git - emacs.git/commitdiff
(ruby-ts--parent-call-or-bol): Handle more cases with nested literals
authorDmitry Gutov <dgutov@yandex.ru>
Thu, 19 Jan 2023 03:10:05 +0000 (05:10 +0200)
committerDmitry Gutov <dgutov@yandex.ru>
Thu, 19 Jan 2023 03:27:43 +0000 (05:27 +0200)
* lisp/progmodes/ruby-ts-mode.el (ruby-ts--parent-call-or-bol):
Handle more cases with nested literals.

* test/lisp/progmodes/ruby-mode-resources/ruby-ts.rb: Add examples.

lisp/progmodes/ruby-ts-mode.el
test/lisp/progmodes/ruby-mode-resources/ruby-ts.rb

index 5df7e397f035fdabd5eda949638b5b80cb8e414b..a2b2721dc1b63b603591483d191d58ce520b4f7f 100644 (file)
@@ -796,18 +796,21 @@ a statement container is a node that matches
           (treesit-parent-until
            parent
            (lambda (node)
-             (or (<= (treesit-node-start node) parent-bol)
-                 (and
-                  ;; Parenless call.
-                  (equal (treesit-node-type node) "argument_list")
-                  (not (equal (treesit-node-type
-                               (treesit-node-child node 0))
-                              "(")))))
-           t)))
+             (or (< (treesit-node-start node) parent-bol)
+                 (string-match-p "\\`array\\|hash\\'" (treesit-node-type node))
+                 ;; Method call on same line.
+                 (equal (treesit-node-type node) "argument_list"))))))
     (cond
-     ;; No parenless call found on the current line.
-     ((<= (treesit-node-start found) parent-bol)
+     ((null found)
       parent-bol)
+     ;; No paren/curly/brace found on the same line.
+     ((< (treesit-node-start found) parent-bol)
+      parent-bol)
+     ;; Hash or array opener on the same line.
+     ((string-match-p "\\`array\\|hash\\'" (treesit-node-type found))
+      (save-excursion
+        (goto-char (treesit-node-start (treesit-node-child found 1)))
+        (point)))
      ;; Parenless call found: indent to stmt with offset.
      ((not ruby-parenless-call-arguments-indent)
       (save-excursion
@@ -815,6 +818,12 @@ a statement container is a node that matches
                     (ruby-ts--statement-ancestor found)))
         ;; (**) Same.
         (+ (point) ruby-indent-level)))
+     ;; Call with parens -- ident to first arg.
+     ((equal (treesit-node-type (treesit-node-child found 0))
+             "(")
+      (save-excursion
+        (goto-char (treesit-node-start (treesit-node-child found 1)))
+        (point)))
      ;; Indent to the parenless call args beginning.
      (t
       (save-excursion
index 1f7caf64c343a64f5b0960a1ef90cd4aefd81190..fa16107c56eb933c9cd3928b31a19391238b78b0 100644 (file)
@@ -62,6 +62,23 @@ without_paren = a + b *
                     c * d +
                 12
 
+{'a' => {
+   'b' => 'c',
+   'd' => %w(e f)
+ }
+}
+
+[1, 2, {
+   'b' => 'c',
+   'd' => %w(e f)
+ }
+]
+
+foo(a, {
+      a: b,
+      c: d
+    })
+
 # Local Variables:
 # mode: ruby-ts
 # ruby-after-operator-indent: t