From d338d019e40a9b7c334b04a017d3d6e485403be4 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 28 May 2008 18:56:08 +0000 Subject: [PATCH] (easy-menu-convert-item, easy-menu-convert-item-1): Move the duplicate-generation outside of the caching so it also works for identical entries. --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/easymenu.el | 36 +++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1f6901920c4..5c123a80c82 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2008-05-28 Stefan Monnier + * emacs-lisp/easymenu.el (easy-menu-convert-item) + (easy-menu-convert-item-1): Move the duplicate-generation outside of + the caching so it also works for identical entries. + * tar-mode.el (tar-summarize-buffer): Fix reporter initialization. (tar-mode): Use write-region-annotate-functions rather than write-contents-functions. diff --git a/lisp/emacs-lisp/easymenu.el b/lisp/emacs-lisp/easymenu.el index 957de4dfe2a..bdca92e7fb0 100644 --- a/lisp/emacs-lisp/easymenu.el +++ b/lisp/emacs-lisp/easymenu.el @@ -277,9 +277,25 @@ conversion is done from within a filter. This also helps when the NAME of the entry is recreated each time: since the menu is built and traversed separately, the lookup would always fail because the key is `equal' but not `eq'." - (or (gethash item easy-menu-converted-items-table) - (puthash item (easy-menu-convert-item-1 item) - easy-menu-converted-items-table))) + (let* ((cache (gethash item easy-menu-converted-items-table)) + (result (or cache (easy-menu-convert-item-1 item))) + (key (car-safe result))) + (when (and (listp easy-menu-avoid-duplicate-keys) (symbolp key)) + ;; Merging multiple entries with the same name is sometimes what we + ;; want, but not when the entries are actually different (e.g. same + ;; name but different :suffix as seen in cal-menu.el) and appear in + ;; the same menu. So we try to detect and resolve conflicts. + (while (memq key easy-menu-avoid-duplicate-keys) + ;; We need to use some distinct object, ideally a symbol, ideally + ;; related to the `name'. Uninterned symbols do not work (they + ;; are apparently turned into strings and re-interned later on). + (setq key (intern (format "%s-%d" (symbol-name key) + (length easy-menu-avoid-duplicate-keys)))) + (setq result (cons key (cdr result)))) + (push key easy-menu-avoid-duplicate-keys)) + + (unless cache (puthash item result easy-menu-converted-items-table)) + result)) (defun easy-menu-convert-item-1 (item) "Parse an item description and convert it to a menu keymap element. @@ -376,20 +392,6 @@ ITEM defines an item as in `easy-menu-define'." ;; It also makes it easier/possible to lookup/change menu bindings ;; via keymap functions. (let ((key (easy-menu-intern name))) - (when (listp easy-menu-avoid-duplicate-keys) - ;; Merging multiple entries with the same name is sometimes what we - ;; want, but not when the entries are actually different (e.g. same - ;; name but different :suffix as seen in cal-menu.el) and appear in - ;; the same menu. So we try to detect and resolve conflicts. - (while (and (stringp name) - (memq key easy-menu-avoid-duplicate-keys)) - ;; We need to use some distinct object, ideally a symbol, ideally - ;; related to the `name'. Uninterned symbols do not work (they - ;; are apparently turned into strings and re-interned later on). - (setq key (intern (format "%s (%d)" (symbol-name key) - (length easy-menu-avoid-duplicate-keys))))) - (push key easy-menu-avoid-duplicate-keys)) - (cons key (and (not remove) (cons 'menu-item -- 2.39.2