]> git.eshelyaron.com Git - emacs.git/commitdiff
ruby-mode: Better detect regexp vs division (bug#67569)
authorDmitry Gutov <dmitry@gutov.dev>
Sat, 9 Dec 2023 17:04:55 +0000 (19:04 +0200)
committerDmitry Gutov <dmitry@gutov.dev>
Sat, 9 Dec 2023 17:04:55 +0000 (19:04 +0200)
* lisp/progmodes/ruby-mode.el (ruby-syntax-before-regexp-re):
Add grouping around methods from the whitelist.
(ruby-syntax-propertize): Also look for spaces around the slash.

lisp/progmodes/ruby-mode.el
test/lisp/progmodes/ruby-mode-tests.el

index b252826680cfd429268351cfcb4cb3dd8db6cefc..0ecb357927869d7a3c11061bb3b717635ad29e34 100644 (file)
@@ -2124,7 +2124,7 @@ It will be properly highlighted even when the call omits parens.")
                    "or" "not" "&&" "||"))
      ;; Method name from the list.
      "\\|\\_<"
-     (regexp-opt ruby-syntax-methods-before-regexp)
+     (regexp-opt ruby-syntax-methods-before-regexp t)
      "\\)\\s *")
     "Regexp to match text that can be followed by a regular expression."))
 
@@ -2182,14 +2182,20 @@ It will be properly highlighted even when the call omits parens.")
         (when (save-excursion
                 (forward-char -1)
                 (cl-evenp (skip-chars-backward "\\\\")))
-          (let ((state (save-excursion (syntax-ppss (match-beginning 1)))))
+          (let ((state (save-excursion (syntax-ppss (match-beginning 1))))
+                division-like)
             (when (or
                    ;; Beginning of a regexp.
                    (and (null (nth 8 state))
                         (save-excursion
+                          (setq division-like
+                                (or (eql (char-after) ?\s)
+                                    (not (eql (char-before (1- (point))) ?\s))))
                           (forward-char -1)
                           (looking-back ruby-syntax-before-regexp-re
-                                        (line-beginning-position))))
+                                        (line-beginning-position)))
+                        (not (and division-like
+                                  (match-beginning 2))))
                    ;; End of regexp.  We don't match the whole
                    ;; regexp at once because it can have
                    ;; string interpolation inside, or span
index 117385ea3e828a8dad75b5aee6e76942b0610be9..a931541ba35956d7f64a3a2352418676a3a9f507 100644 (file)
@@ -157,6 +157,18 @@ VALUES-PLIST is a list with alternating index and value elements."
 (ert-deftest ruby-regexp-is-not-mistaken-for-slash-symbol ()
   (ruby-assert-state "x = /foo:/" 3 nil))
 
+(ert-deftest ruby-slash-not-regexp-when-surrounded-by-spaces ()
+  (ruby-assert-state "x = index / 3" 3 nil))
+
+(ert-deftest ruby-slash-not-regexp-when-no-spaces ()
+  (ruby-assert-state "x = index/3" 3 nil))
+
+(ert-deftest ruby-regexp-not-division-when-only-space-before ()
+  (ruby-assert-state "x = index /3" 3 ?/))
+
+(ert-deftest ruby-slash-not-regexp-when-only-space-after ()
+  (ruby-assert-state "x = index/ 3" 3 nil))
+
 (ert-deftest ruby-indent-simple ()
   (ruby-should-indent-buffer
    "if foo