Skip to content

Commit 31817f7

Browse files
committed
Got the client side working
1 parent 17bee57 commit 31817f7

File tree

5 files changed

+67
-24
lines changed

5 files changed

+67
-24
lines changed

typescript/commands/error_list.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
class TypescriptProjectErrorList(TypeScriptBaseWindowCommand):
88

99
def run(self):
10+
panel_manager = get_panel_manager()
11+
panel_manager.add_panel("errorlist")
12+
panel_manager.show_panel("errorlist")
13+
1014
if not cli.node_client.workerStarted():
1115
view = active_view()
1216
# start worker process
1317
cli.node_client.startWorker()
1418
# load the active project
1519
get_info(view)
1620
# send the first error request
17-
cli.service.request_get_err_for_project(0, view.file_name())
18-
start_timer()
19-
20-
panel_manager = get_panel_manager()
21-
panel_manager.add_panel("errorlist")
22-
panel_manager.show_panel("errorlist")
21+
# cli.service.request_get_err_for_project(0, view.file_name())
22+
start_timer()

typescript/libs/node_client.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,13 @@ def startWorker(self):
122122
[node_path, self.script_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
123123

124124
# start reader thread
125-
if self.__serverProc and (not self.__serverProc.poll()):
126-
log.debug("server proc " + str(self.__serverProc))
127-
log.debug("starting reader thread")
128-
readerThread = threading.Thread(target=NodeCommClient.__reader, args=(
129-
self.__serverProc.stdout, self.__msgq, self.__eventq, self.asyncReq, self.__serverProc))
130-
readerThread.daemon = True
131-
readerThread.start()
132-
log.debug("readerThread.is_alive: {0}".format(readerThread.is_alive()))
125+
if self.__workerProc and (not self.__workerProc.poll()):
126+
log.debug("worker proc " + str(self.__workerProc))
127+
log.debug("starting worker thread")
128+
workerThread = threading.Thread(target=NodeCommClient.__reader, args=(
129+
self.__workerProc.stdout, self.__msgq, self.__worker_eventq, self.asyncReq, self.__workerProc))
130+
workerThread.daemon = True
131+
workerThread.start()
133132

134133
def stopWorker(self):
135134
NodeCommClient.stop_worker = True
@@ -308,12 +307,12 @@ def __readMsg(stream, msgq, eventq, asyncReq, proc):
308307

309308
if body_length > 0:
310309
data = stream.read(body_length)
311-
log.debug('Read body of length: {0}'.format(body_length))
310+
# log.debug('Read body of length: {0}'.format(body_length))
312311
data_json = data.decode("utf-8")
313312
data_dict = json_helpers.decode(data_json)
314313
if data_dict['type'] == "response":
315314
request_seq = data_dict['request_seq']
316-
log.debug('Body sequence#: {0}'.format(request_seq))
315+
# log.debug('Body sequence#: {0}'.format(request_seq))
317316
if request_seq in asyncReq:
318317
callback = asyncReq.pop(request_seq, None)
319318
if callback:

typescript/libs/panel_manager.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import sublime
1+
import sublime
22

33
class PanelManager:
44

@@ -13,13 +13,24 @@ def get_panel(self, panel_name):
1313
def add_panel(self, panel_name):
1414
if panel_name not in self.panels:
1515
self.panels[panel_name] = sublime.active_window().create_output_panel(panel_name)
16+
self.panels[panel_name].set_read_only(True)
17+
self.panels[panel_name].settings().set("auto_indent", False)
18+
self.panels[panel_name].settings().set("draw_white_space", "none")
1619

1720
def is_panel_active(self, panel_name):
1821
return panel_name in self.panels and self.panels[panel_name].window() is not None
1922

2023
def show_panel(self, panel_name):
2124
sublime.active_window().run_command("show_panel", {"panel": "output." + panel_name})
2225

26+
def write_lines_to_panel(self, panel_name, lines):
27+
panel = self.panels[panel_name]
28+
panel.set_read_only(False)
29+
panel.run_command("select_all")
30+
panel.run_command("right_delete")
31+
panel.run_command("insert", {"characters": "\n".join(lines)})
32+
self.panels[panel_name].set_read_only(True)
33+
2334
def hide_panel(self):
2435
sublime.active_window().run_command("hide_panel")
2536

typescript/listeners/idle.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ def on_activated_with_info(self, view, info):
1818
self.request_errors(view, info, 200)
1919

2020
# set modified and selection idle timers, so we can read
21-
# diagnostics and update
22-
# status line
21+
# diagnostics and update status line
2322
self.set_on_idle_timer(IDLE_TIME_LENGTH)
2423
self.set_on_selection_idle_timer(IDLE_TIME_LENGTH)
2524
self.just_changed_focus = True

typescript/listeners/project_error_list.py

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def __init__(self):
1111
self.modified = False
1212
self.error_info_requested_not_received = False
1313
self.pending_timeout = 0
14+
self.errors = dict()
1415

1516
def is_error_list_panel_active(self):
1617
return get_panel_manager().is_panel_active("errorlist")
@@ -46,30 +47,63 @@ def on_idle(self):
4647
if info:
4748
log.debug("asking for project errors")
4849
if self.is_error_list_panel_active():
49-
self.request_errors(view, info, 500)
50+
self.request_errors(view, info, 100)
5051
else:
5152
cli.node_client.stopWorker()
5253

5354
def update_error_list_panel(self):
5455
test_ev = cli.service.get_event_from_worker()
5556
if test_ev:
5657
self.error_info_requested_not_received = False
57-
panel_manager = get_panel_manager()
58-
error_list_panel = panel_manager.get_panel("errorlist")
58+
self.load_error(test_ev)
59+
60+
# There may be multiple events coming simultaniously
5961
while test_ev:
60-
error_list_panel.run_command("append", {"characters": str(test_ev) + "\n"})
62+
self.load_error(test_ev)
6163
test_ev = cli.service.get_event_from_worker()
64+
65+
output_lines = []
66+
for file in self.errors:
67+
if len(self.errors[file]["syntaxDiag"]) + len(self.errors[file]["semanticDiag"]) > 0:
68+
output_lines.append(file)
69+
output_lines.extend(self.errors[file]["syntaxDiag"] + self.errors[file]["semanticDiag"])
70+
get_panel_manager().write_lines_to_panel("errorlist", output_lines)
6271
self.set_on_idle_timer(50)
6372
elif self.error_info_requested_not_received:
6473
self.set_on_idle_timer(50)
6574

75+
def load_error(self, json_dict):
76+
if json_dict["type"] != "event":
77+
return
78+
79+
error_type = json_dict["event"]
80+
if error_type not in ["syntaxDiag", "semanticDiag"]:
81+
return
82+
83+
body = json_dict["body"]
84+
if body is not None:
85+
file = body["file"]
86+
if file not in self.errors:
87+
self.errors[file] = { "syntaxDiag": [], "semanticDiag": [] }
88+
self.errors[file][error_type] = []
89+
diags = body["diagnostics"]
90+
for diag in diags:
91+
message = " ({0}, {1}) {2}".format(
92+
diag["start"]["line"],
93+
diag["start"]["offset"],
94+
diag["text"]
95+
)
96+
self.errors[file][error_type].append(message)
97+
6698
def request_errors(self, view, info, error_delay):
6799
if info and self.is_error_list_panel_active() and (
68100
self.just_changed_focus or
69-
info.change_count_when_last_err_req_sent < change_count(view)
101+
self.modified
70102
):
71103
self.just_changed_focus = False
104+
self.modified = False
72105
cli.service.request_get_err_for_project(error_delay, view.file_name())
106+
self.error_info_requested_not_received = True
73107
self.set_on_idle_timer(error_delay + 300)
74108

75109
listener = ProjectErrorListener()

0 commit comments

Comments
 (0)