]> code.delx.au - gnu-emacs-elpa/commitdiff
Don't call back-end again when cache lookup failed.
authorNikolaj Schumacher <git@nschum.de>
Sat, 18 Apr 2009 22:38:59 +0000 (00:38 +0200)
committerNikolaj Schumacher <git@nschum.de>
Sun, 19 Apr 2009 10:30:09 +0000 (12:30 +0200)
company.el

index f17d7a7406f0eae95f46e12b62df63acc7159663..0bec45b890ee2c5e8cf432ef8a5abdde6bc36f9c 100644 (file)
@@ -753,30 +753,32 @@ keymap during active completions (`company-active-map'):
     (setq company-candidates nil)))
 
 (defun company-calculate-candidates (prefix)
-  (let ((candidates
-         (or (cdr (assoc prefix company-candidates-cache))
-             (when company-candidates-cache
-               (let ((len (length prefix))
-                     (completion-ignore-case (company-call-backend
-                                              'ignore-case))
-                     prev)
-                 (dotimes (i (1+ len))
-                   (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
-                                                company-candidates-cache)))
-                     (return (all-completions prefix prev))))))
-             (let ((c (company-call-backend 'candidates prefix)))
-               (when company-candidates-predicate
-                 (setq c (company-apply-predicate
-                          c company-candidates-predicate)))
-               (unless (company-call-backend 'sorted)
-                 (setq c (sort c 'string<)))
-               (when (company-call-backend 'duplicates)
-                 ;; strip duplicates
-                 (let ((c2 c))
-                   (while c2
-                     (setcdr c2 (progn (while (equal (pop c2) (car c2)))
-                                       c2)))))
-               c))))
+  (let ((candidates (cdr (assoc prefix company-candidates-cache))))
+    (or candidates
+        (when company-candidates-cache
+          (let ((len (length prefix))
+                (completion-ignore-case (company-call-backend 'ignore-case))
+                prev)
+            (dotimes (i (1+ len))
+              (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
+                                           company-candidates-cache)))
+                (setq candidates (all-completions prefix prev))
+                (return t)))))
+        ;; no cache match, call back-end
+        (progn
+          (setq candidates (company-call-backend 'candidates prefix))
+          (when company-candidates-predicate
+            (setq candidates
+                  (company-apply-predicate candidates
+                                           company-candidates-predicate)))
+          (unless (company-call-backend 'sorted)
+            (setq candidates (sort candidates 'string<)))
+          (when (company-call-backend 'duplicates)
+            ;; strip duplicates
+            (let ((c2 candidates))
+              (while c2
+                (setcdr c2 (progn (while (equal (pop c2) (car c2)))
+                                  c2)))))))
     (if (or (cdr candidates)
             (not (equal (car candidates) prefix)))
         ;; Don't start when already completed and unique.