summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Gutov <dgutov@yandex.ru>2013-10-21 07:50:06 +0400
committerDmitry Gutov <dgutov@yandex.ru>2013-10-21 07:50:06 +0400
commit8c1ae48154e4c6935da3120362ea535f0dddfec5 (patch)
treed8c450d065eeb0820bbcd4ddd7f9233b73a1af69
parenta9f8deecce02a4acdb5259297878799b69d56a21 (diff)
downloademacs-8c1ae48154e4c6935da3120362ea535f0dddfec5.tar.gz
* lisp/progmodes/ruby-mode.el (ruby-mode-map): Add binding for
`smie-down-list'. (ruby-smie--args-separator-p): Check that there's no newline between method call and its arguments. (ruby-smie-rules): Handle new cases: curly block with and without parameters, hash surrounded with parens, block passed to paren-less method call. * test/indent/ruby.rb: New examples for indentation of blocks. Example of hash inside parens that inflooped before this commit.
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/progmodes/ruby-mode.el47
-rw-r--r--test/ChangeLog5
-rw-r--r--test/indent/ruby.rb25
4 files changed, 63 insertions, 21 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index ecb5ef0e70e..c57ac41171c 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
+2013-10-21 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-mode-map): Add binding for
+ `smie-down-list'.
+ (ruby-smie--args-separator-p): Check that there's no newline
+ between method call and its arguments.
+
2013-10-20 Alan Mackenzie <acm@muc.de>
Allow comma separated lists after Java "implements".
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index a29540ad3a3..6abc525f705 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -152,6 +152,8 @@ This should only be called after matching against `ruby-here-doc-beg-re'."
(define-key map (kbd "M-C-b") 'ruby-backward-sexp)
(define-key map (kbd "M-C-f") 'ruby-forward-sexp)
(define-key map (kbd "M-C-q") 'ruby-indent-exp))
+ (when ruby-use-smie
+ (define-key map (kbd "M-C-d") 'smie-down-list))
(define-key map (kbd "M-C-p") 'ruby-beginning-of-block)
(define-key map (kbd "M-C-n") 'ruby-end-of-block)
(define-key map (kbd "C-c {") 'ruby-toggle-block)
@@ -327,10 +329,10 @@ explicitly declared in magic comment."
(defun ruby-smie--args-separator-p (pos)
(and
+ (< pos (line-end-position))
(or (eq (char-syntax (preceding-char)) '?w)
(and (memq (preceding-char) '(?! ??))
(eq (char-syntax (char-before (1- (point)))) '?w)))
- (< pos (point-max))
(memq (char-syntax (char-after pos)) '(?w ?\"))))
(defun ruby-smie--forward-id ()
@@ -440,20 +442,39 @@ explicitly declared in magic comment."
(`(:elem . args) (if (looking-at "\\s\"") 0))
;; (`(:after . ",") (smie-rule-separator kind))
(`(:after . ";")
- (if (smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
- "while" "until" "unless"
- "if" "then" "elsif" "else" "when"
- "rescue" "ensure")
- (smie-rule-parent ruby-indent-level)
- ;; For (invalid) code between switch and case.
- ;; (if (smie-parent-p "switch") 4)
- 0))
+ (cond
+ ((smie-rule-parent-p "def" "begin" "do" "class" "module" "for"
+ "while" "until" "unless"
+ "if" "then" "elsif" "else" "when"
+ "rescue" "ensure")
+ (smie-rule-parent ruby-indent-level))
+ ((and (smie-rule-parent-p "{")
+ (save-excursion
+ (goto-char (1+ (cadr (smie-indent--parent))))
+ (ruby-smie--opening-pipe-p)
+ (forward-char -1)
+ ;; Can't delegate to `smie-rule-parent' because it
+ ;; short-circuits to `current-column' when the parent
+ ;; token is of paren syntax class and not hanging.
+ (cons 'column (+ (smie-indent-virtual)
+ ruby-indent-level)))))
+ ;; For (invalid) code between switch and case.
+ ;; (if (smie-parent-p "switch") 4)
+ (t 0)))
(`(:before . ,(or `"(" `"[" `"{"))
- ;; Treat purely syntactic block-constructs as being part of their parent,
- ;; when the opening statement is hanging.
- (when (smie-rule-hanging-p)
- (smie-backward-sexp 'halfsexp) (smie-indent-virtual)))
+ (cond
+ ((and (equal token "{")
+ (not (smie-rule-prev-p "(" "{" "[" "," "=>")))
+ ;; Curly block opener.
+ (smie-rule-parent))
+ ((smie-rule-hanging-p)
+ ;; Treat purely syntactic block-constructs as being part of their parent,
+ ;; when the opening statement is hanging.
+ (let ((state (smie-backward-sexp 'halfsexp)))
+ (when (eq t (car state)) (goto-char (cadr state))))
+ (cons 'column (smie-indent-virtual)))))
(`(:after . ,(or "=" "iuwu-mod")) 2)
+ (`(:after . " @ ") (smie-rule-parent))
(`(:before . "do") (smie-rule-parent))
(`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0)
(`(:before . ,(or `"when"))
diff --git a/test/ChangeLog b/test/ChangeLog
index 9a8a61eb062..609a4e2d007 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-21 Dmitry Gutov <dgutov@yandex.ru>
+
+ * indent/ruby.rb: New examples for indentation of blocks. Example
+ of hash inside parens that inflooped before the present commit.
+
2013-10-17 Barry O'Reilly <gundaetiapo@gmail.com>
* test/automated/timer-tests.el: New file. Tests that (sit-for 0)
diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb
index ef89ebc1aa7..56966ebb8c0 100644
--- a/test/indent/ruby.rb
+++ b/test/indent/ruby.rb
@@ -40,6 +40,11 @@ foo = { # ruby-deep-indent-disabled
a: b
}
+foo({
+ a: b,
+ c: d
+ })
+
foo = [ # ruby-deep-indent-disabled
1
]
@@ -165,6 +170,18 @@ method? arg1,
method! arg1,
arg2
+it "is a method call with block" do |asd|
+ foo
+end
+
+it("is too!") {
+ bar
+}
+
+and_this_one(has) { |block, parameters|
+ tee
+}
+
# Examples below still fail with `ruby-use-smie' on:
foo +
@@ -192,11 +209,3 @@ method :foo,
method (a + b),
c
-
-it "is a method call with block" do
- foo
-end
-
-it("is too!") {
- bar
-}