@@ -287,7 +287,7 @@ Returns unresolved completion item detail."
287
287
288
288
(defvar lsp-completion--cache nil
289
289
" 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 ...).
291
291
When the completion is incomplete, `items' contains value of :incomplete." )
292
292
293
293
(defvar lsp-completion--last-result nil
@@ -334,62 +334,49 @@ Return `nil' when fails to guess prefix."
334
334
335
335
(defun lsp-completion--to-internal (items )
336
336
" 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."
357
350
(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))))
393
380
394
381
(defconst lsp-completion--kind->symbol
395
382
'((1 . text)
@@ -561,6 +548,16 @@ Returns resolved completion item details."
561
548
(string-lessp label-left label-right)
562
549
(string-lessp sort-text-left sort-text-right)))))
563
550
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
+
564
561
;;;### autoload
565
562
(defun lsp-completion-at-point ()
566
563
" Get lsp completions."
@@ -589,9 +586,9 @@ Returns resolved completion item details."
589
586
((or done? result) result)
590
587
((and (not lsp-completion-no-cache)
591
588
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 ))))
595
592
(t
596
593
(-let* ((resp (lsp-request-while-no-input
597
594
" textDocument/completion"
@@ -614,7 +611,12 @@ Returns resolved completion item details."
614
611
:_emacsStartPoint
615
612
(or (lsp-completion--guess-prefix item)
616
613
bounds-start)))
617
- it))))
614
+ it)
615
+ ; ; remove items with no label or filterText
616
+ (-remove
617
+ (-lambda ((&CompletionItem :filter-text? :label ))
618
+ (and (lsp-falsy? filter-text?) (lsp-falsy? label)))
619
+ it))))
618
620
(markers (list bounds-start (copy-marker (point ) t )))
619
621
(prefix (buffer-substring-no-properties bounds-start (point )))
620
622
(lsp-completion--no-reordering (not lsp-completion-sort-initial-results)))
@@ -625,17 +627,13 @@ Returns resolved completion item details."
625
627
((and done? (not (seq-empty-p items)))
626
628
(lsp-completion--to-internal items))
627
629
((not done?) :incomplete ))
628
- :lsp-items nil
629
630
:markers markers
630
631
: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))))))
632
+ result (when-let ((items
633
+ (or (and done? (cl-second lsp-completion--cache))
634
+ (and lsp-completion-filter-on-incomplete
635
+ (lsp-completion--to-internal items)))))
636
+ (lsp-completion--make-items items markers prefix)))))))
639
637
(:interrupted lsp-completion--last-result)
640
638
(`, res (setq lsp-completion--last-result res))))))
641
639
(list
0 commit comments