mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.3013: Vim: when debugging only first line of command is displayed
Problem: Vim: when debugging only the first line of a command using line continuation is displayed. Solution: Find the next command and concatenate lines until that one. (closes #8392)
This commit is contained in:
@@ -885,19 +885,19 @@ func Test_Backtrace_DefFunction()
|
|||||||
\ ':debug call GlobalFunction()',
|
\ ':debug call GlobalFunction()',
|
||||||
\ ['cmd: call GlobalFunction()'])
|
\ ['cmd: call GlobalFunction()'])
|
||||||
|
|
||||||
call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
|
call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
|
call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
|
||||||
call RunDbgCmd(buf, 'echo some', ['some var'])
|
call RunDbgCmd(buf, 'echo some', ['some var'])
|
||||||
|
|
||||||
call RunDbgCmd(buf, 'backtrace', [
|
call RunDbgCmd(buf, 'backtrace', [
|
||||||
\ '\V>backtrace',
|
\ '\V>backtrace',
|
||||||
\ '\V->0 function GlobalFunction',
|
\ '\V->0 function GlobalFunction',
|
||||||
\ '\Vline 2: CallAFunction()',
|
\ '\Vline 2: CallAFunction()',
|
||||||
\ ],
|
\ ],
|
||||||
\ #{match: 'pattern'})
|
\ #{match: 'pattern'})
|
||||||
|
|
||||||
call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
|
call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
||||||
" Repeated line, because we fist are in the compiled function before the
|
" Repeated line, because we fist are in the compiled function before the
|
||||||
" EXEC and then in do_cmdline() before the :source command.
|
" EXEC and then in do_cmdline() before the :source command.
|
||||||
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
|
||||||
@@ -952,6 +952,13 @@ func Test_debug_def_function()
|
|||||||
endfor
|
endfor
|
||||||
echo "done"
|
echo "done"
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def g:FuncWithDict()
|
||||||
|
var d = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
}
|
||||||
|
enddef
|
||||||
END
|
END
|
||||||
call writefile(file, 'Xtest.vim')
|
call writefile(file, 'Xtest.vim')
|
||||||
|
|
||||||
@@ -967,23 +974,29 @@ func Test_debug_def_function()
|
|||||||
call RunDbgCmd(buf,
|
call RunDbgCmd(buf,
|
||||||
\ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)',
|
\ ':debug call FuncWithArgs("asdf", 42, 1, 2, 3)',
|
||||||
\ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)'])
|
\ ['cmd: call FuncWithArgs("asdf", 42, 1, 2, 3)'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
|
call RunDbgCmd(buf, 'step', ['line 1: echo text .. nr'])
|
||||||
call RunDbgCmd(buf, 'echo text', ['asdf'])
|
call RunDbgCmd(buf, 'echo text', ['asdf'])
|
||||||
call RunDbgCmd(buf, 'echo nr', ['42'])
|
call RunDbgCmd(buf, 'echo nr', ['42'])
|
||||||
call RunDbgCmd(buf, 'echo items', ['[1, 2, 3]'])
|
call RunDbgCmd(buf, 'echo items', ['[1, 2, 3]'])
|
||||||
call RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2: for it in items'])
|
call RunDbgCmd(buf, 'step', ['asdf42', 'function FuncWithArgs', 'line 2: for it in items'])
|
||||||
call RunDbgCmd(buf, 'echo it', ['1'])
|
call RunDbgCmd(buf, 'echo it', ['1'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
||||||
call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor'])
|
call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
|
call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
|
||||||
call RunDbgCmd(buf, 'echo it', ['2'])
|
call RunDbgCmd(buf, 'echo it', ['2'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
||||||
call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor'])
|
call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
|
call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
|
||||||
call RunDbgCmd(buf, 'echo it', ['3'])
|
call RunDbgCmd(buf, 'echo it', ['3'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
call RunDbgCmd(buf, 'step', ['line 3: echo it'])
|
||||||
call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor'])
|
call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor'])
|
||||||
call RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
|
call RunDbgCmd(buf, 'step', ['line 5: echo "done"'])
|
||||||
|
call RunDbgCmd(buf, 'cont')
|
||||||
|
|
||||||
|
call RunDbgCmd(buf,
|
||||||
|
\ ':debug call FuncWithDict()',
|
||||||
|
\ ['cmd: call FuncWithDict()'])
|
||||||
|
call RunDbgCmd(buf, 'step', ['line 1: var d = { a: 1, b: 2, }'])
|
||||||
|
|
||||||
call RunDbgCmd(buf, 'cont')
|
call RunDbgCmd(buf, 'cont')
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3013,
|
||||||
/**/
|
/**/
|
||||||
3012,
|
3012,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1433,6 +1433,52 @@ lookup_debug_var(char_u *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_debug(isn_T *iptr, ectx_T *ectx)
|
||||||
|
{
|
||||||
|
char_u *line;
|
||||||
|
ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
|
||||||
|
+ ectx->ec_dfunc_idx)->df_ufunc;
|
||||||
|
isn_T *ni;
|
||||||
|
int end_lnum = iptr->isn_lnum;
|
||||||
|
garray_T ga;
|
||||||
|
int lnum;
|
||||||
|
|
||||||
|
SOURCING_LNUM = iptr->isn_lnum;
|
||||||
|
debug_context = ectx;
|
||||||
|
debug_var_count = iptr->isn_arg.number;
|
||||||
|
|
||||||
|
for (ni = iptr + 1; ni->isn_type != ISN_FINISH; ++ni)
|
||||||
|
if (ni->isn_type == ISN_DEBUG
|
||||||
|
|| ni->isn_type == ISN_RETURN
|
||||||
|
|| ni->isn_type == ISN_RETURN_VOID)
|
||||||
|
{
|
||||||
|
end_lnum = ni->isn_lnum;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end_lnum > iptr->isn_lnum)
|
||||||
|
{
|
||||||
|
ga_init2(&ga, sizeof(char_u *), 10);
|
||||||
|
for (lnum = iptr->isn_lnum; lnum < end_lnum; ++lnum)
|
||||||
|
if (ga_grow(&ga, 1) == OK)
|
||||||
|
((char_u **)(ga.ga_data))[ga.ga_len++] =
|
||||||
|
skipwhite(((char_u **)ufunc->uf_lines.ga_data)[lnum - 1]);
|
||||||
|
line = ga_concat_strings(&ga, " ");
|
||||||
|
vim_free(ga.ga_data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line = ((char_u **)ufunc->uf_lines.ga_data)[iptr->isn_lnum - 1];
|
||||||
|
if (line == NULL)
|
||||||
|
line = (char_u *)"[empty]";
|
||||||
|
|
||||||
|
do_debug(line);
|
||||||
|
debug_context = NULL;
|
||||||
|
|
||||||
|
if (end_lnum > iptr->isn_lnum)
|
||||||
|
vim_free(line);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Execute instructions in execution context "ectx".
|
* Execute instructions in execution context "ectx".
|
||||||
* Return OK or FAIL;
|
* Return OK or FAIL;
|
||||||
@@ -4156,21 +4202,7 @@ exec_instructions(ectx_T *ectx)
|
|||||||
|
|
||||||
case ISN_DEBUG:
|
case ISN_DEBUG:
|
||||||
if (ex_nesting_level <= debug_break_level)
|
if (ex_nesting_level <= debug_break_level)
|
||||||
{
|
handle_debug(iptr, ectx);
|
||||||
char_u *line;
|
|
||||||
ufunc_T *ufunc = (((dfunc_T *)def_functions.ga_data)
|
|
||||||
+ ectx->ec_dfunc_idx)->df_ufunc;
|
|
||||||
|
|
||||||
SOURCING_LNUM = iptr->isn_lnum;
|
|
||||||
debug_context = ectx;
|
|
||||||
debug_var_count = iptr->isn_arg.number;
|
|
||||||
line = ((char_u **)ufunc->uf_lines.ga_data)[
|
|
||||||
iptr->isn_lnum - 1];
|
|
||||||
if (line == NULL)
|
|
||||||
line = (char_u *)"[empty]";
|
|
||||||
do_debug(line);
|
|
||||||
debug_context = NULL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ISN_SHUFFLE:
|
case ISN_SHUFFLE:
|
||||||
|
Reference in New Issue
Block a user