emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r110882: * lisp/progmodes/ruby-mode.e


From: Dmitry Gutov
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r110882: * lisp/progmodes/ruby-mode.el (ruby-add-log-current-method): Print the
Date: Tue, 13 Nov 2012 13:30:16 +0400
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 110882
committer: Dmitry Gutov <address@hidden>
branch nick: trunk
timestamp: Tue 2012-11-13 13:30:16 +0400
message:
  * lisp/progmodes/ruby-mode.el (ruby-add-log-current-method): Print the
  period before class method names, not after.  Remove handling of
  one impossible case.  Add comments.
  
  * test/automated/ruby-mode-tests.el 
  (ruby-add-log-current-method-examples): New test.
  (ruby-test-string): Extract from ruby-should-indent-buffer.
modified:
  lisp/ChangeLog
  lisp/progmodes/ruby-mode.el
  test/ChangeLog
  test/automated/ruby-mode-tests.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2012-11-13 04:05:35 +0000
+++ b/lisp/ChangeLog    2012-11-13 09:30:16 +0000
@@ -1,3 +1,9 @@
+2012-11-13  Dmitry Gutov  <address@hidden>
+
+       * progmodes/ruby-mode.el (ruby-add-log-current-method): Print the
+       period before class method names, not after.  Remove handling of
+       one impossible case.  Add comments.
+
 2012-11-13  Stefan Monnier  <address@hidden>
 
        * emacs-lisp/advice.el: Remove support for freezing.

=== modified file 'lisp/progmodes/ruby-mode.el'
--- a/lisp/progmodes/ruby-mode.el       2012-11-13 03:07:09 +0000
+++ b/lisp/progmodes/ruby-mode.el       2012-11-13 09:30:16 +0000
@@ -1033,21 +1033,19 @@
   #exit
   String#gsub
   Net::HTTP#active?
-  File::open.
+  File.open
 
 See `add-log-current-defun-function'."
-  ;; TODO: Document body
-  ;; Why does this append a period to class methods?
   (condition-case nil
       (save-excursion
         (let (mname mlist (indent 0))
-          ;; get current method (or class/module)
+          ;; Get the current method definition (or class/module).
           (if (re-search-backward
                (concat "^[ \t]*" ruby-defun-beg-re "[ \t]+"
                        "\\("
-                       ;; \\. and :: for class method
-                        "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
-                        "+\\)")
+                       ;; \\. and :: for class methods
+                       "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
+                       "+\\)")
                nil t)
               (progn
                 (setq mname (match-string 2))
@@ -1056,7 +1054,7 @@
                 (goto-char (match-beginning 1))
                 (setq indent (current-column))
                 (beginning-of-line)))
-          ;; nest class/module
+          ;; Walk up the class/module nesting.
           (while (and (> indent 0)
                       (re-search-backward
                        (concat
@@ -1069,28 +1067,26 @@
                   (setq mlist (cons (match-string 2) mlist))
                   (setq indent (current-column))
                   (beginning-of-line))))
+          ;; Process the method name.
           (when mname
             (let ((mn (split-string mname "\\.\\|::")))
               (if (cdr mn)
                   (progn
-                    (cond
-                     ((string-equal "" (car mn))
-                      (setq mn (cdr mn) mlist nil))
-                     ((string-equal "self" (car mn))
-                      (setq mn (cdr mn)))
-                     ((let ((ml (nreverse mlist)))
+                    (unless (string-equal "self" (car mn)) ; def self.foo
+                      ;; def C.foo
+                      (let ((ml (nreverse mlist)))
+                        ;; If the method name references one of the
+                        ;; containing modules, drop the more nested ones.
                         (while ml
                           (if (string-equal (car ml) (car mn))
                               (setq mlist (nreverse (cdr ml)) ml nil))
-                          (or (setq ml (cdr ml)) (nreverse mlist))))))
-                    (if mlist
-                        (setcdr (last mlist) mn)
-                      (setq mlist mn))
-                    (setq mn (last mn 2))
-                    (setq mname (concat "." (cadr mn)))
-                    (setcdr mn nil))
+                          (or (setq ml (cdr ml)) (nreverse mlist))))
+                      (if mlist
+                          (setcdr (last mlist) (butlast mn))
+                        (setq mlist (butlast mn))))
+                    (setq mname (concat "." (car (last mn)))))
                 (setq mname (concat "#" mname)))))
-          ;; generate string
+          ;; Generate the string.
           (if (consp mlist)
               (setq mlist (mapconcat (function identity) mlist "::")))
           (if mname

=== modified file 'test/ChangeLog'
--- a/test/ChangeLog    2012-11-13 03:07:09 +0000
+++ b/test/ChangeLog    2012-11-13 09:30:16 +0000
@@ -1,7 +1,9 @@
 2012-11-13  Dmitry Gutov  <address@hidden>
 
        * automated/ruby-mode-tests.el (ruby-heredoc-font-lock)
-       (ruby-singleton-class-no-heredoc-font-lock): New tests.
+       (ruby-singleton-class-no-heredoc-font-lock)
+       (ruby-add-log-current-method-examples): New tests.
+       (ruby-test-string): Extract from ruby-should-indent-buffer.
 
 2012-11-12  Stefan Monnier  <address@hidden>
 

=== modified file 'test/automated/ruby-mode-tests.el'
--- a/test/automated/ruby-mode-tests.el 2012-11-13 03:07:09 +0000
+++ b/test/automated/ruby-mode-tests.el 2012-11-13 09:30:16 +0000
@@ -36,11 +36,13 @@
 
 The whitespace before and including \"|\" on each line is removed."
   (with-temp-buffer
-    (cl-flet ((fix-indent (s) (replace-regexp-in-string "^[ \t]*|" "" s)))
-      (insert (fix-indent content))
-      (ruby-mode)
-      (indent-region (point-min) (point-max))
-      (should (string= (fix-indent expected) (buffer-string))))))
+    (insert (ruby-test-string content))
+    (ruby-mode)
+    (indent-region (point-min) (point-max))
+    (should (string= (ruby-test-string expected) (buffer-string)))))
+
+(defun ruby-test-string (s &rest args)
+  (apply 'format (replace-regexp-in-string "^[ \t]*|" "" s) args))
 
 (defun ruby-assert-state (content &rest values-plist)
   "Assert syntax state values at the end of CONTENT.
@@ -261,6 +263,26 @@
   (ruby-assert-face "# #{comment}\n \"#{interpolation}\"" 16
                     'font-lock-variable-name-face))
 
+(ert-deftest ruby-add-log-current-method-examples ()
+  (let ((pairs '(("foo" . "#foo")
+                 ("C.foo" . ".foo")
+                 ("self.foo" . ".foo"))))
+    (loop for (name . value) in pairs
+          do (with-temp-buffer
+               (insert (ruby-test-string
+                        "module M
+                        |  class C
+                        |    def %s
+                        |    end
+                        |  end
+                        |end"
+                        name))
+               (ruby-mode)
+               (search-backward "def")
+               (forward-line)
+               (should (string= (ruby-add-log-current-method)
+                                (format "M::C%s" value)))))))
+
 (provide 'ruby-mode-tests)
 
 ;;; ruby-mode-tests.el ends here


reply via email to

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