]> git.eshelyaron.com Git - emacs.git/commitdiff
Give test-completion's PREDICATE the hashtable key
authorNoam Postavsky <npostavs@gmail.com>
Sun, 27 Nov 2016 19:41:02 +0000 (14:41 -0500)
committerNoam Postavsky <npostavs@gmail.com>
Wed, 7 Dec 2016 03:20:23 +0000 (22:20 -0500)
For hashtable entries with symbol keys, `test-completion' would convert
the key to a string before calling PREDICATE, unlike `try-completion'
and `all-completions'.

* src/minibuf.c (Ftest_completion): Pass original key from hashtable.

src/minibuf.c
test/src/minibuf-tests.el

index 6c694cb3123410e887374170492147a3561828b1..7c5af34102ba1f5ca0adb9558f545de7e0df407f 100644 (file)
@@ -1736,26 +1736,27 @@ the values STRING, PREDICATE and `lambda'.  */)
   else if (HASH_TABLE_P (collection))
     {
       struct Lisp_Hash_Table *h = XHASH_TABLE (collection);
-      Lisp_Object key = Qnil;
       i = hash_lookup (h, string, NULL);
       if (i >= 0)
-       tem = HASH_KEY (h, i);
+        {
+          tem = HASH_KEY (h, i);
+          goto found_matching_key;
+        }
       else
        for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
-         if (!NILP (HASH_HASH (h, i))
-             && (key = HASH_KEY (h, i),
-                 SYMBOLP (key) ? key = Fsymbol_name (key) : key,
-                 STRINGP (key))
-             && EQ (Fcompare_strings (string, make_number (0), Qnil,
-                                      key, make_number (0) , Qnil,
-                                      completion_ignore_case ? Qt : Qnil),
-                    Qt))
-           {
-             tem = key;
-             break;
-           }
-      if (!STRINGP (tem))
-       return Qnil;
+          {
+            if (NILP (HASH_HASH (h, i))) continue;
+            tem = HASH_KEY (h, i);
+            Lisp_Object strkey = (SYMBOLP (tem) ? Fsymbol_name (tem) : tem);
+            if (!STRINGP (strkey)) continue;
+            if (EQ (Fcompare_strings (string, Qnil, Qnil,
+                                      strkey, Qnil, Qnil,
+                                      completion_ignore_case ? Qt : Qnil),
+                    Qt))
+              goto found_matching_key;
+          }
+      return Qnil;
+    found_matching_key: ;
     }
   else
     return call3 (collection, string, predicate, Qlambda);
index 98b8614ddff053d81950e72a465b77c0cb3f2dd5..82ac0373cb45fd277fa05a8f81d1cba5f0700839 100644 (file)
 (ert-deftest test-completion-symbol-hashtable-predicate ()
   (minibuf-tests--test-completion-pred
    #'minibuf-tests--strings-to-symbol-hashtable
-   ;; The predicate recieves a string as the key in this case.
-   (lambda (table)
-     (let ((in-table (minibuf-tests--part-of-hashtable table)))
-       (lambda (k v) (funcall in-table (intern k) v))))))
+   #'minibuf-tests--part-of-hashtable))
 (ert-deftest test-completion-symbol-hashtable-completion-regexp ()
   (minibuf-tests--test-completion-regexp
    #'minibuf-tests--strings-to-symbol-hashtable))