]> git.eshelyaron.com Git - emacs.git/commitdiff
(easy-menu-convert-item, easy-menu-convert-item-1):
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 28 May 2008 18:56:08 +0000 (18:56 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 28 May 2008 18:56:08 +0000 (18:56 +0000)
Move the duplicate-generation outside of the caching so it also works
for identical entries.

lisp/ChangeLog
lisp/emacs-lisp/easymenu.el

index 1f6901920c4aa42eef6bedcbc7b8384eea091d89..5c123a80c8208ebddf272c8731e01f1fc89b1b0e 100644 (file)
@@ -1,5 +1,9 @@
 2008-05-28  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       * 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.
index 957de4dfe2aed3dc17d1336fa0b8554933e11e6f..bdca92e7fb0466338bcb7ac2284ca400ef2140ef 100644 (file)
@@ -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