emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r114545: * lisp/progmodes/ruby-mode.el: Fix recently


From: Stefan Monnier
Subject: [Emacs-diffs] trunk r114545: * lisp/progmodes/ruby-mode.el: Fix recently added tests.
Date: Mon, 07 Oct 2013 03:38:30 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 114545
revision-id: address@hidden
parent: address@hidden
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Sun 2013-10-06 23:38:26 -0400
message:
  * lisp/progmodes/ruby-mode.el: Fix recently added tests.
  (ruby-smie-grammar): Add - and +.
  (ruby-smie--redundant-do-p, ruby-smie--forward-id)
  (ruby-smie--backward-id): New functions.
  (ruby-smie--forward-token, ruby-smie--backward-token): Use them.
  (ruby-smie-rules): Handle hanging do.  Get rid of hack, not needed
  any more.
  * test/indent/ruby.rb: Add a few more tests; adjust some indentation.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/progmodes/ruby-mode.el    
rubymode.el-20091113204419-o5vbwnq5f7feedwu-8804
  test/indent/ruby.rb            ruby.rb-20120424165921-h044139hbrd7snvw-1
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2013-10-07 01:28:34 +0000
+++ b/lisp/ChangeLog    2013-10-07 03:38:26 +0000
@@ -1,3 +1,13 @@
+2013-10-07  Stefan Monnier  <address@hidden>
+
+       * progmodes/ruby-mode.el: Fix recently added tests.
+       (ruby-smie-grammar): Add - and +.
+       (ruby-smie--redundant-do-p, ruby-smie--forward-id)
+       (ruby-smie--backward-id): New functions.
+       (ruby-smie--forward-token, ruby-smie--backward-token): Use them.
+       (ruby-smie-rules): Handle hanging do.  Get rid of hack, not needed
+       any more.
+
 2013-10-07  Leo Liu  <address@hidden>
 
        * register.el (register-preview-delay)

=== modified file 'lisp/progmodes/ruby-mode.el'
--- a/lisp/progmodes/ruby-mode.el       2013-10-06 00:46:28 +0000
+++ b/lisp/progmodes/ruby-mode.el       2013-10-07 03:38:26 +0000
@@ -246,7 +246,7 @@
     '((id)
       (insts (inst) (insts ";" insts))
       (inst (exp) (inst "iuwu-mod" exp))
-      (exp  (exp1) (exp "," exp) (exp "=" exp))
+      (exp  (exp1) (exp "," exp) (exp "=" exp) (exp "-" exp)  (exp "+" exp))
       (exp1 (exp2) (exp2 "?" exp1 ":" exp1))
       (exp2 ("def" insts "end")
             ("begin" insts-rescue-insts "end")
@@ -274,7 +274,7 @@
       (itheni (insts) (exp "then" insts))
       (ielsei (itheni) (itheni "else" insts))
       (if-body (ielsei) (if-body "elsif" if-body)))
-    '((nonassoc "in") (assoc ";") (assoc ",") (right "="))
+    '((nonassoc "in") (assoc ";") (assoc ",") (right "=") (assoc "-" "+"))
     '((assoc "when"))
     '((assoc "elsif"))
     '((assoc "rescue" "ensure"))
@@ -297,6 +297,11 @@
                     (or (equal tok "?")
                         (string-match "\\`\\s." tok))))))))
 
+(defun ruby-smie--redundant-do-p (&optional skip)
+  (save-excursion
+    (if skip (backward-word 1))
+    (member (nth 2 (smie-backward-sexp ";")) '("while"))))
+
 (defun ruby-smie--opening-pipe-p ()
   (save-excursion
     (if (eq ?| (char-before)) (forward-char -1))
@@ -304,6 +309,15 @@
     (or (eq ?\{ (char-before))
         (looking-back "\\_<do" (- (point) 2)))))
 
+(defun ruby-smie--forward-id ()
+  (when (and (not (eobp))
+             (eq ?w (char-syntax (char-after))))
+    (let ((tok (smie-default-forward-token)))
+      (when (eq ?. (char-after))
+        (forward-char 1)
+        (setq tok (concat tok "." (ruby-smie--forward-id))))
+      tok)))
+
 (defun ruby-smie--forward-token ()
   (skip-chars-forward " \t")
   (cond
@@ -316,17 +330,37 @@
     (forward-comment (point-max))
     (if (looking-at ":\\s.+")
         (progn (goto-char (match-end 0)) (match-string 0)) ;; bug#15208.
-    (let ((tok (smie-default-forward-token)))
-      (cond
-       ((member tok '("unless" "if" "while" "until"))
-        (if (save-excursion (forward-word -1) (ruby-smie--bosp))
-            tok "iuwu-mod"))
+      (let ((tok (smie-default-forward-token)))
+        (when (eq ?. (char-after))
+          (forward-char 1)
+          (setq tok (concat tok "." (ruby-smie--forward-id))))
+        (cond
+         ((member tok '("unless" "if" "while" "until"))
+          (if (save-excursion (forward-word -1) (ruby-smie--bosp))
+              tok "iuwu-mod"))
          ((equal tok "|")
           (if (ruby-smie--opening-pipe-p) "opening-|" tok))
          ((and (equal tok "") (looking-at "\\\\\n"))
           (goto-char (match-end 0)) (ruby-smie--forward-token))
+         ((equal tok "do")
+          (cond
+           ((not (ruby-smie--redundant-do-p 'skip)) tok)
+           ((> (save-excursion (forward-comment (point-max)) (point))
+               (line-end-position))
+            (ruby-smie--forward-token)) ;Fully redundant.
+           (t ";")))
+         ((equal tok ".") (concat tok (ruby-smie--forward-id)))
          (t tok)))))))
 
+(defun ruby-smie--backward-id ()
+  (when (and (not (bobp))
+             (eq ?w (char-syntax (char-before))))
+    (let ((tok (smie-default-backward-token)))
+      (when (eq ?. (char-before))
+        (forward-char -1)
+        (setq tok (concat (ruby-smie--backward-id) "." tok)))
+      tok)))
+
 (defun ruby-smie--backward-token ()
   (let ((pos (point)))
     (forward-comment (- (point)))
@@ -336,6 +370,9 @@
      ((and (bolp) (not (bobp))) "")         ;Presumably a heredoc.
      (t
       (let ((tok (smie-default-backward-token)))
+        (when (eq ?. (char-before))
+          (forward-char -1)
+          (setq tok (concat (ruby-smie--backward-id) "." tok)))
         (when (and (eq ?: (char-before)) (string-match "\\`\\s." tok))
           (forward-char -1) (setq tok (concat ":" tok))) ;; bug#15208.
         (cond
@@ -346,6 +383,16 @@
           (if (ruby-smie--opening-pipe-p) "opening-|" tok))
          ((and (equal tok "") (eq ?\\ (char-before)) (looking-at "\n"))
           (forward-char -1) (ruby-smie--backward-token))
+         ((equal tok "do")
+          (cond
+           ((not (ruby-smie--redundant-do-p)) tok)
+           ((> (save-excursion (forward-word 1)
+                               (forward-comment (point-max)) (point))
+               (line-end-position))
+            (ruby-smie--backward-token)) ;Fully redundant.
+           (t ";")))
+         ((equal tok ".")
+          (concat (ruby-smie--backward-id) tok))
          (t tok)))))))
 
 (defun ruby-smie-rules (kind token)
@@ -370,24 +417,22 @@
      (if (smie-rule-hanging-p) (smie-rule-parent)))
     (`(:after . "=") 2)
     (`(:before . "do")
-     (when
-         (save-excursion
-           (forward-word 1)   ;Skip "do"
-           (skip-chars-forward " \t")
-           (and (equal (save-excursion (ruby-smie--forward-token)) "opening-|")
-                (save-excursion (forward-sexp 1)
-                                (skip-chars-forward " \t")
-                                (or (eolp)
-                                    (looking-at comment-start-skip)))))
+     (when (or (smie-rule-hanging-p)
+               (save-excursion
+                 (forward-word 1)       ;Skip "do"
+                 (skip-chars-forward " \t")
+                 (and (equal (save-excursion (ruby-smie--forward-token))
+                             "opening-|")
+                      (save-excursion (forward-sexp 1)
+                                      (skip-chars-forward " \t")
+                                      (or (eolp)
+                                          (looking-at comment-start-skip))))))
        ;; `(column . ,(smie-indent-virtual))
        (smie-rule-parent)))
     (`(:before . ,(or `"else" `"then" `"elsif" `"rescue" `"ensure")) 0)
     (`(:before . ,(or `"when"))
      (if (not (smie-rule-sibling-p)) 0)) ;; ruby-indent-level
-    ;; Hack attack: Since newlines are separators, don't try to align args that
-    ;; appear on a separate line.  "" is for the case where the "previous
-    ;; separator" was not an implicit ";" but the BOB.
-    (`(:list-intro . ,(or `";" `"")) t)))
+    ))
 
 (defun ruby-imenu-create-index-in-block (prefix beg end)
   "Create an imenu index of methods inside a block."

=== modified file 'test/indent/ruby.rb'
--- a/test/indent/ruby.rb       2013-10-06 21:34:40 +0000
+++ b/test/indent/ruby.rb       2013-10-07 03:38:26 +0000
@@ -99,6 +99,14 @@
   do_something
 end
 
+# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html
+d = 4 + 5 +      # no '\' needed
+    6 + 7
+
+# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html
+e = 8 + 9   \
+    + 10         # '\' needed
+
 begin
   foo
 ensure
@@ -109,20 +117,27 @@
 MSG = 'Separate every 3 digits in the integer portion of a number' +
       'with underscores(_).'
 
-# Examples below fail with SMIE.
+class C
+  def foo
+    self.end
+    D.new.class
+  end
+end
 
 a = foo(j, k) -
-  bar_tee
+    bar_tee
 
 while a < b do # "do" is optional
   foo
 end
 
 desc "foo foo" \
-  "bar bar"
+     "bar bar"
 
 foo.
   bar
 
+# FIXME: is this really valid Ruby?  Isn't the newline after "foo" treated as
+# an implicit semi-colon?
 foo
   .bar


reply via email to

[Prev in Thread] Current Thread [Next in Thread]