forked from centny/GoGdb
/
gsstest.py
243 lines (225 loc) · 6.46 KB
/
gsstest.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
import sys
import os
gswd=os.path.join(os.path.dirname(os.getcwd()),"GoSublime")
sys.path.append(gswd)
from gosubl import gs
from gosubl import mg9
import gs9o
from sublimegdb import project_path
from sublimegdb import project_pathv
from sublimegdb import pkg_pathv
from sublimegdb import GoBuilder
from sublimegdb import GDBView
from sublimegdb import get_setting
from sublimegdb import CmdThread
from sublimegdb import n_console_view
import re
import sublime
import sublime_plugin
import threading
import subprocess
import time
DOMAIN = 'GssTest'
TEST_PAT = re.compile(r'^((Test|Example|Benchmark)\w*)')
w_builders={}
class GssShowConsole(sublime_plugin.WindowCommand):
def is_enabled(self):
print n_console_view.listener(self.window)
return n_console_view.listener(self.window)==None
def run(self):
sublime.active_window().set_layout(
{
"cols": [0.0, 1.0],
"rows": [0.0, 0.75, 1.0],
"cells": [[0, 0, 1, 1],[0, 1, 1, 2]]
})
n_console_view.ShowConsoleView(self.window)
class GssShowDebug(sublime_plugin.TextCommand):
def run(self,edit):
print "runnnnn"
class GssGs9oAddLine(sublime_plugin.TextCommand):
def run(self,edit,line):
win = self.view.window()
wid = win.id()
wd=gs9o.active_wd(win)
id = gs9o._wdid(wd)
st = gs9o.stash.setdefault(wid, {})
v = st.get(id)
if v is None:
v = win.get_output_panel(id)
st[id] = v
v.insert(edit, v.size(), line)
v.show(v.size())
class GssGs9oClear(sublime_plugin.TextCommand):
def run(self,edit):
win = self.view.window()
wid = win.id()
wd=gs9o.active_wd(win)
id = gs9o._wdid(wd)
st = gs9o.stash.setdefault(wid, {})
v = st.get(id)
if v is None:
v = win.get_output_panel(id)
st[id] = v
v.replace(edit,sublime.Region(0, v.size()),"")
class GssSaveListener(sublime_plugin.EventListener):
def __init__(self):
self.loading=False
def on_post_save(self,view):
if self.loading and self.loading:
return
self.loading=True
apath=view.file_name()
if apath.find(".go")!=len(apath)-3:
return
apath=view.file_name()
itest=apath.find("_test.go")==len(apath)-8
wid=view.window().id()
g_builder=GoBuilder()
o_b=None
if w_builders.has_key(wid):
o_b=w_builders[wid]
if o_b is not None and o_b.is_running():
g_builder.initEnv(itest,"",view,None)
else:
g_builder.initEnv(itest,"",view,n_console_view)
# g_builder.showLView()
g_builder.build(False)
self.loading=False
def on_close(self,view):
if view.name()=="Console":
n_console_view.rm_listener(sublime.active_window())
sublime.set_timeout(self.resetLayout, 1)
# n_console_view.view=None
def resetLayout(self):
sublime.active_window().set_layout(
{
"cols": [0.0, 1.0],
"rows": [0.0, 1.0],
"cells": [[0, 0, 1, 1]]
}
)
class GssStopCommand(sublime_plugin.WindowCommand):
def is_enabled(self):
global w_builders
g_builder=None
wid=self.window.id()
if w_builders.has_key(wid):
g_builder=w_builders[wid]
return g_builder is not None and g_builder.is_running()
def run(self):
global w_builders
g_builder=None
wid=self.window.id()
if w_builders.has_key(wid):
g_builder=w_builders[wid]
if g_builder is not None:
g_builder.bstop()
g_builder.rstop()
class GssRunCommand(sublime_plugin.WindowCommand):
def is_enabled(self):
aview=self.window.active_view()
apath=aview.file_name()
return apath is not None and apath.find(".go")==len(apath)-3
def run(self,debug=False):
global w_builders
g_builder=None
wid=self.window.id()
if w_builders.has_key(wid):
g_builder=w_builders[wid]
if (g_builder is not None) and (g_builder.is_running()):
return
aview=self.window.active_view()
apath=aview.file_name()
if apath.find("_test.go")==len(apath)-8:
self.window.run_command("gss_test")
return
g_builder=GoBuilder()
g_builder.initEnv(False,"",self.window.active_view(),n_console_view)
w_builders[wid]=g_builder
g_builder.run()
# aview.run_command('gs9o_open', {'run': ['sh',gb.sbinp(),gb.args],'wd': project_path(self.window)})
class GssTestCommand(sublime_plugin.WindowCommand):
def is_enabled(self):
return gs.is_go_source_view(self.window.active_view())
def run(self,debug=False):
global w_builders
g_builder=None
wid=self.window.id()
if w_builders.has_key(wid):
g_builder=w_builders[wid]
if (g_builder is not None) and (g_builder.is_running()):
g_builder.showLView()
return
def f(res, err):
if err:
gs.notify(DOMAIN, err)
return
mats = {}
args = {}
decls = res.get('file_decls', [])
decls.extend(res.get('pkg_decls', []))
for d in decls:
name = d['name']
prefix, _ = match_prefix_name(name)
if prefix and d['kind'] == 'func' and d['repr'] == '':
mats[True] = prefix
args[name] = name
names = sorted(args.keys())
ents = ['Run all tests and examples']
for k in ['Test', 'Benchmark', 'Example']:
if mats.get(k):
s = 'Run %ss Only' % k
ents.append(s)
if k == 'Benchmark':
args[s] = ['-test.run=none', '-test.bench="%s.*"' % k]
else:
args[s] = ['-test.run="%s.*"' % k]
for k in names:
ents.append(k)
if k.startswith('Benchmark'):
args[k] = ['-test.run=none', '-test.bench="^%s$"' % k]
else:
args[k] = ['-test.run=^%s$' % k]
def cb(i, win):
if i >= 0:
a = args.get(ents[i], [])
sargs=""
if len(a)>0:
sargs=a[0]
# print sargs
if debug:
win.run_command('gdb_launch', {'test':True,'trun':sargs})
else:
global g_builder
g_builder=GoBuilder()
g_builder.initEnv(True,sargs,self.window.active_view(),n_console_view)
g_builder.run()
gs.show_quick_panel(ents, cb)
win, view = gs.win_view(None, self.window)
if view is None:
return
vfn = gs.view_fn(view)
src = gs.view_src(view)
pkg_dir = ''
if view.file_name():
pkg_dir = os.path.dirname(view.file_name())
mg9.declarations(vfn, src, pkg_dir, f)
def match_prefix_name(s):
m = TEST_PAT.match(s)
return (m.group(2), m.group(1)) if m else ('', '')
def handle_action(view, action):
fn = view.file_name()
prefix, name = match_prefix_name(view.substr(view.word(gs.sel(view))))
ok = prefix and fn and fn.endswith('_test.go')
if ok:
if action == 'right-click':
pat = '^%s.*' % prefix
else:
pat = '^%s$' % name
if prefix == 'Benchmark':
cmd = ['go', 'test', '-test.run=none', '-test.bench="%s"' % pat]
else:
cmd = ['go', 'test', '-test.run="%s"' % pat]
view.run_command('gs9o_open', {'run': cmd})
return ok