]> code.delx.au - gnu-emacs-elpa/blob - company-semantic.el
Added doc-line front-end.
[gnu-emacs-elpa] / company-semantic.el
1 (require 'company)
2 (require 'semantic-ia)
3 (eval-when-compile (require 'cl))
4
5 (defcustom company-semantic-metadata-function 'company-semantic-summary-and-doc
6 "*"
7 :group 'company
8 :type 'function)
9
10 (defvar company-semantic-context-regexp
11 "\\(->\\|\\.\\|\\_<\\)\\(\\(\\s_\\|\\sw\\)+\\_>\\=\\)")
12
13 (defun company-semantic-doc-or-summary (tag)
14 (or (semantic-documentation-for-tag tag)
15 (funcall semantic-idle-summary-function tag nil t)))
16
17 (defun company-semantic-summary-and-doc (tag)
18 (let ((doc (semantic-documentation-for-tag tag))
19 (summary (funcall semantic-idle-summary-function tag nil t)))
20 (and (stringp doc)
21 (string-match "\n*\\(.*\\)$" doc)
22 (setq doc (match-string 1 doc)))
23 (concat (funcall semantic-idle-summary-function tag nil t)
24 (when doc
25 (if (< (+ (length doc) (length summary) 4) (window-width))
26 " -- "
27 "\n"))
28 doc)))
29
30 (defsubst company-semantic-completions (prefix)
31 (ignore-errors
32 (let ((completion-ignore-case nil)
33 (context (semantic-analyze-current-context)))
34 (all-completions prefix (semantic-ia-get-completions context (point))))))
35
36 (defun company-semantic (command &optional arg &rest ignored)
37 (case command
38 ('prefix (and (memq major-mode '(c-mode c++-mode jde-mode java-mode))
39 (not (company-in-string-or-comment))
40 (or (company-grab company-semantic-context-regexp 2) "")))
41 ('candidates (or (company-semantic-completions arg)
42 (mapcar 'semantic-tag-name
43 (semantic-analyze-find-tags-by-prefix arg))))
44 ('meta (funcall company-semantic-metadata-function
45 (semantic-analyze-find-tag arg)))))
46
47 (provide 'company-semantic)
48 ;;; company-semantic.el ends here