|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
| 3 | +import sys |
3 | 4 | from pathlib import Path
|
4 |
| -from typing import TYPE_CHECKING, Any |
| 5 | +from threading import Event |
| 6 | +from typing import TYPE_CHECKING, Any, Optional, TextIO |
5 | 7 |
|
6 | 8 | from lsprotocol.types import INITIALIZE, LogMessageParams, MessageType
|
7 | 9 | from pygls import uris
|
8 | 10 | from pygls.protocol import LanguageServerProtocol, lsp_method
|
9 |
| -from pygls.server import LanguageServer |
| 11 | +from pygls.server import LanguageServer, StdOutTransportAdapter, aio_readline |
10 | 12 |
|
11 | 13 | if TYPE_CHECKING:
|
12 | 14 | from lsprotocol.types import InitializeParams, InitializeResult
|
@@ -81,3 +83,39 @@ def show_message_log(self, message: str, message_type: str) -> None:
|
81 | 83 | # Send log message to client (appears in output channel)
|
82 | 84 | log_params = LogMessageParams(type=lsp_message_type, message=message)
|
83 | 85 | self.lsp.notify("window/logMessage", log_params)
|
| 86 | + |
| 87 | + def cleanup_the_optimizer(self) -> None: |
| 88 | + try: |
| 89 | + self.optimizer.cleanup_temporary_paths() |
| 90 | + # restore args and test cfg |
| 91 | + if self.optimizer.original_args_and_test_cfg: |
| 92 | + self.optimizer.args, self.optimizer.test_cfg = self.optimizer.original_args_and_test_cfg |
| 93 | + self.optimizer.args.function = None |
| 94 | + self.optimizer.current_worktree = None |
| 95 | + self.optimizer.current_function_optimizer = None |
| 96 | + except Exception: |
| 97 | + self.show_message_log("Failed to cleanup optimizer", "Error") |
| 98 | + |
| 99 | + def start_io(self, stdin: Optional[TextIO] = None, stdout: Optional[TextIO] = None) -> None: |
| 100 | + self.show_message_log("Starting IO server", "Info") |
| 101 | + |
| 102 | + self._stop_event = Event() |
| 103 | + transport = StdOutTransportAdapter(stdin or sys.stdin.buffer, stdout or sys.stdout.buffer) |
| 104 | + self.lsp.connection_made(transport) |
| 105 | + try: |
| 106 | + self.loop.run_until_complete( |
| 107 | + aio_readline( |
| 108 | + self.loop, |
| 109 | + self.thread_pool_executor, |
| 110 | + self._stop_event, |
| 111 | + stdin or sys.stdin.buffer, |
| 112 | + self.lsp.data_received, |
| 113 | + ) |
| 114 | + ) |
| 115 | + except BrokenPipeError: |
| 116 | + self.show_message_log("Connection to the client is lost! Shutting down the server.", "Error") |
| 117 | + except (KeyboardInterrupt, SystemExit): |
| 118 | + pass |
| 119 | + finally: |
| 120 | + self.cleanup_the_optimizer() |
| 121 | + self.shutdown() |
0 commit comments