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.
;; 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))))))
'(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