]> rtime.felk.cvut.cz Git - sojka/company-mode.git/blob - company-semantic.el
Added doc-line front-end.
[sojka/company-mode.git] / 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