+(defsubst company-calculate-candidates (prefix)
+ (or (setq company-candidates (cdr (assoc prefix company-candidates-cache)))
+ (let ((len (length prefix))
+ (completion-ignore-case (funcall company-backend 'ignore-case))
+ prev)
+ (dotimes (i len)
+ (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
+ company-candidates-cache)))
+ (setq company-candidates (all-completions prefix prev))
+ (return t))))
+ (progn
+ (setq company-candidates (funcall company-backend 'candidates prefix))
+ (unless (funcall company-backend 'sorted)
+ (setq company-candidates (sort company-candidates 'string<)))))
+ (unless (assoc prefix company-candidates-cache)
+ (push (cons prefix company-candidates) company-candidates-cache))
+ (setq company-selection 0
+ company-prefix prefix)
+ (let ((completion-ignore-case (funcall company-backend 'ignore-case)))
+ (setq company-common (try-completion company-prefix company-candidates)))
+ (when (eq company-common t)
+ (setq company-candidates nil))
+ company-candidates)
+