[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
emacs-29 f2bedf695c 1/4: ruby-ts-mode: Handle indent in parenless calls
From: |
Dmitry Gutov |
Subject: |
emacs-29 f2bedf695c 1/4: ruby-ts-mode: Handle indent in parenless calls much closer to ruby-mode |
Date: |
Wed, 18 Jan 2023 22:28:08 -0500 (EST) |
branch: emacs-29
commit f2bedf695c15da93e8e240ad11a350a8dc8b5549
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>
ruby-ts-mode: Handle indent in parenless calls much closer to ruby-mode
* lisp/progmodes/ruby-ts-mode.el (ruby-ts--parent-call-or-bol):
New function.
(ruby-ts--indent-rules): Use it for cases which need special
anchoring logic when inside a parenless method call.
Remove the ad-hoc handling of pair-hash-pair etc indentation,
which was there only for the parenless cases, apparently.
Have "No paren, ruby-parenless-call-arguments-indent is nil" case
align to the statement, if only because ruby-mode does that.
* test/lisp/progmodes/ruby-ts-mode-tests.el:
Run indent test for ruby-parenless-call-arguments-indent.rb.
---
lisp/progmodes/ruby-ts-mode.el | 69 ++++++++++++++++++++-----------
test/lisp/progmodes/ruby-ts-mode-tests.el | 1 +
2 files changed, 46 insertions(+), 24 deletions(-)
diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el
index 27e5d00288..3a6d513c33 100644
--- a/lisp/progmodes/ruby-ts-mode.el
+++ b/lisp/progmodes/ruby-ts-mode.el
@@ -680,14 +680,15 @@ a statement container is a node that matches
;; 2) With paren, 1st arg on next line
((and (query "(argument_list \"(\" _ @indent)")
(node-is ")"))
- parent-bol 0)
+ ruby-ts--parent-call-or-bol 0)
((query "(argument_list \"(\" _ @indent)")
- parent-bol ruby-indent-level)
+ ruby-ts--parent-call-or-bol ruby-indent-level)
;; 3) No paren, ruby-parenless-call-arguments-indent is t
((and ruby-ts--parenless-call-arguments-indent-p (parent-is
"argument_list"))
first-sibling 0)
;; 4) No paren, ruby-parenless-call-arguments-indent is nil
- ((parent-is "argument_list") (ruby-ts--bol
ruby-ts--grand-parent-node) ruby-indent-level)
+ ((parent-is "argument_list")
+ (ruby-ts--bol ruby-ts--statement-ancestor) ruby-indent-level)
;; Old... probably too simple
((parent-is "block_parameters") first-sibling 1)
@@ -718,27 +719,10 @@ a statement container is a node that matches
((and ruby-ts--same-line-hash-array-p (parent-is "array"))
(nth-sibling 0 ruby-ts--true) 0)
- ;; NOTE to folks trying to understand my insanity...
- ;; I having trouble understanding the "logic" of why things
- ;; are indented like they are so I am adding special cases
- ;; hoping at some point I will be struck by lightning.
- ((and (n-p-gp "}" "hash" "pair")
- (not ruby-ts--same-line-hash-array-p))
- grand-parent 0)
- ((and (n-p-gp "pair" "hash" "pair")
- (not ruby-ts--same-line-hash-array-p))
- grand-parent ruby-indent-level)
- ((and (n-p-gp "}" "hash" "method")
- (not ruby-ts--same-line-hash-array-p))
- grand-parent 0)
- ((and (n-p-gp "pair" "hash" "method")
- (not ruby-ts--same-line-hash-array-p))
- grand-parent ruby-indent-level)
-
- ((match "}" "hash") parent-bol 0)
- ((parent-is "hash") parent-bol ruby-indent-level)
- ((match "]" "array") parent-bol 0)
- ((parent-is "array") parent-bol ruby-indent-level)
+ ((match "}" "hash") ruby-ts--parent-call-or-bol 0)
+ ((parent-is "hash") ruby-ts--parent-call-or-bol ruby-indent-level)
+ ((match "]" "array") ruby-ts--parent-call-or-bol 0)
+ ((parent-is "array") ruby-ts--parent-call-or-bol ruby-indent-level)
((match ")" "parenthesized_statements") parent-bol 0)
((parent-is "parenthesized_statements") parent-bol
ruby-indent-level)
@@ -798,9 +782,46 @@ a statement container is a node that matches
(goto-char (treesit-node-start parent))
(when (string-match-p ruby-ts--statement-container-regexp
(treesit-node-type (treesit-node-parent parent)))
+ ;; Hack alert: it's not the proper place to alter the offset.
+ ;; Redoing the analysis in the OFFSET form seems annoying,
+ ;; though. (**)
(forward-char ruby-indent-level))
(point)))
+(defun ruby-ts--parent-call-or-bol (_not parent _bol &rest _)
+ (let* ((parent-bol (save-excursion
+ (goto-char (treesit-node-start parent))
+ (back-to-indentation)
+ (point)))
+ (found
+ (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)))
+ (cond
+ ;; No parenless call found on the current line.
+ ((<= (treesit-node-start found) parent-bol)
+ parent-bol)
+ ;; Parenless call found: indent to stmt with offset.
+ ((not ruby-parenless-call-arguments-indent)
+ (save-excursion
+ (goto-char (treesit-node-start
+ (ruby-ts--statement-ancestor found)))
+ ;; (**) Same.
+ (+ (point) ruby-indent-level)))
+ ;; Indent to the parenless call args beginning.
+ (t
+ (save-excursion
+ (goto-char (treesit-node-start found))
+ (point))))))
+
(defun ruby-ts--after-op-indent-p (&rest _)
ruby-after-operator-indent)
diff --git a/test/lisp/progmodes/ruby-ts-mode-tests.el
b/test/lisp/progmodes/ruby-ts-mode-tests.el
index 1d2cfbfb90..d34c235e82 100644
--- a/test/lisp/progmodes/ruby-ts-mode-tests.el
+++ b/test/lisp/progmodes/ruby-ts-mode-tests.el
@@ -255,6 +255,7 @@ The whitespace before and including \"|\" on each line is
removed."
(ruby-ts-deftest-indent "ruby-block-indent.rb")
(ruby-ts-deftest-indent "ruby-method-call-indent.rb")
(ruby-ts-deftest-indent "ruby-method-params-indent.rb")
+(ruby-ts-deftest-indent "ruby-parenless-call-arguments-indent.rb")
(provide 'ruby-ts-mode-tests)