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

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

[elpa] externals/company 4e7c146115 1/4: Store capf boundaries as marker


From: ELPA Syncer
Subject: [elpa] externals/company 4e7c146115 1/4: Store capf boundaries as markers
Date: Wed, 11 Sep 2024 00:57:39 -0400 (EDT)

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

    Store capf boundaries as markers
    
    To avoid having to manually update the prefix/suffix strings when rendering 
the
    updated UI in the middle of fetching completions.
---
 company-capf.el         | 11 ++++++----
 company-dabbrev-code.el |  8 ++++++--
 company-etags.el        |  8 ++++++--
 company.el              | 53 ++++++++++++++++++++++++++++---------------------
 4 files changed, 49 insertions(+), 31 deletions(-)

diff --git a/company-capf.el b/company-capf.el
index 7243b86f7f..08f2e6310f 100644
--- a/company-capf.el
+++ b/company-capf.el
@@ -162,7 +162,8 @@ so we can't just use the preceding variable instead.")
     (`post-completion
      (company--capf-post-completion arg))
     (`adjust-boundaries
-     company-capf--current-boundaries)
+     (company--capf-boundaries
+      company-capf--current-boundaries))
     (`expand-common
      (company-capf--expand-common arg (car rest)))
     ))
@@ -205,11 +206,13 @@ so we can't just use the preceding variable instead.")
                                                      (and non-essential
                                                           (eq interrupt t))))
              (sortfun (cdr (assq 'display-sort-function meta)))
-             (candidates (assoc-default :completions all-result))
-             (boundaries (assoc-default :boundaries all-result)))
+             (candidates (assoc-default :completions all-result)))
         (setq company-capf--sorted (functionp sortfun))
         (when candidates
-          (setq company-capf--current-boundaries boundaries))
+          (setq company-capf--current-boundaries
+                (company--capf-boundaries-markers
+                 (assoc-default :boundaries all-result)
+                 company-capf--current-boundaries)))
         (when sortfun
           (setq candidates (funcall sortfun candidates)))
         candidates))))
diff --git a/company-dabbrev-code.el b/company-dabbrev-code.el
index e9dec1d566..2851797ac6 100644
--- a/company-dabbrev-code.el
+++ b/company-dabbrev-code.el
@@ -113,7 +113,8 @@ comments or strings."
                  (company-grab-symbol-parts)))
     (candidates (company-dabbrev--candidates arg (car rest)))
     (adjust-boundaries (and company-dabbrev-code-completion-styles
-                            company-dabbrev--boundaries))
+                            (company--capf-boundaries
+                             company-dabbrev--boundaries)))
     (expand-common (company-dabbrev-code--expand-common arg (car rest)))
     (kind 'text)
     (no-cache t)
@@ -165,7 +166,10 @@ comments or strings."
       (setq res (company--capf-completions
                  prefix suffix
                  table))
-      (setq company-dabbrev--boundaries (assoc-default :boundaries res))
+      (setq company-dabbrev--boundaries
+            (company--capf-boundaries-markers
+             (assoc-default :boundaries res)
+             company-dabbrev--boundaries))
       (assoc-default :completions res))))
 
 (provide 'company-dabbrev-code)
diff --git a/company-etags.el b/company-etags.el
index 34c68b814d..8ff98345c9 100644
--- a/company-etags.el
+++ b/company-etags.el
@@ -90,7 +90,10 @@ Set it to t or to a list of major modes."
     (and table
          (if company-etags-completion-styles
              (let ((res (company--capf-completions prefix suffix table)))
-               (setq company-etags--boundaries (assoc-default :boundaries res))
+               (setq company-etags--boundaries
+                     (company--capf-boundaries-markers
+                      (assoc-default :boundaries res)
+                      company-etags--boundaries))
                (assoc-default :completions res))
            (all-completions prefix table)))))
 
@@ -125,7 +128,8 @@ Set it to t or to a list of major modes."
                  (company-grab-symbol-parts)))
     (candidates (company-etags--candidates arg (car rest)))
     (adjust-boundaries (and company-etags-completion-styles
-                            company-etags--boundaries))
+                            (company--capf-boundaries
+                             company-etags--boundaries)))
     (expand-common (company-etags--expand-common arg (car rest)))
     (no-cache company-etags-completion-styles)
     (location (let ((tags-table-list (company-etags-buffer-table)))
diff --git a/company.el b/company.el
index ccc57a68f7..f8f1ac09d0 100644
--- a/company.el
+++ b/company.el
@@ -1257,6 +1257,28 @@ MAX-LEN is how far back to try to match the 
IDLE-BEGIN-AFTER-RE regexp."
        (substring (car res) 0 (cdr res))
        (substring (car res) (cdr res)))))))
 
+;; We store boundaries as markers because when the `unhide' frontend action is
+;; called, the completions are still being fetched. So the capf boundaries info
+;; can't be relied to be fresh by other means.
+(defun company--capf-boundaries-markers (string-pair &optional markers)
+  "STRING-PAIR is (PREFIX . SUFFIX) and MARKERS is a pair to reuse."
+  (when (or (not markers)
+            (stringp (car markers)))
+    (setq markers (cons (make-marker)
+                        (make-marker))))
+  (move-marker (car markers) (- (point) (length (car string-pair))))
+  (move-marker (cdr markers) (+ (point) (length (cdr string-pair))))
+  markers)
+
+(defun company--capf-boundaries (markers)
+  (let* ((beg (car markers))
+         (end (cdr markers))
+         res)
+    (when (> (point) end) (setq end (point)))
+    (setq res (cons (buffer-substring beg (point))
+                    (buffer-substring (point) end)))
+    res))
+
 (defvar company--cache (make-hash-table :test #'equal :size 10))
 
 (cl-defun company-cache-fetch (key
@@ -1375,7 +1397,6 @@ be recomputed when this value changes."
              (cl-return value)))))
       (`prefix (company--multi-prefix backends))
       (`adjust-boundaries
-       (defvar company-point)
        (let ((arg (car args)))
          (when (> (length arg) 0)
            (let* ((backend (or (get-text-property 0 'company-backend arg)
@@ -1383,13 +1404,6 @@ be recomputed when this value changes."
                   (entity (company--force-sync backend '(prefix) backend))
                   (prefix (company--prefix-str entity))
                   (suffix (company--suffix-str entity)))
-             ;; XXX: Working around the stuff in
-             ;; company-preview--refresh-prefix.
-             (when (> (point) company-point)
-               (setq prefix (substring prefix
-                                       0
-                                       (- (length prefix)
-                                          (- (point) company-point)))))
              (setq args (list arg prefix suffix))
              (or
               (apply backend command args)
@@ -1841,7 +1855,12 @@ update if FORCE-UPDATE."
             res-was))))))
 
 (defun company--sneaky-refresh ()
-  (when company-candidates (company-call-frontends 'unhide))
+  (when company-candidates
+    (let* ((entity (company-call-backend 'prefix))
+           (company-prefix (company--prefix-str entity))
+           (company-suffix (company--suffix-str entity)))
+      (and company-prefix
+           (company-call-frontends 'unhide))))
   (let (inhibit-redisplay)
     (redisplay))
   (when company-candidates (company-call-frontends 'pre-command)))
@@ -4463,26 +4482,14 @@ Delay is determined by `company-tooltip-idle-delay'."
     (delete-overlay company-preview-overlay)
     (setq company-preview-overlay nil)))
 
-(defun company-preview--refresh-prefix (boundaries)
-  (let ((prefix (car boundaries)))
-    (when prefix
-      (if (> (point) company-point)
-          (concat prefix (buffer-substring company-point (point)))
-        (substring prefix 0 (- (length prefix)
-                               (- company-point (point))))))))
-
 (defun company-preview-frontend (command)
   "`company-mode' frontend showing the selection as if it had been inserted."
   (pcase command
     (`pre-command (company-preview-hide))
     (`unhide
      (when company-selection
-       (let* ((current (nth company-selection company-candidates))
-              (boundaries (company--boundaries)))
-         (company-preview-show-at-point (point) current
-                                        (cons
-                                         (company-preview--refresh-prefix 
boundaries)
-                                         (cdr boundaries))))))
+       (let* ((current (nth company-selection company-candidates)))
+         (company-preview-show-at-point (point) current))))
     (`post-command
      (when company-selection
        (company-preview-show-at-point (point)



reply via email to

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