Fix rx charset generation

* lisp/emacs-lisp/rx.el (rx--charset-p): Don't overquote.
(rx--generate-alt): Generate '.' for negated newline.
* test/lisp/emacs-lisp/rx-tests.el (rx-any, rx-charset-or): Test.
This commit is contained in:
Mattias Engdegård 2020-02-29 10:12:10 +01:00
parent 9908b5a614
commit d424195905
2 changed files with 14 additions and 3 deletions

View file

@ -305,7 +305,7 @@ Return (REGEXP . PRECEDENCE)."
"Whether FORM looks like a charset, only consisting of character intervals "Whether FORM looks like a charset, only consisting of character intervals
and set operations." and set operations."
(or (and (consp form) (or (and (consp form)
(or (and (memq (car form) '(any 'in 'char)) (or (and (memq (car form) '(any in char))
(rx--every (lambda (x) (not (symbolp x))) (cdr form))) (rx--every (lambda (x) (not (symbolp x))) (cdr form)))
(and (memq (car form) '(not or | intersection)) (and (memq (car form) '(not or | intersection))
(rx--every #'rx--charset-p (cdr form))))) (rx--every #'rx--charset-p (cdr form)))))
@ -450,6 +450,10 @@ classes."
(not negated)) (not negated))
(cons (list (regexp-quote (char-to-string (caar items)))) (cons (list (regexp-quote (char-to-string (caar items))))
t)) t))
;; Negated newline.
((and (equal items '((?\n . ?\n)))
negated)
(rx--translate-symbol 'nonl))
;; At least one character or class, possibly negated. ;; At least one character or class, possibly negated.
(t (t
(cons (cons

View file

@ -130,7 +130,10 @@
(should (equal (rx (any "") (not (any ""))) (should (equal (rx (any "") (not (any "")))
"\\`a\\`[^z-a]")) "\\`a\\`[^z-a]"))
(should (equal (rx (any space ?a digit space)) (should (equal (rx (any space ?a digit space))
"[a[:space:][:digit:]]"))) "[a[:space:][:digit:]]"))
(should (equal (rx (not "\n") (not ?\n) (not (any "\n")) (not-char ?\n)
(| (not (in "a\n")) (not (char ?\n (?b . ?b)))))
".....")))
(ert-deftest rx-pcase () (ert-deftest rx-pcase ()
(should (equal (pcase "a 1 2 3 1 1 b" (should (equal (pcase "a 1 2 3 1 1 b"
@ -298,7 +301,11 @@
(not (any "a-k")))) (not (any "a-k"))))
"[^abh-k]")) "[^abh-k]"))
(should (equal (rx (or ?f (any "b-e") "a") (not (or ?x "y" (any "s-w")))) (should (equal (rx (or ?f (any "b-e") "a") (not (or ?x "y" (any "s-w"))))
"[a-f][^s-y]"))) "[a-f][^s-y]"))
(should (equal (rx (not (or (in "abc") (char "bcd"))))
"[^a-d]"))
(should (equal (rx (or (not (in "abc")) (not (char "bcd"))))
"[^bc]")))
(ert-deftest rx-def-in-charset-or () (ert-deftest rx-def-in-charset-or ()
(rx-let ((a (any "badc")) (rx-let ((a (any "badc"))