-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
company-robe.el
69 lines (63 loc) · 2.54 KB
/
company-robe.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(eval-when-compile (require 'robe))
;;;###autoload
(defun company-robe (command &optional arg &rest ignore)
"A `company-mode' completion back-end for `robe-mode'."
(interactive (list 'interactive))
(cl-case command
(interactive (company-begin-backend 'company-robe))
(prefix (and (boundp 'robe-mode)
robe-mode (robe-running-p)
(company-robe--prefix)))
(candidates (robe-complete-thing arg))
(duplicates t)
(meta (company-robe--meta arg))
(location (let ((spec (company-robe--choose-spec arg)))
(cons (robe-spec-file spec)
(robe-spec-line spec))))
(kind (company-robe--kind arg))
(annotation (robe-complete-annotation arg))
(doc-buffer (let ((spec (company-robe--choose-spec arg))
(inhibit-redisplay t)
;; XXX: Maybe revisit company-mode/company-mode#548.
(timer-list nil))
(when spec
(save-window-excursion
(robe-show-doc spec)
(message nil)
(get-buffer "*robe-doc*")))))))
(defun company-robe--meta (completion)
(if-let ((type (get-text-property 0 'robe-type completion)))
(if-let ((vtype (get-text-property 0 'robe-variable-type completion)))
(format "%s => %s" type (propertize vtype 'face 'font-lock-type-face))
type)
(let ((spec (car (robe-cached-specs completion))))
(when spec (robe-signature spec)))))
(defun company-robe--prefix ()
(let ((bounds (robe-complete-bounds)))
(when (and bounds
(equal (point) (cdr bounds))
(robe-complete-symbol-p (car bounds)))
(buffer-substring (car bounds) (cdr bounds)))))
(defun company-robe--choose-spec (thing)
(let ((specs (robe-cached-specs thing)))
(when specs
(if (cdr specs)
(let ((alist (cl-loop for spec in specs
for module = (robe-spec-module spec)
when module
collect (cons module spec))))
(cdr (assoc (robe-completing-read "Module: " alist nil t) alist)))
(car specs)))))
(defun company-robe--kind (arg)
(let (case-fold-search)
(cond
((string-match "\\(?:\\`\\|::\\)\\(?:[A-Z_0-9]*\\|\\([A-Z][A-Z_a-z0-9]*\\)\\)\\'" arg)
(if (match-beginning 1)
'module
'constant))
((string-match-p "\\`@" arg)
'variable)
((get-text-property 0 'robe-type arg)
'value)
(t 'method))))
(provide 'company-robe)