]> rtime.felk.cvut.cz Git - sojka/company-mode.git/blobdiff - company-semantic.el
Bumped version to 0.4.2.
[sojka/company-mode.git] / company-semantic.el
index c2f6185b86fd4a0568524e6f71414280ae275e77..678a1dd3c0e71534bd2f689ac47688cb5791b643 100644 (file)
@@ -2,7 +2,7 @@
 ;;
 ;; Copyright (C) 2009 Nikolaj Schumacher
 ;;
-;; This file is part of company.
+;; This file is part of company 0.4.2.
 ;;
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License
 (eval-when-compile (require 'cl))
 
 (defcustom company-semantic-metadata-function 'company-semantic-summary-and-doc
-  "*"
+  "*The function turning a semantic tag into doc information."
   :group 'company
   :type 'function)
 
-(defvar company-semantic-context-regexp
-  "\\(->\\|\\.\\|\\_<\\)\\(\\(\\s_\\|\\sw\\)+\\_>\\=\\)")
+(defvar company-semantic-modes '(c-mode c++-mode jde-mode java-mode))
 
 (defun company-semantic-doc-or-summary (tag)
   (or (semantic-documentation-for-tag tag)
           (context (semantic-analyze-current-context)))
       (all-completions prefix (semantic-ia-get-completions context (point))))))
 
+(defun company-semantic-completions-raw (prefix)
+  (let (candidates)
+    (dolist (tag (semantic-analyze-find-tags-by-prefix prefix))
+      (unless (eq (semantic-tag-class tag) 'include)
+        (push (semantic-tag-name tag) candidates)))
+    (delete "" candidates)))
+
+(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 "->\\|\\.")
+        (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))))))
+
+;;;###autoload
 (defun company-semantic (command &optional arg &rest ignored)
   "A `company-mode' completion back-end using CEDET Semantic."
+  (interactive (list 'interactive))
   (case command
-    ('prefix (and (memq major-mode '(c-mode c++-mode jde-mode java-mode))
+    ('interactive (company-begin-backend 'company-semantic))
+    ('prefix (and (memq major-mode company-semantic-modes)
+                  (semantic-active-p)
                   (not (company-in-string-or-comment))
-                  (or (company-grab company-semantic-context-regexp 2) "")))
-    ('candidates (or (company-semantic-completions arg)
-                     (mapcar 'semantic-tag-name
-                             (semantic-analyze-find-tags-by-prefix arg))))
+                  (or (company-semantic--grab) 'stop)))
+    ('candidates (if (and (equal arg "")
+                          (not (looking-back "->\\|\\.")))
+                     (company-semantic-completions-raw arg)
+                   (company-semantic-completions arg)))
     ('meta (funcall company-semantic-metadata-function
                     (semantic-analyze-find-tag arg)))
     ('doc-buffer (company-semantic-doc-buffer (semantic-analyze-find-tag arg)))
     ;; because "" is an empty context and doesn't return local variables
-    ('no-cache (equal arg ""))))
+    ('no-cache (equal arg ""))
+    ('location (let ((tag (semantic-analyze-find-tag arg)))
+                 (when (buffer-live-p (semantic-tag-buffer tag))
+                   (cons (semantic-tag-buffer tag)
+                         (semantic-tag-start tag)))))))
 
 (provide 'company-semantic)
 ;;; company-semantic.el ends here