]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2157: Vim9: incorrectly parses :def func definitions v9.0.2157
authorChristian Brabandt <cb@256bit.org>
Fri, 8 Dec 2023 19:57:38 +0000 (20:57 +0100)
committerChristian Brabandt <cb@256bit.org>
Mon, 11 Dec 2023 16:50:08 +0000 (17:50 +0100)
Problem:  Vim9: incorrectly parses :def func definitions
Solution: check for more context when parsing function args

Signed-off-by: Christian Brabandt <cb@256bit.org>
Incorrectly parses def function definitions

Vim currently allows to define the following vim9 function:
  def Func(f=
  )
  enddef

It currently thinks a Lambda is following the `=` but it doesn't check,
that there is actually an expression following. So when such a think is
encountered, remember that an expression should be following.

If no expression is coming in the next few lines, fail parsing the
function arguments, which will Vim no longer accept such a function.

Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_vim9_func.vim
src/userfunc.c
src/version.c

index 47b23e85e5a309a35404ea8ca4f9fd8e42d2eeb7..27585a90490095170c27da4064092f6d1c0e86f4 100644 (file)
@@ -861,6 +861,13 @@ def Test_func_with_comments()
   END
   v9.CheckScriptFailure(lines, 'E125:', 1)
 
+  lines =<< trim END
+      def Func(f=
+      )
+      enddef
+  END
+  v9.CheckScriptFailure(lines, 'E125:', 2)
+
   lines =<< trim END
       def Func(
         arg: string# comment
index 33e73a9a5248bff61f764a06616c8a9f13210ce6..e2b1bc3226d52444f2031d241e426cbf142d0c6e 100644 (file)
@@ -243,6 +243,7 @@ get_function_args(
     int                c;
     int                any_default = FALSE;
     char_u     *whitep = *argp;
+    int                need_expr = FALSE;
 
     if (newargs != NULL)
        ga_init2(newargs, sizeof(char_u *), 3);
@@ -282,7 +283,7 @@ get_function_args(
                semsg(_(e_invalid_argument_str), *argp);
            goto err_ret;
        }
-       if (*p == endchar)
+       if (*p == endchar && !need_expr)
            break;
 
        if (p[0] == '.' && p[1] == '.' && p[2] == '.')
@@ -435,6 +436,8 @@ get_function_args(
                        if (ga_grow(default_args, 1) == FAIL)
                            goto err_ret;
 
+                       if (need_expr)
+                           need_expr = FALSE;
                        // trim trailing whitespace
                        while (p > expr && VIM_ISWHITE(p[-1]))
                            p--;
@@ -453,7 +456,11 @@ get_function_args(
                    }
                }
                else
+               {
                    mustend = TRUE;
+                   if (*skipwhite(p) == NUL)
+                       need_expr = TRUE;
+               }
            }
            else if (any_default)
            {
index f7d6cbcb6bb4ad362490dbdfbdd16d1b9d46ab68..919f42f2d3647eb8c15e40beb07979b12174b8b6 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2157,
 /**/
     2156,
 /**/