(candidates '("c" "d")))))))
(should (equal (company-call-backend 'candidates "z") '("a" "b" "c" "d")))))
+(ert-deftest company-multi-backend-remembers-candidate-backend ()
+ (let ((company-backend
+ (list (lambda (command &optional arg &rest ignore)
+ (case command
+ (ignore-case nil)
+ (annotation "1")
+ (candidates '("a" "c"))
+ (post-completion "13")))
+ (lambda (command &optional arg &rest ignore)
+ (case command
+ (ignore-case t)
+ (annotation "2")
+ (candidates '("b" "d"))
+ (post-completion "42"))))))
+ (let ((candidates (company-calculate-candidates nil)))
+ (should (equal candidates '("a" "b" "c" "d")))
+ (should (equal t (company-call-backend 'ignore-case)))
+ (should (equal "1" (company-call-backend 'annotation (nth 0 candidates))))
+ (should (equal "2" (company-call-backend 'annotation (nth 1 candidates))))
+ (should (equal "13" (company-call-backend 'post-completion (nth 2 candidates))))
+ (should (equal "42" (company-call-backend 'post-completion (nth 3 candidates)))))))
+
(ert-deftest company-begin-backend-failure-doesnt-break-company-backends ()
(with-temp-buffer
(insert "a")
(search-backward "bb")
(let ((col (company--column))
(company-candidates-length 2)
- (company-candidates '("123" "45")))
+ (company-candidates '("123" "45"))
+ (company-backend 'ignore))
(company-pseudo-tooltip-show (company--row) col 0)
(let ((ov company-pseudo-tooltip-overlay))
;; With margins.
(ert-deftest company-create-lines-shows-numbers ()
(let ((company-show-numbers t)
(company-candidates '("x" "y" "z"))
- (company-candidates-length 3))
+ (company-candidates-length 3)
+ (company-backend 'ignore))
(should (equal '(" x 1 " " y 2 " " z 3 ")
(company--create-lines 0 999)))))
company-xcode company-ropemacs company-cmake
,@(when company--include-capf
(list 'company-capf))
- (company-gtags company-etags company-dabbrev-code
+ (company-dabbrev-code company-gtags company-etags
company-keywords)
company-oddmuse company-files company-dabbrev)
"The list of active back-ends (completion engines).
collect b)))
(case command
(candidates
- (loop for backend in backends
- when (equal (funcall backend 'prefix)
- (car args))
- append (apply backend 'candidates args)))
+ ;; Small perf optimization: don't tag the candidates received
+ ;; from the first backend in the group.
+ (append (apply (car backends) 'candidates args)
+ (loop for backend in (cdr backends)
+ when (equal (funcall backend 'prefix)
+ (car args))
+ append (mapcar
+ (lambda (str)
+ (propertize str 'company-backend backend))
+ (apply backend 'candidates args)))))
(sorted nil)
(duplicates t)
- (otherwise
+ ((prefix ignore-case no-cache require-match)
(let (value)
(dolist (backend backends)
(when (setq value (apply backend command args))
- (return value))))))))
+ (return value)))))
+ (otherwise
+ (let* ((arg (car args))
+ (backend (or (get-text-property 0 'company-backend arg)
+ (car backends))))
+ (apply backend command args))))))
;;; completion mechanism ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;