emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xr d08d400 1/2: Warn about reversed ranges in character


From: Mattias Engdegård
Subject: [elpa] externals/xr d08d400 1/2: Warn about reversed ranges in character alternatives
Date: Mon, 25 Feb 2019 11:19:10 -0500 (EST)

branch: externals/xr
commit d08d40097f4052874c6a526813bd23a7db3d6061
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>

    Warn about reversed ranges in character alternatives
    
    [z-a] does not match anything; remove such ranges from the output and
    warn about them in xr-lint.
    
    This can lead to output such as (any), which isn't legal rx,
    but it's better than keeping the misleading ranges in the output.
---
 xr-test.el |  3 +++
 xr.el      | 30 ++++++++++++++++++++----------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/xr-test.el b/xr-test.el
index 0186fd2..b79c211 100644
--- a/xr-test.el
+++ b/xr-test.el
@@ -280,6 +280,9 @@
                  '((2 . "Repetition of repetition")
                    (14 . "Repetition of repetition")
                    (25 . "Repetition of repetition"))))
+  (should (equal (xr-lint "[]-Qa-fz-t]")
+                '((1 . "Reversed range `]-Q' matches nothing")
+                  (7 . "Reversed range `z-t' matches nothing"))))
   )
 
 (provide 'xr-test)
diff --git a/xr.el b/xr.el
index 142a7ab..838db3e 100644
--- a/xr.el
+++ b/xr.el
@@ -80,8 +80,12 @@
   (let ((set nil))
     (cond
      ;; Initial ]-x range
-     ((looking-at (rx "]-" (not (any "]"))))
-      (push (match-string 0) set)
+     ((looking-at (rx "]-" (group (not (any "]")))))
+      (if (>= (string-to-char (match-string 1)) ?\])
+         (push (match-string 0) set)
+        (xr--report warnings (point)
+                   (format "Reversed range `%s' matches nothing"
+                           (match-string 0))))
       (goto-char (match-end 0)))
      ;; Initial ]
      ((looking-at "]")
@@ -107,14 +111,20 @@
           ;; become (97 . 122) when printed.
           ;; TODO: Possibly convert "[0-9]" to digit, and
           ;; "[0-9a-fA-F]" (and permutations) to hex-digit.
-          (goto-char (match-end 0))
-          (let ((prev (car set)))
-            ;; Merge with preceding range if any.
-            (if (and (stringp prev)
-                     (>= (length prev) 3)
-                     (eq (aref prev 1) ?-))
-                (setq set (cons (concat prev range) (cdr set)))
-              (push range set)))))
+         (cond
+          ((<= (aref range 0) (aref range 2))
+            (let ((prev (car set)))
+              ;; Merge with preceding range if any.
+              (if (and (stringp prev)
+                       (>= (length prev) 3)
+                       (eq (aref prev 1) ?-))
+                  (setq set (cons (concat prev range) (cdr set)))
+               (push range set))))
+          (t
+            (xr--report warnings (point)
+                       (format "Reversed range `%s' matches nothing"
+                               range))))
+          (goto-char (match-end 0))))
        ((looking-at (rx eos))
         (error "Unterminated character alternative"))
        ;; plain character (including ^ or -)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]