emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/company 5d05b0829b 2/2: In grouped backend, use the hig


From: ELPA Syncer
Subject: [elpa] externals/company 5d05b0829b 2/2: In grouped backend, use the highest prefix length override
Date: Wed, 22 Nov 2023 21:57:29 -0500 (EST)

branch: externals/company
commit 5d05b0829b65ac0f5c334b85b53d9d7cc0204427
Author: Dmitry Gutov <dmitry@gutov.dev>
Commit: Dmitry Gutov <dmitry@gutov.dev>

    In grouped backend, use the highest prefix length override
    
    Should help in scenarios related to #1268.  Made possible by #1405.
---
 company.el         | 24 +++++++++++++++++++++++-
 test/core-tests.el | 29 +++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/company.el b/company.el
index 725df25a36..7060b60dc5 100644
--- a/company.el
+++ b/company.el
@@ -1281,7 +1281,7 @@ be recomputed when this value changes."
                                         company--multi-uncached-backends))))
                       found))))
        t)
-      ((or `prefix `ignore-case `no-cache `require-match)
+      ((or `ignore-case `no-cache `require-match)
        (let (value)
          (cl-dolist (backend backends)
            (when (setq value (company--force-sync
@@ -1290,6 +1290,7 @@ be recomputed when this value changes."
                         (eq value 'keep-prefix))
                (setq value t))
              (cl-return value)))))
+      (`prefix (company--multi-prefix backends))
       (_
        (let ((arg (car args)))
          (when (> (length arg) 0)
@@ -1297,6 +1298,27 @@ be recomputed when this value changes."
                               (car backends))))
              (apply backend command args))))))))
 
+(defun company--multi-prefix (backends)
+  (let (str len)
+    (dolist (backend backends)
+      (let* ((prefix (company--force-sync backend '(prefix) backend))
+             (prefix-len (cdr-safe prefix)))
+        (when (stringp (company--prefix-str prefix))
+          (cond
+           ((not str)
+            (setq str (company--prefix-str prefix)
+                  len (cdr-safe prefix)))
+           ((and prefix-len
+                 (not (eq len t))
+                 (equal str (company--prefix-str prefix))
+                 (or (null len)
+                     (eq prefix-len t)
+                     (> prefix-len len)))
+            (setq len prefix-len))))))
+    (if (and str len)
+        (cons str len)
+      str)))
+
 (defun company--multi-backend-adapter-candidates (backends prefix min-length 
separate)
   (let ((pairs (cl-loop for backend in backends
                         when (let ((bp (let ((company-backend backend))
diff --git a/test/core-tests.el b/test/core-tests.el
index 0a2e877b22..be3dbee60d 100644
--- a/test/core-tests.el
+++ b/test/core-tests.el
@@ -254,6 +254,35 @@
       (should (equal '("aa" "aab")
                      (company-call-backend 'candidates "aa"))))))
 
+(ert-deftest company-multi-backend-chooses-longest-prefix-length ()
+  (let* ((one (lambda (command &optional _)
+                (cl-case command
+                  (prefix "aa")
+                  (candidates (list "aa")))))
+         (two (lambda (command &optional _)
+                (cl-case command
+                  (prefix (cons "aa" t))
+                  (candidates (list "aab" )))))
+         (tri (lambda (command &optional _)
+                (cl-case command
+                  (prefix "")
+                  (candidates (list "aac")))))
+         (fur (lambda (command &optional _)
+                (cl-case command
+                  (prefix (cons "aa" 3))
+                  (candidates (list "aac")))))
+         (company--multi-uncached-backends (list one tri)))
+    (let ((company-backend (list one tri fur)))
+      (should
+       (equal
+        '("aa" . 3)
+        (company-call-backend 'prefix))))
+    (let ((company-backend (list one two tri fur)))
+      (should
+       (equal
+        '("aa" . t)
+        (company-call-backend 'prefix))))))
+
 (ert-deftest company-begin-backend-failure-doesnt-break-company-backends ()
   (with-temp-buffer
     (insert "a")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]