changeset 24952:ffe784fdec57 v8.2.3013

patch 8.2.3013: Vim: when debugging only first line of command is displayed Commit: https://github.com/vim/vim/commit/4cea536bdf48df459e7ad651dfee006844bbf2c0 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jun 16 22:24:40 2021 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Wed, 16 Jun 2021 22:30:03 +0200
parents 8972f6de0a40
children 9be0a9b887bf
files src/testdir/test_debugger.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 78 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_debugger.vim
+++ b/src/testdir/test_debugger.vim
@@ -885,19 +885,19 @@ func Test_Backtrace_DefFunction()
                 \ ':debug call GlobalFunction()',
                 \ ['cmd: call GlobalFunction()'])
 
-  call RunDbgCmd(buf, 'step', ['line 1:   var some = "some var"'])
-  call RunDbgCmd(buf, 'step', ['line 2:   CallAFunction()'])
+  call RunDbgCmd(buf, 'step', ['line 1: var some = "some var"'])
+  call RunDbgCmd(buf, 'step', ['line 2: CallAFunction()'])
   call RunDbgCmd(buf, 'echo some', ['some var'])
 
   call RunDbgCmd(buf, 'backtrace', [
         \ '\V>backtrace',
         \ '\V->0 function GlobalFunction',
-        \ '\Vline 2:   CallAFunction()',
+        \ '\Vline 2: CallAFunction()',
         \ ],
         \ #{match: 'pattern'})
 
-  call RunDbgCmd(buf, 'step', ['line 1:   SourceAnotherFile()'])
-  call RunDbgCmd(buf, 'step', ['line 1:   source Xtest2.vim'])
+  call RunDbgCmd(buf, 'step', ['line 1: SourceAnotherFile()'])
+  call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
   " Repeated line, because we fist are in the compiled function before the
   " EXEC and then in do_cmdline() before the :source command.
   call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim'])
@@ -952,6 +952,13 @@ func Test_debug_def_function()
       endfor
       echo "done"
     enddef
+
+    def g:FuncWithDict()
+      var d = {
+         a: 1,
+         b: 2,
+         }
+    enddef
   END
   call writefile(file, 'Xtest.vim')
 
@@ -967,23 +974,29 @@ func Test_debug_def_function()
   call RunDbgCmd(buf,
                 \ ':debug 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 nr', ['42'])
   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, 'step', ['line 3:     echo it'])
-  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 3: echo it'])
+  call RunDbgCmd(buf, 'step', ['1', 'function FuncWithArgs', 'line 4: endfor'])
+  call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
   call RunDbgCmd(buf, 'echo it', ['2'])
-  call RunDbgCmd(buf, 'step', ['line 3:     echo it'])
-  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 3: echo it'])
+  call RunDbgCmd(buf, 'step', ['2', 'function FuncWithArgs', 'line 4: endfor'])
+  call RunDbgCmd(buf, 'step', ['line 2: for it in items'])
   call RunDbgCmd(buf, 'echo it', ['3'])
-  call RunDbgCmd(buf, 'step', ['line 3:     echo it'])
-  call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4:   endfor'])
-  call RunDbgCmd(buf, 'step', ['line 5:   echo "done"'])
+  call RunDbgCmd(buf, 'step', ['line 3: echo it'])
+  call RunDbgCmd(buf, 'step', ['3', 'function FuncWithArgs', 'line 4: endfor'])
+  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 StopVimInTerminal(buf)
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3013,
+/**/
     3012,
 /**/
     3011,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1433,6 +1433,52 @@ lookup_debug_var(char_u *name)
     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".
  * Return OK or FAIL;
@@ -4156,21 +4202,7 @@ exec_instructions(ectx_T *ectx)
 
 	    case ISN_DEBUG:
 		if (ex_nesting_level <= debug_break_level)
-		{
-		    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;
-		}
+		    handle_debug(iptr, ectx);
 		break;
 
 	    case ISN_SHUFFLE: