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

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

[elpa] externals/company 57a6554 11/46: company-clang--parse-output: Fil


From: Dmitry Gutov
Subject: [elpa] externals/company 57a6554 11/46: company-clang--parse-output: Filter out duplicates
Date: Wed, 30 Dec 2020 18:33:03 -0500 (EST)

branch: externals/company
commit 57a6554db750567917f1192463e2503787f9b883
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    company-clang--parse-output: Filter out duplicates
    
    Fixes #841
    
    Based on a patch by Gregory Heytings.
---
 NEWS.md          |  2 ++
 company-clang.el | 21 ++++++++++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index ef0773e..dd7276a 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,8 @@
 
 ## Next
 
+* `company-clang` filters out duplicates
+  ([#841](https://github.com/company-mode/company-mode/issues/841)).
 * New user option `company-tooltip-width-grow-only`.
 * `company-xcode` has been removed. It has not been useful for years now.
 * `company-clang` has been moved to after `company-capf` in the default value 
of
diff --git a/company-clang.el b/company-clang.el
index 1460e09..df458c5 100644
--- a/company-clang.el
+++ b/company-clang.el
@@ -136,6 +136,7 @@ or automatically through a custom 
`company-clang-prefix-guesser'."
   (let ((pattern (format company-clang--completion-pattern
                          (regexp-quote prefix)))
         (case-fold-search nil)
+        (results (make-hash-table :test 'equal :size (/ (point-max) 100)))
         lines match)
     (while (re-search-forward pattern nil t)
       (setq match (match-string-no-properties 1))
@@ -144,11 +145,21 @@ or automatically through a custom 
`company-clang-prefix-guesser'."
           (when (string-match ":" match)
             (setq match (substring match 0 (match-beginning 0)))))
         (let ((meta (match-string-no-properties 2)))
-          (when (and meta (not (string= match meta)))
-            (put-text-property 0 1 'meta
-                               (company-clang--strip-formatting meta)
-                               match)))
-        (push match lines)))
+          ;; Avoiding duplicates:
+          ;; https://github.com/company-mode/company-mode/issues/841
+          (cond
+           ;; Either meta != completion (not a macro)
+           ((not (equal match meta))
+            (puthash match meta results))
+           ;; Or it's the first time we see this completion
+           ((eq (gethash match results 'none) 'none)
+            (puthash match nil results))))))
+    (maphash
+     (lambda (match meta)
+       (when meta
+         (put-text-property 0 1 'meta (company-clang--strip-formatting meta) 
match))
+       (push match lines))
+     results)
     lines))
 
 (defun company-clang--meta (candidate)



reply via email to

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