Skip to content

Commit a4323aa

Browse files
Merge pull request #77 from engines-dev/start-new-session
Let language server subprocess be its own process group
2 parents ba749cb + c85e282 commit a4323aa

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

src/multilspy/language_server.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ def logging_fn(source, target, msg):
159159

160160
# cmd is obtained from the child classes, which provide the language specific command to start the language server
161161
# LanguageServerHandler provides the functionality to start the language server and communicate with it
162-
self.server: LanguageServerHandler = LanguageServerHandler(process_launch_info, logger=logging_fn)
162+
self.server: LanguageServerHandler = LanguageServerHandler(
163+
process_launch_info,
164+
logger=logging_fn,
165+
start_independent_lsp_process=config.start_independent_lsp_process,
166+
)
163167

164168
self.language_id = language_id
165169
self.open_file_buffers: Dict[str, LSPFileBuffer] = {}

src/multilspy/lsp_protocol_handler/server.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,18 @@ class LanguageServerHandler:
172172
the asynchronous tasks created by the handler.
173173
task_counter: An integer that represents the next available task id for the handler.
174174
loop: An asyncio.AbstractEventLoop object that represents the event loop used by the handler.
175+
start_independent_lsp_process: An optional boolean flag that indicates whether to start the
176+
language server process in an independent process group. Default is `True`. Setting it to
177+
`False` means that the language server process will be in the same process group as the
178+
the current process, and any SIGINT and SIGTERM signals will be sent to both processes.
175179
"""
176180

177-
def __init__(self, process_launch_info: ProcessLaunchInfo, logger=None) -> None:
181+
def __init__(
182+
self,
183+
process_launch_info: ProcessLaunchInfo,
184+
logger=None,
185+
start_independent_lsp_process=True,
186+
) -> None:
178187
"""
179188
Params:
180189
cmd: A string that represents the command to launch the language server process.
@@ -196,6 +205,7 @@ def __init__(self, process_launch_info: ProcessLaunchInfo, logger=None) -> None:
196205
self.tasks = {}
197206
self.task_counter = 0
198207
self.loop = None
208+
self.start_independent_lsp_process = start_independent_lsp_process
199209

200210
async def start(self) -> None:
201211
"""
@@ -211,6 +221,7 @@ async def start(self) -> None:
211221
stderr=asyncio.subprocess.PIPE,
212222
env=child_proc_env,
213223
cwd=self.process_launch_info.cwd,
224+
start_new_session=self.start_independent_lsp_process,
214225
)
215226

216227
self.loop = asyncio.get_event_loop()

src/multilspy/multilspy_config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class MultilspyConfig:
3030
"""
3131
code_language: Language
3232
trace_lsp_communication: bool = False
33+
start_independent_lsp_process: bool = True
3334

3435
@classmethod
3536
def from_dict(cls, env: dict):
@@ -40,4 +41,4 @@ def from_dict(cls, env: dict):
4041
return cls(**{
4142
k: v for k, v in env.items()
4243
if k in inspect.signature(cls).parameters
43-
})
44+
})

0 commit comments

Comments
 (0)