forked from DisposaBoy/GoSublime
/
gsdoc.py
65 lines (58 loc) · 1.88 KB
/
gsdoc.py
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
import gscommon as gs, margo
import sublime, sublime_plugin
DOMAIN = 'GsDoc'
class GsDocCommand(sublime_plugin.TextCommand):
def is_enabled(self):
return gs.is_go_source_view(self.view)
def run(self, _, mode=''):
view = self.view
if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']):
return
pt = view.sel()[0].begin()
r = view.word(pt)
r2 = None
if r.begin() > 1 and view.substr(sublime.Region(r.begin()-1, r.begin())) == ".":
r2 = view.word(r.begin()-2)
if not r2 and view.substr(sublime.Region(r.end(), r.end()+1)) == ".":
r2 = view.word(r.end()+2)
if r2:
r = sublime.Region(min(r.begin(), r2.begin()), max(r.end(), r2.end()))
expr = view.substr(r)
src = view.substr(sublime.Region(0, view.size()))
docs, err = margo.doc(view.file_name(), src, pt, expr)
if err:
gs.notice(DOMAIN, err)
elif docs:
if mode == "goto":
fn = ''
flags = 0
for d in docs:
fn = d.get('fn', '')
row = d.get('row', 0)
col = d.get('col', 0)
if row > 0:
flags = sublime.ENCODED_POSITION
fn = '%s:%d:%d' % (fn, row+1, col+1)
if fn:
view.window().open_file(fn, flags)
else:
gs.notice(DOMAIN, "cannot find definition for `%s'" % expr)
elif mode == "hint":
s = []
for d in docs:
s.append('%s\n\n%s' % (d.get('decl'), d.get('doc')))
s = '\n\n\n\n'.join(s)
panel = view.window().get_output_panel(DOMAIN)
edit = panel.begin_edit()
try:
panel.set_read_only(False)
panel.sel().clear()
panel.replace(edit, sublime.Region(0, panel.size()), s)
panel.set_read_only(True)
finally:
panel.end_edit(edit)
view.window().run_command("show_panel", {"panel": "output.%s" % DOMAIN})
else:
gs.notice(DOMAIN, "no docs found for `%s'" % expr)
else:
gs.notice(DOMAIN, 'cannot find a valid name: currently supports only pkg.Func')