From 5556c0cef106deb5a4614aabf96d223ada151f51 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Tue, 17 Dec 2013 03:31:55 +0200 Subject: [PATCH] Fix bug#16116 * lisp/emacs-lisp/smie.el (smie-indent--rule): Extract `smie-indent--rule-1'. (smie-indent-close): Call `smie-indent--rule-1' with METHOD :close-all, to see which indentation method to use. (smie-rules-function): Document the method :close-all. * test/indent/ruby.rb: Update examples according to the change in `smie-indent-close'. --- lisp/ChangeLog | 7 +++++++ lisp/emacs-lisp/smie.el | 29 ++++++++++++++++++++--------- test/ChangeLog | 5 +++++ test/indent/ruby.rb | 9 +++------ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d267715bee..4835311599 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2013-12-17 Dmitry Gutov + + * emacs-lisp/smie.el (smie-indent--rule): Extract `smie-indent--rule-1'. + (smie-indent-close): Call `smie-indent--rule-1' with METHOD + :close-all, to see which indentation method to use (Bug#16116). + (smie-rules-function): Document the method :close-all. + 2013-12-16 Lars Magne Ingebrigtsen * net/shr.el (shr-tag-a): Support zero-length elements. diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el index 1c468e013d..08bf7348aa 100644 --- a/lisp/emacs-lisp/smie.el +++ b/lisp/emacs-lisp/smie.el @@ -1135,6 +1135,10 @@ METHOD can be: - :list-intro, in which case ARG is a token and the function should return non-nil if TOKEN is followed by a list of expressions (not separated by any token) rather than an expression. +- :close-all, in which case ARG is a close-paren token at indentation and + the function should return non-nil if it should be aligned with the opener + of the last close-paren token on the same line, if there are multiple. + Otherwise, it will be aligned with its own opener. When ARG is a token, the function is called with point just before that token. A return value of nil always means to fallback on the default behavior, so the @@ -1316,8 +1320,8 @@ Only meaningful when called from within `smie-rules-function'." (defun smie-indent--rule (method token ;; FIXME: Too many parameters. &optional after parent base-pos) - "Compute indentation column according to `indent-rule-functions'. -METHOD and TOKEN are passed to `indent-rule-functions'. + "Compute indentation column according to `smie-rules-function'. +METHOD and TOKEN are passed to `smie-rules-function'. AFTER is the position after TOKEN, if known. PARENT is the parent info returned by `smie-backward-sexp', if known. BASE-POS is the position relative to which offsets should be applied." @@ -1330,11 +1334,7 @@ BASE-POS is the position relative to which offsets should be applied." ;; - :after tok, where ;; ; after is set; parent=nil; base-pos=point; (save-excursion - (let ((offset - (let ((smie--parent parent) - (smie--token token) - (smie--after after)) - (funcall smie-rules-function method token)))) + (let ((offset (smie-indent--rule-1 method token after parent))) (cond ((not offset) nil) ((eq (car-safe offset) 'column) (cdr offset)) @@ -1355,6 +1355,12 @@ BASE-POS is the position relative to which offsets should be applied." (smie-indent-virtual) (current-column))))) (t (error "Unknown indentation offset %s" offset)))))) +(defun smie-indent--rule-1 (method token &optional after parent) + (let ((smie--parent parent) + (smie--token token) + (smie--after after)) + (funcall smie-rules-function method token))) + (defun smie-indent-forward-token () "Skip token forward and return it, along with its levels." (let ((tok (funcall smie-forward-token-function))) @@ -1423,8 +1429,13 @@ in order to figure out the indentation of some other (further down) point." (save-excursion ;; (forward-comment (point-max)) (when (looking-at "\\s)") - (while (not (zerop (skip-syntax-forward ")"))) - (skip-chars-forward " \t")) + (if (smie-indent--rule-1 :close-all + (buffer-substring-no-properties + (point) (1+ (point))) + (1+ (point))) + (while (not (zerop (skip-syntax-forward ")"))) + (skip-chars-forward " \t")) + (forward-char 1)) (condition-case nil (progn (backward-sexp 1) diff --git a/test/ChangeLog b/test/ChangeLog index ffa12498de..374cae5a29 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2013-12-17 Dmitry Gutov + + * indent/ruby.rb: Update examples according to the change + in `smie-indent-close'. + 2013-12-14 Dmitry Gutov * indent/ruby.rb: New examples. diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb index 7b85899577..19bc0d03d4 100644 --- a/test/indent/ruby.rb +++ b/test/indent/ruby.rb @@ -48,8 +48,7 @@ foo = { a: b, foo({ # bug#16118 a: b, c: d - } - ) # bug#16116 + }) bar = foo( a, [ @@ -57,8 +56,7 @@ bar = foo( ], :qux => [ 3 - ] - ) + ]) foo( [ @@ -78,8 +76,7 @@ foo([{ b: 3 }, 4 - ] - ) + ]) foo = [ # ruby-deep-indent-disabled 1 -- 2.20.1