ruby-syntax-methods-before-regexp: Drop this whitelist

* lisp/progmodes/ruby-mode.el (ruby-syntax-before-regexp-re):
Match only based on keywords and operators.
(ruby-syntax-methods-before-regexp): Delete.
(ruby-syntax-propertize): Use the new heuristic based on spaces
instead of checking for method names before (bug#67569).

* test/lisp/progmodes/ruby-mode-tests.el
(ruby-regexp-not-division-when-only-space-before):
Use non-whitelisted method name.

* test/lisp/progmodes/ruby-mode-resources/ruby.rb:
Adjust two examples.
This commit is contained in:
Dmitry Gutov 2023-12-16 04:57:44 +02:00
parent a2c2ec548b
commit 746507dc3b
3 changed files with 15 additions and 25 deletions

View file

@ -2106,12 +2106,6 @@ or `gem' statement around point."
"\\(%\\)[qQrswWxIi]?\\([[:punct:]]\\)"
"Regexp to match the beginning of percent literal.")
(defconst ruby-syntax-methods-before-regexp
'("gsub" "gsub!" "sub" "sub!" "scan" "split" "split!" "index" "match"
"assert_match" "Given" "Then" "When")
"Methods that can take regexp as the first argument.
It will be properly highlighted even when the call omits parens.")
(defvar ruby-syntax-before-regexp-re
(concat
;; Special tokens that can't be followed by a division operator.
@ -2123,11 +2117,9 @@ It will be properly highlighted even when the call omits parens.")
"\\|\\(?:^\\|\\s \\)"
(regexp-opt '("if" "elsif" "unless" "while" "until" "when" "and"
"or" "not" "&&" "||"))
;; Method name from the list.
"\\|\\_<"
(regexp-opt ruby-syntax-methods-before-regexp t)
"\\)\\s *")
"Regexp to match text that can be followed by a regular expression."))
"Regexp to match text that disambiguates a regular expression.
A slash character after any of these should begin a regexp."))
(defun ruby-syntax-propertize (start end)
"Syntactic keywords for Ruby mode. See `syntax-propertize-function'."
@ -2183,20 +2175,18 @@ 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))))
division-like)
(let ((state (save-excursion (syntax-ppss (match-beginning 1)))))
(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)))
(not (and division-like
(match-beginning 2))))
(or (not
;; Looks like division.
(or (eql (char-after) ?\s)
(not (eql (char-before (1- (point))) ?\s))))
(save-excursion
(forward-char -1)
(looking-back ruby-syntax-before-regexp-re
(line-beginning-position)))))
;; End of regexp. We don't match the whole
;; regexp at once because it can have
;; string interpolation inside, or span

View file

@ -34,11 +34,11 @@ def foo
# Regexp after whitelisted method.
"abc".sub /b/, 'd'
# Don't mismatch "sub" at the end of words.
a = asub / aslb + bsub / bslb;
# Don't mistake division for regexp.
a = sub / aslb + bsub / bslb;
# Highlight the regexp after "if".
x = toto / foo if /do bar/ =~ "dobar"
x = toto / foo if / do bar/ =~ "dobar"
# Regexp options are highlighted.

View file

@ -164,7 +164,7 @@ VALUES-PLIST is a list with alternating index and value elements."
(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 ?/))
(ruby-assert-state "x = foo_index /3" 3 ?/))
(ert-deftest ruby-slash-not-regexp-when-only-space-after ()
(ruby-assert-state "x = index/ 3" 3 nil))