From 276bc3337b27bcd76aa2735ed96c160c6a1b573a Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Sat, 14 Dec 2013 08:46:13 +0200 Subject: [PATCH] Fix bug#16118 * lisp/progmodes/ruby-mode.el (ruby-smie-rules): Return nil before open-paren tokens when preceded by a open-paren, too. (ruby-smie-rules): Handle virtual indentation after open-paren tokens specially. If there is code between it and eol, return the column where is starts. * test/indent/ruby.rb: New examples. --- lisp/ChangeLog | 8 ++++++++ lisp/progmodes/ruby-mode.el | 17 +++++++++++++--- test/ChangeLog | 4 ++++ test/indent/ruby.rb | 39 +++++++++++++++++++++++++++++++++---- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ce088032faa..62045b9cb64 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2013-12-14 Dmitry Gutov + + * progmodes/ruby-mode.el (ruby-smie-rules): Return nil before + open-paren tokens when preceded by a open-paren, too. + (ruby-smie-rules): Handle virtual indentation after open-paren + tokens specially. If there is code between it and eol, return the + column where is starts (Bug#16118). + 2013-12-13 Teodor Zlatanov * progmodes/cfengine.el: Fix `add-hook' doc. diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index af7a4d8c321..13f7335d042 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -549,10 +549,21 @@ It is used when `ruby-encoding-magic-comment-style' is set to `custom'." (ruby-smie--indent-to-stmt)) ((smie-rule-hanging-p) ;; Treat purely syntactic block-constructs as being part of their parent, - ;; when the opening statement is hanging. + ;; when the opening token is hanging and the parent is not an open-paren. (let ((state (smie-backward-sexp 'halfsexp))) - (when (eq t (car state)) (goto-char (cadr state)))) - (cons 'column (smie-indent-virtual))))) + (unless (and (eq t (car state)) + (not (eq (cadr state) (point-min)))) + (cons 'column (smie-indent-virtual))))))) + (`(:after . ,(or `"(" "[" "{")) + ;; FIXME: Shouldn't this be the default behavior of + ;; `smie-indent-after-keyword'? + (save-excursion + (forward-char 1) + (skip-chars-forward " \t") + ;; `smie-rule-hanging-p' is not good enough here, + ;; because we want to accept hanging tokens at bol, too. + (unless (or (eolp) (forward-comment 1)) + (cons 'column (current-column))))) (`(:after . " @ ") (smie-rule-parent)) (`(:before . "do") (ruby-smie--indent-to-stmt)) (`(,(or :before :after) . ".") diff --git a/test/ChangeLog b/test/ChangeLog index 6f75b33af95..ffa12498de4 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,7 @@ +2013-12-14 Dmitry Gutov + + * indent/ruby.rb: New examples. + 2013-12-12 Fabián Ezequiel Gallina * automated/python-tests.el (python-indent-dedenters-2): New test. diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb index 3c4d68a97bf..7b85899577c 100644 --- a/test/indent/ruby.rb +++ b/test/indent/ruby.rb @@ -45,10 +45,41 @@ foo = { a: b, a1: b1 } -foo({ - a: b, - c: d - }) +foo({ # bug#16118 + a: b, + c: d + } + ) # bug#16116 + +bar = foo( + a, [ + 1, + ], + :qux => [ + 3 + ] + ) + +foo( + [ + { + a: b + }, + ], + { + c: d + } +) + +foo([{ + a: 2 + }, + { + b: 3 + }, + 4 + ] + ) foo = [ # ruby-deep-indent-disabled 1 -- 2.39.2