ruby-method-params-indent: New user option

* lisp/progmodes/ruby-mode.el (ruby-method-params-indent):
New option (bug#60110).

(ruby-smie-rules): Use it.

* etc/NEWS: Mention it.

* test/lisp/progmodes/ruby-mode-resources/ruby.rb:
Ensure the var's value is default.

* test/lisp/progmodes/ruby-mode-resources/ruby-method-params-indent.rb:
New file.

* test/lisp/progmodes/ruby-mode-tests.el (ruby-deftest-indent):
New macro, use it to run the indentation test using the new file.
Disable the :expensive-test tag, because neither runs for "longer
than some few seconds", both take significantly below 1s.
This commit is contained in:
Dmitry Gutov 2022-12-19 21:01:27 +02:00
parent b9e813f79f
commit 2b1fdbffcb
5 changed files with 62 additions and 13 deletions

View file

@ -2761,6 +2761,9 @@ project-dedicated or global) is specified by the new
--- ---
*** Support for endless methods. *** Support for endless methods.
---
*** New user option 'ruby-method-params-indent'.
** Eshell ** Eshell
+++ +++

View file

@ -268,6 +268,23 @@ Only has effect when `ruby-use-smie' is t."
:safe 'booleanp :safe 'booleanp
:version "24.4") :version "24.4")
(defcustom ruby-method-params-indent t
"Indentation of multiline method parameters.
When t, the parameters list is indented to the method name.
When a number, indent the parameters list this many columns
against the beginning of the method (the \"def\" keyword).
The value nil means the same as 0.
Only has effect when `ruby-use-smie' is t."
:type '(choice (const :tag "Indent to the method name" t)
(number :tag "Indent specified number of columns against def")
(const :tag "Indent to def" nil))
:safe (lambda (val) (or (memq val '(t nil)) (numberp val)))
:version 29.1)
(defcustom ruby-deep-arglist t (defcustom ruby-deep-arglist t
"Deep indent lists in parenthesis when non-nil. "Deep indent lists in parenthesis when non-nil.
Also ignores spaces after parenthesis when `space'. Also ignores spaces after parenthesis when `space'.
@ -660,9 +677,12 @@ This only affects the output of the command `ruby-toggle-block'."
(unless (or (eolp) (forward-comment 1)) (unless (or (eolp) (forward-comment 1))
(cons 'column (current-column))))) (cons 'column (current-column)))))
('(:before . " @ ") ('(:before . " @ ")
(save-excursion (if (or (eq ruby-method-params-indent t)
(skip-chars-forward " \t") (not (smie-rule-parent-p "def" "def=")))
(cons 'column (current-column)))) (save-excursion
(skip-chars-forward " \t")
(cons 'column (current-column)))
(smie-rule-parent (or ruby-method-params-indent 0))))
('(:before . "do") (ruby-smie--indent-to-stmt)) ('(:before . "do") (ruby-smie--indent-to-stmt))
('(:before . ".") ('(:before . ".")
(if (smie-rule-sibling-p) (if (smie-rule-sibling-p)

View file

@ -0,0 +1,18 @@
class C
def self.foo(
baz,
bar
) =
what
def foo=(
baz,
bar
)
hello
end
end
# Local Variables:
# ruby-method-params-indent: 0
# End:

View file

@ -538,3 +538,7 @@ def baz.full_name = "#{bar} 3"
baz baz
end end
end end
# Local Variables:
# ruby-method-params-indent: t
# End:

View file

@ -943,16 +943,20 @@ VALUES-PLIST is a list with alternating index and value elements."
"Blub#bye" "Blub#bye"
"Blub#hiding"))))) "Blub#hiding")))))
(ert-deftest ruby--indent/converted-from-manual-test () (defmacro ruby-deftest-indent (file)
:tags '(:expensive-test) `(ert-deftest ,(intern (format "ruby-indent-test/%s" file)) ()
;; Converted from manual test. ;; :tags '(:expensive-test)
(let ((buf (find-file-noselect (ert-resource-file "ruby.rb")))) (let ((buf (find-file-noselect (ert-resource-file ,file))))
(unwind-protect (unwind-protect
(with-current-buffer buf (with-current-buffer buf
(let ((orig (buffer-string))) (let ((orig (buffer-string)))
(indent-region (point-min) (point-max)) ;; Indent and check that we get the original text.
(should (equal (buffer-string) orig)))) (indent-region (point-min) (point-max))
(kill-buffer buf)))) (should (equal (buffer-string) orig))))
(kill-buffer buf)))))
(ruby-deftest-indent "ruby.rb")
(ruby-deftest-indent "ruby-method-params-indent.rb")
(ert-deftest ruby--test-chained-indentation () (ert-deftest ruby--test-chained-indentation ()
(with-temp-buffer (with-temp-buffer