From e2b26db29d7529781cadb4aa12eeca33901fecc5 Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Thu, 15 Mar 2018 13:37:05 -0700 Subject: [PATCH] Enable set setting values for collection items --- ptvsd/wrapper.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ptvsd/wrapper.py b/ptvsd/wrapper.py index 1d04f70b..2bdebf05 100644 --- a/ptvsd/wrapper.py +++ b/ptvsd/wrapper.py @@ -835,18 +835,38 @@ class VSCodeMessageProcessor(ipcjson.SocketIO, ipcjson.IpcChannel): def on_setVariable(self, request, args): vsc_var = int(args['variablesReference']) pyd_var = self.var_map.to_pydevd(vsc_var) + + var_name = args['name'] + var_value = args['value'] + + lhs_expr = self.__get_variable_evaluate_name(pyd_var, var_name) + if not lhs_expr: + lhs_expr = var_name + expr = '%s = %s' % (lhs_expr, var_value) + # pydevd message format doesn't permit tabs in expressions + expr = expr.replace('\t', ' ') + + pyd_tid = str(pyd_var[0]) + pyd_fid = str(pyd_var[1]) # VSC gives us variablesReference to the parent of the variable # being set, and variable name; but pydevd wants the ID # (or rather path) of the variable itself. - pyd_var += (args['name'],) + pyd_var += (var_name,) vsc_var = self.var_map.to_vscode(pyd_var, autogen=True) - cmd_args = [str(s) for s in pyd_var] + [args['value']] - _, _, resp_args = yield self.pydevd_request( - pydevd_comm.CMD_CHANGE_VARIABLE, + cmd_args = [pyd_tid, pyd_fid, 'LOCAL', expr, '1'] + yield self.pydevd_request( + pydevd_comm.CMD_EXEC_EXPRESSION, '\t'.join(cmd_args), ) + + cmd_args = [pyd_tid, pyd_fid, 'LOCAL', lhs_expr, '1'] + _, _, resp_args = yield self.pydevd_request( + pydevd_comm.CMD_EVALUATE_EXPRESSION, + '\t'.join(cmd_args), + ) + xml = untangle.parse(resp_args).xml xvar = xml.var