]> git.eshelyaron.com Git - emacs.git/commitdiff
Don’t consider nested let-alist forms
authorPhilipp Stephani <phst@google.com>
Sat, 8 Oct 2016 13:29:32 +0000 (15:29 +0200)
committerPhilipp Stephani <phst@google.com>
Sat, 8 Oct 2016 16:36:54 +0000 (18:36 +0200)
See Bug#24641.

* lisp/emacs-lisp/let-alist.el (let-alist--deep-dot-search): Don’t
consider symbols in nested ‘let-alist’ forms.

* test/lisp/emacs-lisp/let-alist-tests.el
(let-alist--deep-dot-search--nested): Add a unit test.

lisp/emacs-lisp/let-alist.el
test/lisp/emacs-lisp/let-alist-tests.el

index 3507a39543697f8a21cd1638fdec77f27ae96908..d7069174c1baf352da1668598e21a198485c0c62 100644 (file)
@@ -76,6 +76,11 @@ symbol, and each cdr is the same symbol without the `.'."
         ;; with other results in the clause below.
         (list (cons data (intern (replace-match "" nil nil name)))))))
    ((not (consp data)) nil)
+   ((eq (car data) 'let-alist)
+    ;; For nested ‘let-alist’ forms, ignore symbols appearing in the
+    ;; inner body because they don’t refer to the alist currently
+    ;; being processed.  See Bug#24641.
+    (let-alist--deep-dot-search (cadr data)))
    (t (append (let-alist--deep-dot-search (car data))
               (let-alist--deep-dot-search (cdr data))))))
 
index 80d418cabbe20f312ba49d757b14ea4fc5a7c004..657a27a67dc2a711586fad9e1e91f4c98ea93427 100644 (file)
                  '(cdr (assq 'baz (cdr (assq 'bar (cdr (assq 'foo var))))))))
   (should (equal (let-alist--access-sexp '..foo.bar.baz 'var) '.foo.bar.baz)))
 
+(ert-deftest let-alist--deep-dot-search--nested ()
+  "Check that nested `let-alist' forms don't generate spurious bindings.
+See Bug#24641."
+  (should (equal (let-alist--deep-dot-search '(foo .bar (baz .qux)))
+                 '((.bar . bar) (.qux . qux))))
+  (should (equal (let-alist--deep-dot-search '(foo .bar (let-alist .qux .baz)))
+                 '((.bar . bar) (.qux . qux)))))  ; no .baz
+
 ;;; let-alist.el ends here