From 05f60dea234df753c05179b26bab55f927f3f71c Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Tue, 26 Nov 2024 23:14:44 +0800 Subject: [PATCH] fix show the children in lua table array part --- modules/dap/session.py | 47 +++++++++++++++++++++++++++++++---------- modules/dap/variable.py | 11 ++++++++-- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/modules/dap/session.py b/modules/dap/session.py index e7f0389..171599e 100644 --- a/modules/dap/session.py +++ b/modules/dap/session.py @@ -677,21 +677,46 @@ async def get_source(self, source: dap.Source) -> tuple[str, str|None]: }) return body['content'], body.get('mimeType') - async def get_variables(self, variablesReference: int, without_names: bool = False) -> list[Variable]: - response = await self.request('variables', { - 'variablesReference': variablesReference - }) + async def get_variables(self, variablesReference: int, without_names: bool = False, indexedVariables: int|None = None, namedVariables: int|None = None) -> list[Variable]: + named_list = [] + if namedVariables != None and namedVariables > 0: + response = await self.request('variables', { + 'variablesReference': variablesReference, + 'filter': 'named', + }) + + variables: list[dap.Variable] = response['variables'] + + # vscode seems to remove the names from variables in output events + if without_names: + for v in variables: + v.name = '' + v.value = v.value.split('\n')[0] + + named_list = [Variable.from_variable(self, variablesReference, v) for v in variables] + + indexed_list = [] + if indexedVariables != None and indexedVariables > 0: + response = await self.request('variables', { + 'variablesReference': variablesReference, + 'filter': 'indexed', + 'start': 0, + 'count': indexedVariables, + }) + + variables: list[dap.Variable] = response['variables'] + + # vscode seems to remove the names from variables in output events + if without_names: + for v in variables: + v.name = '' + v.value = v.value.split('\n')[0] - variables: list[dap.Variable] = response['variables'] + indexed_list = [Variable.from_variable(self, variablesReference, v) for v in variables] - # vscode seems to remove the names from variables in output events - if without_names: - for v in variables: - v.name = '' - v.value = v.value.split('\n')[0] + return named_list + indexed_list - return [Variable.from_variable(self, variablesReference, v) for v in variables] def on_breakpoint_event(self, event: dap.BreakpointEvent): assert event.breakpoint.id diff --git a/modules/dap/variable.py b/modules/dap/variable.py index 5f9d16e..ca97e74 100644 --- a/modules/dap/variable.py +++ b/modules/dap/variable.py @@ -35,7 +35,8 @@ def name(self) -> str: class Variable: - def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None) -> None: + def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None, + indexedVariables: int|None = None, namedVariables: int|None = None) -> None: self.session = session self.name = name self.evaluateName = evaluateName @@ -44,6 +45,8 @@ def __init__(self, session: Session, name: str, value: str|None, variablesRefere self.containerVariablesReference = containerVariablesReference self.memoryReference = memoryReference self.fetched: core.Future[list[Variable]]|None = None + self.indexedVariables = indexedVariables + self.namedVariables = namedVariables @staticmethod @@ -56,6 +59,8 @@ def from_variable(session: Session, containerVariablesReference: int, variable: containerVariablesReference, variable.evaluateName, variable.memoryReference, + indexedVariables = variable.indexedVariables, + namedVariables = variable.namedVariables, ) @staticmethod @@ -74,11 +79,13 @@ def from_evaluate(session: Session, name: str, evaluate: dap.EvaluateResponse): name, evaluate.result, evaluate.variablesReference, + indexedVariables = evaluate.indexedVariables, + namedVariables = evaluate.namedVariables, ) async def fetch(self): assert self.variablesReference - return await self.session.get_variables(self.variablesReference) + return await self.session.get_variables(self.variablesReference, indexedVariables = self.indexedVariables, namedVariables = self.namedVariables) async def children(self) -> list[Variable]: if not self.has_children: