]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid duplicated character classes in rx
authorMattias Engdegård <mattiase@acm.org>
Tue, 3 Dec 2019 14:17:37 +0000 (15:17 +0100)
committerMattias Engdegård <mattiase@acm.org>
Tue, 3 Dec 2019 14:17:37 +0000 (15:17 +0100)
For example, (any digit digit) should produce "[[:digit:]]",
not "[[:digit:][:digit:]]".

* lisp/emacs-lisp/rx.el (rx--translate-any): Deduplicate character classes.
* test/lisp/emacs-lisp/rx-tests.el (rx-any): Add test case.

lisp/emacs-lisp/rx.el
test/lisp/emacs-lisp/rx-tests.el

index 52a35ffa2a7797cfa6c5ecb0818ab22c6e4d0051..6fde27831a0af168da0cb1987c7ec1137db2e3cd 100644 (file)
@@ -376,7 +376,9 @@ If NEGATED, negate the sense."
              (push (cons arg arg) conses))
             ((and (symbolp arg)
                   (let ((class (cdr (assq arg rx--char-classes))))
-                    (and class (push class classes)))))
+                    (and class
+                         (or (memq class classes)
+                             (push class classes))))))
             (t (error "Invalid rx `any' argument: %s" arg))))
     (let ((items
            ;; Translate strings and conses into nonoverlapping intervals,
index 4ecc805aead1154e36ee051876a63705189da7e8..26e39f8c8ed550b1718c2123a73a7318678f55cc 100644 (file)
   (should (equal (rx (any) (not (any)))
                  "\\`a\\`[^z-a]"))
   (should (equal (rx (any "") (not (any "")))
-                 "\\`a\\`[^z-a]")))
+                 "\\`a\\`[^z-a]"))
+  (should (equal (rx (any space ?a digit space))
+                 "[a[:space:][:digit:]]")))
 
 (ert-deftest rx-pcase ()
   (should (equal (pcase "a 1 2 3 1 1 b"