]> code.delx.au - gnu-emacs-elpa/commitdiff
Add company-semantic-begin-after-member-access
authorDmitry Gutov <dgutov@yandex.ru>
Sun, 17 Jan 2016 11:11:18 +0000 (14:11 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Sun, 17 Jan 2016 11:11:18 +0000 (14:11 +0300)
To change company-semantic's behavior closer to company-clang

NEWS.md
company-semantic.el

diff --git a/NEWS.md b/NEWS.md
index fab296c84a99b6a4067cf3949d1a7b514c64ae00..3a22f7e7c75bef430d39a65c6c39e045fd18f403 100644 (file)
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,8 @@
 
 ## Next
 
+* `company-semantic-begin-after-member-access`: New option. Similar to the one
+  in `company-clang`.
 * `company-capf` accepts `:company-prefix-length` property function.
 * New face `company-tooltip-annotation-selection`, used for the annotation in
   the selected tooltip line.
index 237439e5f01b59326e6e324951b6e8682c7acc18..27522da5d95a7c8b2ea1ed3110444faebbdd1c06 100644 (file)
   "The function turning a semantic tag into doc information."
   :type 'function)
 
+(defcustom company-semantic-begin-after-member-access t
+  "When non-nil, automatic completion will start whenever the current
+symbol is preceded by \".\", \"->\" or \"::\", ignoring
+`company-minimum-prefix-length'.
+
+If `company-begin-commands' is a list, it should include `c-electric-lt-gt'
+and `c-electric-colon', for automatic completion right after \">\" and
+\":\".")
+
 (defvar company-semantic-modes '(c-mode c++-mode jde-mode java-mode))
 
 (defvar-local company-semantic--current-tags nil
                        (par-pos (string-match "(" prototype)))
                   (when par-pos (substring prototype par-pos)))))))
 
-(defun company-semantic--pre-prefix-length (prefix-length)
-  "Sum up the length of all chained symbols before POS.
-Symbols are chained by \".\" or \"->\"."
-  (save-excursion
-    (let ((pos (point)))
-      (goto-char (- (point) prefix-length))
-      (while (looking-back "->\\|\\." (- (point) 2))
-        (goto-char (match-beginning 0))
-        (skip-syntax-backward "w_"))
-      (- pos (point)))))
-
-(defun company-semantic--grab ()
-  "Grab the semantic prefix, but return everything before -> or . as length."
-  (let ((symbol (company-grab-symbol)))
-    (when symbol
-      (cons symbol (company-semantic--pre-prefix-length (length symbol))))))
+(defun company-semantic--prefix ()
+  (if company-semantic-begin-after-member-access
+      (company-grab-symbol-cons "\\.\\|->\\|::" 2)
+    (company-grab-symbol)))
 
 ;;;###autoload
 (defun company-semantic (command &optional arg &rest ignored)
@@ -135,7 +132,7 @@ Symbols are chained by \".\" or \"->\"."
                  (semantic-active-p)
                  (memq major-mode company-semantic-modes)
                  (not (company-in-string-or-comment))
-                 (or (company-semantic--grab) 'stop)))
+                 (or (company-semantic--prefix) 'stop)))
     (candidates (if (and (equal arg "")
                          (not (looking-back "->\\|\\." (- (point) 2))))
                     (company-semantic-completions-raw arg)