diff options
| author | Dmitry Gutov | 2013-10-22 02:25:59 +0400 |
|---|---|---|
| committer | Dmitry Gutov | 2013-10-22 02:25:59 +0400 |
| commit | 18cacc392d076dfd78b58e842116c0c578aaf3c7 (patch) | |
| tree | 49c2ef2ee1f7d002025ecc5ed9364ac1271a0c44 | |
| parent | 1257317a7c3d4052a6c43f2774cd0a6c6057d420 (diff) | |
| download | emacs-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/ChangeLog | 12 | ||||
| -rw-r--r-- | lisp/progmodes/ruby-mode.el | 47 | ||||
| -rw-r--r-- | test/indent/ruby.rb | 17 |
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 @@ | |||
| 1 | 2013-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 | |||
| 1 | 2013-10-21 Stefan Monnier <monnier@iro.umontreal.ca> | 13 | 2013-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 | |||
| 189 | foo + | 189 | foo + |
| 190 | bar | 190 | bar |
| 191 | 191 | ||
| 192 | foo_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 | ||
| 194 | foo = [1, 2, 3].map do |i| | 198 | foo = [1, 2, 3].map do |i| |
| 195 | i + 1 | 199 | i + 1 |
| 196 | end | 200 | end |
| 197 | 201 | ||
| 198 | foo_bar_tee(1, 2, 3) | ||
| 199 | .qux | ||
| 200 | |||
| 201 | method !arg1, | 202 | method !arg1, |
| 202 | arg2 | 203 | arg2 |
| 203 | 204 | ||
| @@ -209,3 +210,13 @@ method :foo, | |||
| 209 | 210 | ||
| 210 | method (a + b), | 211 | method (a + b), |
| 211 | c | 212 | c |
| 213 | |||
| 214 | foo do | ||
| 215 | bar | ||
| 216 | .tee | ||
| 217 | end | ||
| 218 | |||
| 219 | def bar | ||
| 220 | foo | ||
| 221 | .baz | ||
| 222 | end | ||