Subject: Re: bug#11923: 24.1.50; (Contains ERT test) ruby-indent-line doesn't indent line after symbol creation using string interpolation

From: Dmitry Gutov <[email-masked]>
Date: Sun, 15 Jul 2012 00:22:20 +0400

--=-=-=
Content-Type: text/plain

Rolando Pereira <[email-masked]> writes:

 > When writing ruby code, if you type something like
 > :"foo#{variable_name}" emacs can no longer indent lines following it
 > because it gives the following error:
 >
 > ruby-forward-string: Search failed: "[^\\]\\(\\\\\\\\\\)*[\"]"
 > ...

Here's a patch, including the slightly rewritten test case.
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2cbdbdb..3ac7b2e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2012-07-14  Dmitry Gutov  <[email-masked]>
+
+	* progmodes/ruby-mode.el (ruby-parse-partial): No error when end
+	up inside string symbol literal.
+
 2012-07-12  Eli Zaretskii  <[email-masked]>
 
 	* emacs-lisp/bytecomp.el (byte-recompile-directory): Use cl-incf,
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 15c8246..a947442 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -594,7 +594,7 @@ and `\\' when preceded by `?'."
         (goto-char pnt))
        ((looking-at ":\\(['\"]\\)")
         (goto-char (match-beginning 1))
-        (ruby-forward-string (buffer-substring (match-beginning 1) (match-end 1)) end))
+        (ruby-forward-string (buffer-substring (match-beginning 1) (match-end 1)) end t))
        ((looking-at ":\\([-,.+*/%&|^~<>]=?\\|===?\\|<=>\\|![~=]?\\)")
         (goto-char (match-end 0)))
        ((looking-at ":\\([a-zA-Z_][a-zA-Z_0-9]*[!?=]?\\)?")
diff --git a/test/ChangeLog b/test/ChangeLog
index 489298d..f876c08 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
+2012-07-14  Dmitry Gutov  <[email-masked]>
+
+	* automated/ruby-mode-tests.el: New file with one test.
+
 2012-07-11  Stefan Monnier  <[email-masked]>
 
 	* eshell.el: Use cl-lib.
diff --git a/test/automated/ruby-mode-tests.el b/test/automated/ruby-mode-tests.el
new file mode 100644
index 0000000..2535f36
--- /dev/null
+++ b/test/automated/ruby-mode-tests.el
@@ -0,0 +1,37 @@
+;;; ruby-mode-tests.el --- Test suite for ruby-mode
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ruby-mode)
+
+(ert-deftest indent-line-after-symbol-made-from-string-interpolation ()
+  "It can indent the line after symbol made using string interpolation."
+  (let ((initial-content "def foo(suffix)\n  :\"bar#{suffix}\"\n")
+        (expected-content "def foo(suffix)\n  :\"bar#{suffix}\"\n  "))
+    (with-temp-buffer
+      (insert initial-content)
+      (ruby-indent-line) ; Doesn't rely on text properties or the syntax table.
+      (let ((buffer-content (buffer-substring-no-properties (point-min)
+                                                            (point-max))))
+        (should (string= buffer-content expected-content))))))
+
+(provide 'ruby-mode-tests)
+
+;;; ruby-mode-tests.el ends here