Skip to content

Commit 3a6d2e8

Browse files
committed
completion is now calculated in a separate thread
1 parent e0065d4 commit 3a6d2e8

File tree

3 files changed

+95
-106
lines changed

3 files changed

+95
-106
lines changed

robotcode/jsonrpc2/protocol.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def send_message(self, message: JsonRPCMessage) -> None:
503503
).encode(self.CHARSET)
504504

505505
header = (
506-
f"Content-Length: {len(body)}\r\n" f"Content-Type: {self.CONTENT_TYPE}; charset={self.CHARSET}\r\n\r\n"
506+
f"Content-Length: {len(body)}\r\nContent-Type: {self.CONTENT_TYPE}; charset={self.CHARSET}\r\n\r\n"
507507
).encode("ascii")
508508

509509
self._message_logger.debug(
@@ -640,30 +640,31 @@ async def handle_request(self, message: JsonRPCRequest) -> None:
640640
)
641641
return
642642

643-
try:
644-
params = self._convert_params(e.method, e.param_type, message.params)
643+
params = self._convert_params(e.method, e.param_type, message.params)
645644

646-
result = asyncio.create_task(ensure_coroutine(e.method)(*params[0], **params[1]))
645+
result = asyncio.create_task(ensure_coroutine(e.method)(*params[0], **params[1]), name=message.method)
647646

648-
with self._received_request_lock:
649-
self._received_request[message.id] = ReceivedRequestEntry(result, message)
647+
with self._received_request_lock:
648+
self._received_request[message.id] = ReceivedRequestEntry(result, message)
650649

650+
def done(t: asyncio.Task[Any]) -> None:
651651
try:
652-
self.send_response(message.id, await result)
652+
self.send_response(message.id, t.result())
653+
except asyncio.CancelledError:
654+
self._logger.info(f"request message {repr(message)} canceled")
655+
except (SystemExit, KeyboardInterrupt):
656+
raise
657+
except JsonRPCErrorException as ex:
658+
self._logger.exception(ex)
659+
self.send_error(ex.code, ex.message, id=message.id, data=ex.data)
660+
except BaseException as e:
661+
self._logger.exception(e)
662+
self.send_error(JsonRPCErrors.INTERNAL_ERROR, f"{type(e).__name__}: {e}", id=message.id)
653663
finally:
654664
with self._received_request_lock:
655665
self._received_request.pop(message.id, None)
656666

657-
except asyncio.CancelledError:
658-
self._logger.info(f"request message {repr(message)} canceled")
659-
except (SystemExit, KeyboardInterrupt):
660-
raise
661-
except JsonRPCErrorException as ex:
662-
self._logger.exception(ex)
663-
self.send_error(ex.code, ex.message, id=message.id, data=ex.data)
664-
except BaseException as e:
665-
self._logger.exception(e)
666-
self.send_error(JsonRPCErrors.INTERNAL_ERROR, f"{type(e).__name__}: {e}", id=message.id)
667+
result.add_done_callback(done)
667668

668669
async def cancel_request(self, id: Union[int, str, None]) -> None:
669670
with self._received_request_lock:
@@ -687,7 +688,8 @@ async def handle_notification(self, message: JsonRPCNotification) -> None:
687688
params = self._convert_params(e.method, e.param_type, message.params)
688689
result = e.method(*params[0], **params[1])
689690
if inspect.isawaitable(result):
690-
await result
691+
asyncio.create_task(result)
692+
691693
except asyncio.CancelledError:
692694
pass
693695
except (SystemExit, KeyboardInterrupt):

robotcode/language_server/common/parts/diagnostics.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
__all__ = ["DiagnosticsProtocolPart", "DiagnosticsResult"]
2121

22-
DIAGNOSTICS_DEBOUNCE = 0.75
22+
DIAGNOSTICS_DEBOUNCE = 1.5
2323

2424

2525
class PublishDiagnosticsEntry:
@@ -57,7 +57,9 @@ def _done(t: asyncio.Task[Any]) -> None:
5757

5858
self._task.add_done_callback(_done)
5959

60-
self._timer_handle: asyncio.TimerHandle = asyncio.get_event_loop().call_later(DIAGNOSTICS_DEBOUNCE, create_task)
60+
self._timer_handle: asyncio.TimerHandle = asyncio.get_running_loop().call_later(
61+
DIAGNOSTICS_DEBOUNCE, create_task
62+
)
6163

6264
def __del__(self) -> None:
6365
if self.task is not None:
@@ -155,9 +157,7 @@ async def _cancel_entry(self, entry: Optional[PublishDiagnosticsEntry]) -> None:
155157
if entry is None:
156158
return
157159
if not entry.done:
158-
cancel_task = entry.cancel()
159-
if cancel_task is not None:
160-
await cancel_task
160+
entry.cancel()
161161

162162
@language_id("robotframework")
163163
@_logger.call

0 commit comments

Comments
 (0)