diff options
-rw-r--r-- | lisp/ChangeLog | 7 | ||||
-rw-r--r-- | lisp/progmodes/ruby-mode.el | 18 | ||||
-rw-r--r-- | test/ChangeLog | 7 | ||||
-rw-r--r-- | test/automated/ruby-mode-tests.el | 19 |
4 files changed, 41 insertions, 10 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index eb3f4f833f5..fd520361889 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2013-02-14 Dmitry Gutov <dgutov@yandex.ru> + + * progmodes/ruby-mode.el (ruby-parse-partial): Don't increase + depth for unfinished percent literal. Not using it in the caller. + (ruby-move-to-block): Jump over multiline literals of all types, + ignoring code-looking contents inside them. + 2013-02-13 Michael Albinus <michael.albinus@gmx.de> Use ControlMaster where applicable. (Bug#13677) diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index b1017bb6302..453d08fc47b 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -519,12 +519,6 @@ Can be one of `heredoc', `modifier', `expr-qstr', `expr-re'." (concat "[^\\]\\(\\\\\\\\\\)*" w)) end t))) (setq in-string (point)) - (when (eq (char-syntax (string-to-char w)) ?\() - ;; The rest of the literal, when parsed separately, will - ;; have the depth of -1. So in the rare case when this - ;; number is used despite the in-string status, the - ;; depths will balance. - (setq depth (1+ depth))) (goto-char end))) (t (goto-char pnt)))) @@ -913,10 +907,16 @@ current block, a sibling block, or an outer block. Do that (abs N) times." (re-search-forward "^=end\\>")) ((and backward (looking-at "^=end\\>")) (re-search-backward "^=begin\\>")) + ;; Jump over a multiline literal. + ((ruby-in-ppss-context-p 'string) + (goto-char (nth 8 (syntax-ppss))) + (unless backward + (forward-sexp) + (when (bolp) (forward-char -1)))) ; After a heredoc. (t - (incf depth (or (nth 2 (ruby-parse-region (point) - (line-end-position))) - 0)) + (let ((state (ruby-parse-region (point) (line-end-position)))) + (unless (car state) ; Line ends with unfinished string. + (setq depth (+ (nth 2 state) depth)))) (cond ;; Deeper indentation, we found a block. ;; FIXME: We can't recognize empty blocks this way. diff --git a/test/ChangeLog b/test/ChangeLog index f508209008e..7e08eccc2e3 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,10 @@ +2013-02-14 Dmitry Gutov <dgutov@yandex.ru> + + * automated/ruby-mode-tests.el + (ruby-move-to-block-skips-percent-literal): Add depth-affecting + bits inside the examples. + (ruby-move-to-block-skips-heredoc): New test. + 2013-02-13 Dmitry Gutov <dgutov@yandex.ru> * automated/ruby-mode-tests.el diff --git a/test/automated/ruby-mode-tests.el b/test/automated/ruby-mode-tests.el index 6798a49d53c..9ee6462f6ad 100644 --- a/test/automated/ruby-mode-tests.el +++ b/test/automated/ruby-mode-tests.el @@ -449,20 +449,37 @@ VALUES-PLIST is a list with alternating index and value elements." (dolist (s (list (ruby-test-string "foo do | a = %%w( + | def yaa | ) |end") (ruby-test-string "foo do | a = %%w| + | end | | |end"))) (ruby-with-temp-buffer s (goto-line 1) (ruby-end-of-block) - (should (= 4 (line-number-at-pos))) + (should (= 5 (line-number-at-pos))) (ruby-beginning-of-block) (should (= 1 (line-number-at-pos)))))) +(ert-deftest ruby-move-to-block-skips-heredoc () + (ruby-with-temp-buffer + (ruby-test-string + "if something_wrong? + | ActiveSupport::Deprecation.warn(<<-eowarn) + | boo hoo + | end + | eowarn + |end") + (goto-line 1) + (ruby-end-of-block) + (should (= 6 (line-number-at-pos))) + (ruby-beginning-of-block) + (should (= 1 (line-number-at-pos))))) + (provide 'ruby-mode-tests) ;;; ruby-mode-tests.el ends here |