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

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

[elpa] externals/xr 647dbaa 1/2: Don't complain about (? (+ X))


From: Mattias Engdegård
Subject: [elpa] externals/xr 647dbaa 1/2: Don't complain about (? (+ X))
Date: Wed, 17 Feb 2021 09:30:06 -0500 (EST)

branch: externals/xr
commit 647dbaad55d661d89270c4c4c07820953ff61681
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Don't complain about (? (+ X))
    
    An optional repetition where the repetition is one-or-more isn't
    ambiguous, and was just seen in the wild.
    Previously, we only suppressed the warning if there was a group around
    the repetition.
---
 xr-test.el |  2 ++
 xr.el      | 88 ++++++++++++++++++++++++++++++--------------------------------
 2 files changed, 44 insertions(+), 46 deletions(-)

diff --git a/xr-test.el b/xr-test.el
index 90e5be2..2d5d885 100644
--- a/xr-test.el
+++ b/xr-test.el
@@ -388,6 +388,8 @@
                    '((2  . "Repetition of option")
                      (14 . "Repetition of repetition")
                      (25 . "Repetition of repetition"))))
+    (should (equal (xr-lint "\\(?:a+\\)?")
+                   nil))
     (should (equal (xr-lint "\\(a*\\)*\\(b+\\)*\\(c*\\)?\\(d+\\)?")
                    '((6 .  "Repetition of repetition")
                      (13 . "Repetition of repetition")
diff --git a/xr.el b/xr.el
index f3ffdb8..6b080e1 100644
--- a/xr.el
+++ b/xr.el
@@ -546,53 +546,49 @@ like (* (* X) ... (* X))."
               (let ((operator (match-string 0))
                     (operand (car sequence)))
                 (when warnings
-                  (cond
-                   ((and (consp operand)
-                         (or
-                          ;; (* (* X)), for any repetitions *
-                          (memq (car operand)
-                                '(opt zero-or-more one-or-more +? *? ??))
-                          ;; (* (group (* X))), for any repetitions *
-                          (and
-                           (eq (car operand) 'group)
-                           (null (cddr operand))
-                           (let ((inner (cadr operand)))
-                             (and (consp inner)
-                                  (memq (car inner)
-                                        '(opt zero-or-more one-or-more
-                                          +? *? ??))
-                                  ;; Except (? (group (+ X))), since that may
-                                  ;; be legitimate.
-                                  (not (and (equal operator "?")
-                                            (memq (car inner)
-                                                  '(one-or-more +?)))))))))
-                    (let ((outer-opt (member operator '("?" "??")))
-                          (inner-opt (or (memq (car operand) '(opt ??))
-                                         (and (eq (car operand) 'group)
-                                              (memq (caadr operand)
-                                                    '(opt ??))))))
-                      (xr--report warnings (match-beginning 0)
-                                  (if outer-opt
+                  ;; Check both (OP (OP X)) and (OP (group (OP X))).
+                  (let ((inner-op
+                         (and (consp operand)
+                              (if (eq (car operand) 'group)
+                                  (and (null (cddr operand))
+                                       (let ((inner (cadr operand)))
+                                         (and (consp inner)
+                                              (car inner))))
+                                (car operand)))))
+                    (cond
+                     ((and
+                       ;; (OP1 (OP2 X)), for any repetitions OP1, OP2
+                       (memq inner-op '(opt zero-or-more one-or-more *? +? ??))
+                       ;; Except (? (+ X)) which may be legitimate.
+                       (not (and (equal operator "?")
+                                 (consp operand)
+                                 (memq inner-op '(one-or-more +?)))))
+                      (let ((outer-opt (member operator '("?" "??")))
+                            (inner-opt (memq inner-op '(opt ??))))
+                        (xr--report warnings (match-beginning 0)
+                                    (if outer-opt
+                                        (if inner-opt
+                                            "Optional option"
+                                          "Optional repetition")
                                       (if inner-opt
-                                          "Optional option"
-                                        "Optional repetition")
-                                    (if inner-opt
-                                        "Repetition of option"
-                                      "Repetition of repetition")))))
-                   ((memq operand xr--zero-width-assertions)
-                    (xr--report warnings (match-beginning 0)
-                                (if (member operator '("?" "??"))
-                                    "Optional zero-width assertion"
-                                  "Repetition of zero-width assertion")))
-                   ((and (xr--matches-empty-p operand)
-                         ;; Rejecting repetition of the empty string
-                         ;; suppresses some false positives.
-                         (not (equal operand "")))
-                    (xr--report
-                     warnings (match-beginning 0)
-                     (if (member operator '("?" "??"))
-                         "Optional expression matching an empty string"
-                       "Repetition of expression matching an empty string"))))
+                                          "Repetition of option"
+                                        "Repetition of repetition")))))
+                     ((memq operand xr--zero-width-assertions)
+                      (xr--report warnings (match-beginning 0)
+                                  (if (member operator '("?" "??"))
+                                      "Optional zero-width assertion"
+                                    "Repetition of zero-width assertion")))
+                     ((and (xr--matches-empty-p operand)
+                           ;; Rejecting repetition of the empty string
+                           ;; suppresses some false positives.
+                           (not (equal operand "")))
+                      (xr--report
+                       warnings (match-beginning 0)
+                       (concat
+                        (if (member operator '("?" "??"))
+                            "Optional expression"
+                          "Repetition of expression")
+                        " matching an empty string")))))
                   ;; (* (* X) ... (* X)) etc: wrap-around subsumption
                   (when (member operator '("*" "+" "*?" "+?"))
                     (xr--check-wrap-around-repetition



reply via email to

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