Don’t consider nested let-alist forms

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.
This commit is contained in:
Philipp Stephani 2016-10-08 15:29:32 +02:00
parent f3eedc7e68
commit 5b774598f4
2 changed files with 13 additions and 0 deletions

View 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 dont 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))))))

View file

@ -88,4 +88,12 @@
'(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