aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Gutov2013-10-22 02:25:59 +0400
committerDmitry Gutov2013-10-22 02:25:59 +0400
commit18cacc392d076dfd78b58e842116c0c578aaf3c7 (patch)
tree49c2ef2ee1f7d002025ecc5ed9364ac1271a0c44
parent1257317a7c3d4052a6c43f2774cd0a6c6057d420 (diff)
downloademacs-18cacc392d076dfd78b58e842116c0c578aaf3c7.tar.gz
emacs-18cacc392d076dfd78b58e842116c0c578aaf3c7.zip
* lisp/progmodes/ruby-mode.el (ruby-smie-grammar): Remove outdated
TODO. Add "." after " @ ". (ruby-smie--at-dot-call): New function. Checks if point at method call with explicit target. (ruby-smie--forward-token, ruby-smie--backward-token): Prepend "." to the method name tokens when it precedes them. (ruby-smie--backward-id, ruby-smie--forward-id): Remove. (ruby-smie-rules): Add rule for indentation before and after "." token.
-rw-r--r--lisp/ChangeLog12
-rw-r--r--lisp/progmodes/ruby-mode.el47
-rw-r--r--test/indent/ruby.rb17
3 files changed, 43 insertions, 33 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2ee8799f62b..9a00661aef9 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,15 @@
12013-10-21 Dmitry Gutov <dgutov@yandex.ru>
2
3 * progmodes/ruby-mode.el (ruby-smie-grammar): Remove outdated
4 TODO. Add "." after " @ ".
5 (ruby-smie--at-dot-call): New function. Checks if point at method
6 call with explicit target.
7 (ruby-smie--forward-token, ruby-smie--backward-token): Prepend "."
8 to the method name tokens when it precedes them.
9 (ruby-smie--backward-id, ruby-smie--forward-id): Remove.
10 (ruby-smie-rules): Add rule for indentation before and after "."
11 token.
12
12013-10-21 Stefan Monnier <monnier@iro.umontreal.ca> 132013-10-21 Stefan Monnier <monnier@iro.umontreal.ca>
2 14
3 * textmodes/remember.el (remember-diary-extract-entries): 15 * textmodes/remember.el (remember-diary-extract-entries):
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 280016317e7..a6e54701ffe 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -251,7 +251,6 @@ explicitly declared in magic comment."
251;; Here's a simplified BNF grammar, for reference: 251;; Here's a simplified BNF grammar, for reference:
252;; http://www.cse.buffalo.edu/~regan/cse305/RubyBNF.pdf 252;; http://www.cse.buffalo.edu/~regan/cse305/RubyBNF.pdf
253(defconst ruby-smie-grammar 253(defconst ruby-smie-grammar
254 ;; FIXME: Add support for Cucumber.
255 (smie-prec2->grammar 254 (smie-prec2->grammar
256 (smie-merge-prec2s 255 (smie-merge-prec2s
257 (smie-bnf->prec2 256 (smie-bnf->prec2
@@ -259,7 +258,8 @@ explicitly declared in magic comment."
259 (insts (inst) (insts ";" insts)) 258 (insts (inst) (insts ";" insts))
260 (inst (exp) (inst "iuwu-mod" exp)) 259 (inst (exp) (inst "iuwu-mod" exp))
261 (exp (exp1) (exp "," exp) (exp "=" exp) 260 (exp (exp1) (exp "," exp) (exp "=" exp)
262 (id " @ " exp)) 261 (id " @ " exp)
262 (exp "." exp))
263 (exp1 (exp2) (exp2 "?" exp1 ":" exp1)) 263 (exp1 (exp2) (exp2 "?" exp1 ":" exp1))
264 (exp2 ("def" insts "end") 264 (exp2 ("def" insts "end")
265 ("begin" insts-rescue-insts "end") 265 ("begin" insts-rescue-insts "end")
@@ -288,7 +288,7 @@ explicitly declared in magic comment."
288 (ielsei (itheni) (itheni "else" insts)) 288 (ielsei (itheni) (itheni "else" insts))
289 (if-body (ielsei) (if-body "elsif" if-body))) 289 (if-body (ielsei) (if-body "elsif" if-body)))
290 '((nonassoc "in") (assoc ";") (right " @ ") 290 '((nonassoc "in") (assoc ";") (right " @ ")
291 (assoc ",") (right "=")) 291 (assoc ",") (right "=") (assoc "."))
292 '((assoc "when")) 292 '((assoc "when"))
293 '((assoc "elsif")) 293 '((assoc "elsif"))
294 '((assoc "rescue" "ensure")) 294 '((assoc "rescue" "ensure"))
@@ -354,14 +354,10 @@ explicitly declared in magic comment."
354 (eq (char-syntax (char-before (1- (point)))) '?w))) 354 (eq (char-syntax (char-before (1- (point)))) '?w)))
355 (memq (char-syntax (char-after pos)) '(?w ?\")))) 355 (memq (char-syntax (char-after pos)) '(?w ?\"))))
356 356
357(defun ruby-smie--forward-id () 357(defun ruby-smie--at-dot-call ()
358 (when (and (not (eobp)) 358 (and (eq ?w (char-syntax (char-after)))
359 (eq ?w (char-syntax (char-after)))) 359 (eq (char-before) ?.)
360 (let ((tok (smie-default-forward-token))) 360 (not (eq (char-before (1- (point))) ?.))))
361 (when (eq ?. (char-after))
362 (forward-char 1)
363 (setq tok (concat tok "." (ruby-smie--forward-id))))
364 tok)))
365 361
366(defun ruby-smie--forward-token () 362(defun ruby-smie--forward-token ()
367 (let ((pos (point))) 363 (let ((pos (point)))
@@ -382,7 +378,10 @@ explicitly declared in magic comment."
382 (ruby-smie--args-separator-p (prog1 (point) (goto-char pos))))) 378 (ruby-smie--args-separator-p (prog1 (point) (goto-char pos)))))
383 " @ ") 379 " @ ")
384 (t 380 (t
385 (let ((tok (smie-default-forward-token))) 381 (let ((dot (ruby-smie--at-dot-call))
382 (tok (smie-default-forward-token)))
383 (when dot
384 (setq tok (concat "." tok)))
386 (cond 385 (cond
387 ((member tok '("unless" "if" "while" "until")) 386 ((member tok '("unless" "if" "while" "until"))
388 (if (save-excursion (forward-word -1) (ruby-smie--bosp)) 387 (if (save-excursion (forward-word -1) (ruby-smie--bosp))
@@ -398,18 +397,8 @@ explicitly declared in magic comment."
398 (line-end-position)) 397 (line-end-position))
399 (ruby-smie--forward-token)) ;Fully redundant. 398 (ruby-smie--forward-token)) ;Fully redundant.
400 (t ";"))) 399 (t ";")))
401 ((equal tok ".") (concat tok (ruby-smie--forward-id)))
402 (t tok))))))))) 400 (t tok)))))))))
403 401
404(defun ruby-smie--backward-id ()
405 (when (and (not (bobp))
406 (eq ?w (char-syntax (char-before))))
407 (let ((tok (smie-default-backward-token)))
408 (when (eq ?. (char-before))
409 (forward-char -1)
410 (setq tok (concat (ruby-smie--backward-id) "." tok)))
411 tok)))
412
413(defun ruby-smie--backward-token () 402(defun ruby-smie--backward-token ()
414 (let ((pos (point))) 403 (let ((pos (point)))
415 (forward-comment (- (point))) 404 (forward-comment (- (point)))
@@ -424,9 +413,9 @@ explicitly declared in magic comment."
424 ;; In some textbooks, "e1 @ e2" is used to mean "call e1 with arg e2". 413 ;; In some textbooks, "e1 @ e2" is used to mean "call e1 with arg e2".
425 " @ ") 414 " @ ")
426 (t 415 (t
427 (let ((tok (smie-default-backward-token))) 416 (let ((tok (smie-default-backward-token))
428 (when (eq ?. (char-before)) 417 (dot (ruby-smie--at-dot-call)))
429 (forward-char -1) 418 (when dot
430 (setq tok (concat "." tok))) 419 (setq tok (concat "." tok)))
431 (when (and (eq ?: (char-before)) (string-match "\\`\\s." tok)) 420 (when (and (eq ?: (char-before)) (string-match "\\`\\s." tok))
432 (forward-char -1) (setq tok (concat ":" tok))) ;; bug#15208. 421 (forward-char -1) (setq tok (concat ":" tok))) ;; bug#15208.
@@ -446,11 +435,6 @@ explicitly declared in magic comment."
446 (line-end-position)) 435 (line-end-position))
447 (ruby-smie--backward-token)) ;Fully redundant. 436 (ruby-smie--backward-token)) ;Fully redundant.
448 (t ";"))) 437 (t ";")))
449 ;; FIXME: We shouldn't merge the dot with preceding token here
450 ;; either, but not doing that breaks indentation of hanging
451 ;; method calls with dot on the first line.
452 ((equal tok ".")
453 (concat (ruby-smie--backward-id) tok))
454 (t tok))))))) 438 (t tok)))))))
455 439
456(defun ruby-smie-rules (kind token) 440(defun ruby-smie-rules (kind token)
@@ -495,6 +479,9 @@ explicitly declared in magic comment."
495 (`(:after . ,(or "=" "iuwu-mod")) 2) 479 (`(:after . ,(or "=" "iuwu-mod")) 2)
496 (`(:after . " @ ") (smie-rule-parent)) 480 (`(:after . " @ ") (smie-rule-parent))
497 (`(:before . "do") (smie-rule-parent)) 481 (`(:before . "do") (smie-rule-parent))
482 (`(,(or :before :after) . ".")
483 (unless (smie-rule-parent-p ".")
484 (smie-rule-parent ruby-indent-level)))
498 (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0) 485 (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0)
499 (`(:before . ,(or `"when")) 486 (`(:before . ,(or `"when"))
500 (if (not (smie-rule-sibling-p)) 0)) ;; ruby-indent-level 487 (if (not (smie-rule-sibling-p)) 0)) ;; ruby-indent-level
diff --git a/test/indent/ruby.rb b/test/indent/ruby.rb
index c9ec8bd3723..5c47eea0baf 100644
--- a/test/indent/ruby.rb
+++ b/test/indent/ruby.rb
@@ -189,15 +189,16 @@ end
189foo + 189foo +
190 bar 190 bar
191 191
192foo_bar_tee(1, 2, 3)
193 .qux
194 .bar
195
192# Examples below still fail with `ruby-use-smie' on: 196# Examples below still fail with `ruby-use-smie' on:
193 197
194foo = [1, 2, 3].map do |i| 198foo = [1, 2, 3].map do |i|
195 i + 1 199 i + 1
196end 200end
197 201
198foo_bar_tee(1, 2, 3)
199 .qux
200
201method !arg1, 202method !arg1,
202 arg2 203 arg2
203 204
@@ -209,3 +210,13 @@ method :foo,
209 210
210method (a + b), 211method (a + b),
211 c 212 c
213
214foo do
215 bar
216 .tee
217end
218
219def bar
220 foo
221 .baz
222end