]> granicus.if.org Git - vim/commitdiff
patch 8.2.0583: Vim9: # comment not recognized in :def function v8.2.0583
authorBram Moolenaar <Bram@vim.org>
Thu, 16 Apr 2020 11:00:29 +0000 (13:00 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 16 Apr 2020 11:00:29 +0000 (13:00 +0200)
Problem:    Vim9: # comment not recognized in :def function.
Solution:   Recognize and skip # comment.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 9c6e5c047bc05261a59134b826f4312e6ed947a2..5b5d8d913ded57d126fe77219d51cd0a5755a4d8 100644 (file)
@@ -63,9 +63,9 @@ def Test_assignment()
   let Funky2: func = function('len')
   let Party2: func = funcref('Test_syntax')
 
-  " type becomes list<any>
+  # type becomes list<any>
   let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
-  " type becomes dict<any>
+  # type becomes dict<any>
   let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
 
   g:newvar = 'new'
@@ -104,7 +104,7 @@ def Test_assignment()
   call CheckDefFailure(['&notex += 3'], 'E113:')
   call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
   call CheckDefFailure(['&path += 3'], 'E1013:')
-  " test freeing ISN_STOREOPT
+  # test freeing ISN_STOREOPT
   call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
   &ts = 8
 
@@ -131,7 +131,7 @@ enddef
 
 def Test_assignment_default()
 
-  " Test default values.
+  # Test default values.
   let thebool: bool
   assert_equal(v:false, thebool)
 
index f7dfb3856d2d4fcf1a874aec1ab4520786a23657..c0c2e9855f6d89b54a30e7cf431216aaa016715e 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    583,
 /**/
     582,
 /**/
index 1ccf1a725279b20855d968e5c097c6df30b98101..4137c56c3afb7ea8f1b67a7133fc12ed7df9a509 100644 (file)
@@ -5772,7 +5772,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
      */
     for (;;)
     {
-       int     is_ex_command;
+       int     is_ex_command = FALSE;
 
        // Bail out on the first error to avoid a flood of errors and report
        // the right line number when inside try/catch.
@@ -5791,6 +5791,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
        {
            line = next_line_from_context(&cctx);
            if (cctx.ctx_lnum >= ufunc->uf_lines.ga_len)
+               // beyond the last line
                break;
        }
        emsg_before = called_emsg;
@@ -5800,35 +5801,53 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
        ea.cmdlinep = &line;
        ea.cmd = skipwhite(line);
 
-       // "}" ends a block scope
-       if (*ea.cmd == '}')
+       // Some things can be recognized by the first character.
+       switch (*ea.cmd)
        {
-           scopetype_T stype = cctx.ctx_scope == NULL
-                                        ? NO_SCOPE : cctx.ctx_scope->se_type;
+           case '#':
+               // "#" starts a comment, but not "#{".
+               if (ea.cmd[1] != '{')
+               {
+                   line = (char_u *)"";
+                   continue;
+               }
+               break;
 
-           if (stype == BLOCK_SCOPE)
-           {
-               compile_endblock(&cctx);
-               line = ea.cmd;
-           }
-           else
-           {
-               emsg(_("E1025: using } outside of a block scope"));
-               goto erret;
-           }
-           if (line != NULL)
-               line = skipwhite(ea.cmd + 1);
-           continue;
-       }
+           case '}':
+               {
+                   // "}" ends a block scope
+                   scopetype_T stype = cctx.ctx_scope == NULL
+                                         ? NO_SCOPE : cctx.ctx_scope->se_type;
 
-       // "{" starts a block scope
-       // "{'a': 1}->func() is something else
-       if (*ea.cmd == '{' && ends_excmd(*skipwhite(ea.cmd + 1)))
-       {
-           line = compile_block(ea.cmd, &cctx);
-           continue;
+                   if (stype == BLOCK_SCOPE)
+                   {
+                       compile_endblock(&cctx);
+                       line = ea.cmd;
+                   }
+                   else
+                   {
+                       emsg(_("E1025: using } outside of a block scope"));
+                       goto erret;
+                   }
+                   if (line != NULL)
+                       line = skipwhite(ea.cmd + 1);
+                   continue;
+               }
+
+           case '{':
+               // "{" starts a block scope
+               // "{'a': 1}->func() is something else
+               if (ends_excmd(*skipwhite(ea.cmd + 1)))
+               {
+                   line = compile_block(ea.cmd, &cctx);
+                   continue;
+               }
+               break;
+
+           case ':':
+               is_ex_command = TRUE;
+               break;
        }
-       is_ex_command = *ea.cmd == ':';
 
        /*
         * COMMAND MODIFIERS