Add support for debugging server "ready_pattern"

This commit is contained in:
Ivan Kravets
2020-03-19 19:17:54 +02:00
parent 15647c81f0
commit d9647dec95
2 changed files with 23 additions and 19 deletions

View File

@ -125,7 +125,8 @@ def validate_debug_options(cmd_ctx, env_options):
server_options["executable"] = server_options["arguments"][0]
server_options["arguments"] = server_options["arguments"][1:]
elif "server" in tool_settings:
server_package = tool_settings["server"].get("package")
server_options = tool_settings["server"]
server_package = server_options.get("package")
server_package_dir = (
platform.get_package_dir(server_package) if server_package else None
)
@ -134,15 +135,17 @@ def validate_debug_options(cmd_ctx, env_options):
with_packages=[server_package], skip_default_package=True, silent=True
)
server_package_dir = platform.get_package_dir(server_package)
server_options = dict(
cwd=server_package_dir if server_package else None,
executable=tool_settings["server"].get("executable"),
arguments=[
a.replace("$PACKAGE_DIR", server_package_dir)
if server_package_dir
else a
for a in tool_settings["server"].get("arguments", [])
],
server_options.update(
dict(
cwd=server_package_dir if server_package else None,
executable=server_options.get("executable"),
arguments=[
a.replace("$PACKAGE_DIR", server_package_dir)
if server_package_dir
else a
for a in server_options.get("arguments", [])
],
)
)
extra_cmds = _cleanup_cmds(env_options.get("debug_extra_cmds"))

View File

@ -35,6 +35,7 @@ class DebugServer(BaseProcess):
self._debug_port = ":3333"
self._transport = None
self._process_ended = False
self._ready = False
@defer.inlineCallbacks
def spawn(self, patterns): # pylint: disable=too-many-branches
@ -126,15 +127,7 @@ class DebugServer(BaseProcess):
timeout = 10
elapsed = 0
delay = 1
ready_delay = 0.5
while (
not self._process_ended
and elapsed < timeout
and (
not self._last_activity
or not (self._last_activity < (time.time() - ready_delay))
)
):
while not self._ready and not self._process_ended and elapsed < timeout:
yield self.async_sleep(delay)
elapsed += delay
@ -151,6 +144,14 @@ class DebugServer(BaseProcess):
super(DebugServer, self).outReceived(
escape_gdbmi_stream("@", data) if is_gdbmi_mode() else data
)
if self._ready:
return
ready_pattern = self.debug_options.get("server", {}).get("ready_pattern")
if ready_pattern:
self._ready = ready_pattern.encode() in data
else:
ready_delay = 0.5
self._ready = self._last_activity < (time.time() - ready_delay)
def processEnded(self, reason):
self._process_ended = True