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:
parent
a2c2ec548b
commit
746507dc3b
3 changed files with 15 additions and 25 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Reference in a new issue