@@ -287,7 +287,7 @@ Returns unresolved completion item detail."
287287
288288(defvar lsp-completion--cache nil
289289 " Cached candidates for completion at point function.
290- In the form of plist (prefix-pos items :lsp-items : prefix ...).
290+ In the form of plist (prefix-pos items :prefix ...).
291291When the completion is incomplete, `items' contains value of :incomplete." )
292292
293293(defvar lsp-completion--last-result nil
@@ -334,62 +334,49 @@ Return `nil' when fails to guess prefix."
334334
335335(defun lsp-completion--to-internal (items )
336336 " Convert ITEMS into internal form."
337- (--> items
338- (-map (-lambda ((item &as &CompletionItem
339- :label
340- :filter-text?
341- :_emacsStartPoint start-point
342- :score? ))
343- `( :label ,(or (unless (lsp-falsy? filter-text?) filter-text?) label)
344- :item , item
345- :start-point , start-point
346- :score , score? ))
347- it)))
348-
349- (cl-defun lsp-completion--filter-candidates (items &key
350- lsp-items
351- markers
352- prefix
353- &allow-other-keys )
354- " List all possible completions in cached ITEMS with their prefixes.
355- We can pass LSP-ITEMS, which will be used when there's no cache.
356- The MARKERS and PREFIX value will be attached to each candidate."
337+ (-map (-lambda ((item &as &CompletionItem
338+ :label
339+ :filter-text?
340+ :_emacsStartPoint start-point
341+ :score? ))
342+ `( :label ,(or filter-text? label)
343+ :item , item
344+ :start-point , start-point
345+ :score , score? ))
346+ items))
347+
348+ (defun lsp-completion--filter-candidates (items )
349+ " List all possible completions in cached ITEMS with their prefixes."
357350 (lsp--while-no-input
358- (->>
359- (if items
360- (--> (let (queries fuz-queries)
361- (-keep (-lambda ((cand &as &plist :label :start-point :score ))
362- (let* ((query (or (plist-get queries start-point)
363- (let ((s (buffer-substring-no-properties
364- start-point (point ))))
365- (setq queries (plist-put queries start-point s))
366- s)))
367- (fuz-query (or (plist-get fuz-queries start-point)
368- (let ((s (lsp-completion--regex-fuz query)))
369- (setq fuz-queries
370- (plist-put fuz-queries start-point s))
371- s)))
372- (label-len (length label))
373- (case-fold-search completion-ignore-case))
374- (when (string-match fuz-query label)
375- (put-text-property 0 label-len 'match-data (match-data ) label)
376- (plist-put cand
377- :sort-score
378- (* (or (lsp-completion--fuz-score query label) 1e-05 )
379- (or score 0.001 )))
380- cand)))
381- items))
382- (if lsp-completion--no-reordering
383- it
384- (sort it (lambda (o1 o2 )
385- (> (plist-get o1 :sort-score )
386- (plist-get o2 :sort-score )))))
387- ; ; TODO: pass additional function to sort the candidates
388- (-map (-rpartial #'plist-get :item ) it))
389- lsp-items)
390- (-map (lambda (item ) (lsp-completion--make-item item
391- :markers markers
392- :prefix prefix))))))
351+ (--> (let (queries fuz-queries)
352+ (-keep (-lambda ((cand &as &plist :label :start-point :score ))
353+ (let* ((query (or (plist-get queries start-point)
354+ (let ((s (buffer-substring-no-properties
355+ start-point (point ))))
356+ (setq queries (plist-put queries start-point s))
357+ s)))
358+ (fuz-query (or (plist-get fuz-queries start-point)
359+ (let ((s (lsp-completion--regex-fuz query)))
360+ (setq fuz-queries
361+ (plist-put fuz-queries start-point s))
362+ s)))
363+ (label-len (length label))
364+ (case-fold-search completion-ignore-case))
365+ (when (string-match fuz-query label)
366+ (put-text-property 0 label-len 'match-data (match-data ) label)
367+ (plist-put cand
368+ :sort-score
369+ (* (or (lsp-completion--fuz-score query label) 1e-05 )
370+ (or score 0.001 )))
371+ cand)))
372+ items))
373+ (if lsp-completion--no-reordering
374+ it
375+ (sort it (lambda (o1 o2 )
376+ (> (plist-get o1 :sort-score )
377+ (plist-get o2 :sort-score )))))
378+ ; ; TODO: pass additional function to sort the candidates
379+ (-map (-rpartial #'plist-get :item ) it))))
393380
394381(defconst lsp-completion--kind->symbol
395382 '((1 . text)
@@ -561,6 +548,16 @@ Returns resolved completion item details."
561548 (string-lessp label-left label-right)
562549 (string-lessp sort-text-left sort-text-right)))))
563550
551+ (defun lsp-completion--make-items (items markers prefix )
552+ " Make completion candidates for CAPF.
553+
554+ ITEMS are raw LSP CompletionItems, MARKERS are buffer boundary positions
555+ of the PREFIX string."
556+ (-map
557+ (lambda (item )
558+ (lsp-completion--make-item item :markers markers :prefix prefix))
559+ (lsp-completion--filter-candidates items)))
560+
564561;;;### autoload
565562(defun lsp-completion-at-point ()
566563 " Get lsp completions."
@@ -589,9 +586,9 @@ Returns resolved completion item details."
589586 ((or done? result) result)
590587 ((and (not lsp-completion-no-cache)
591588 same-session?
592- (listp ( cl-second lsp-completion--cache) ))
593- (setf result (apply # ' lsp-completion--filter-candidates
594- ( cdr lsp-completion--cache ))))
589+ (cl-second lsp-completion--cache))
590+ (setf result (pcase-let* ((`( , _ , items , markers , prefix ) ( cdr lsp-completion--cache)))
591+ ( lsp-completion--make-items items markers prefix ))))
595592 (t
596593 (-let* ((resp (lsp-request-while-no-input
597594 " textDocument/completion"
@@ -610,11 +607,17 @@ Returns resolved completion item details."
610607 (lsp-completion--sort-completions it)
611608 it)
612609 (-map (lambda (item )
610+ ; ; FIXME: should we ever deal with the hash-table case?
613611 (lsp-put item
614612 :_emacsStartPoint
615613 (or (lsp-completion--guess-prefix item)
616614 bounds-start)))
617- it))))
615+ it)
616+ ; ; remove items with no label or filterText
617+ (-remove
618+ (-lambda ((&CompletionItem :filter-text? :label ))
619+ (and (lsp-falsy? filter-text?) (lsp-falsy? label)))
620+ it))))
618621 (markers (list bounds-start (copy-marker (point ) t )))
619622 (prefix (buffer-substring-no-properties bounds-start (point )))
620623 (lsp-completion--no-reordering (not lsp-completion-sort-initial-results)))
@@ -625,17 +628,13 @@ Returns resolved completion item details."
625628 ((and done? (not (seq-empty-p items)))
626629 (lsp-completion--to-internal items))
627630 ((not done?) :incomplete ))
628- :lsp-items nil
629631 :markers markers
630632 :prefix prefix)
631- result (lsp-completion--filter-candidates
632- (cond (done?
633- (cl-second lsp-completion--cache))
634- (lsp-completion-filter-on-incomplete
635- (lsp-completion--to-internal items)))
636- :lsp-items items
637- :markers markers
638- :prefix prefix))))))
633+ result (when-let ((items
634+ (or (and done? (cl-second lsp-completion--cache))
635+ (and lsp-completion-filter-on-incomplete
636+ (lsp-completion--to-internal items)))))
637+ (lsp-completion--make-items items markers prefix)))))))
639638 (:interrupted lsp-completion--last-result)
640639 (`, res (setq lsp-completion--last-result res))))))
641640 (list
0 commit comments