Skip to content

Commit

Permalink
patch 9.0.2157: Vim9: incorrectly parses :def func definitions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
chrisbra committed Dec 11, 2023
1 parent 9ed5375 commit e4a450a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
7 changes: 7 additions & 0 deletions src/testdir/test_vim9_func.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 8 additions & 1 deletion src/userfunc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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] == '.')
Expand Down Expand Up @@ -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--;
Expand All @@ -453,7 +456,11 @@ get_function_args(
}
}
else
{
mustend = TRUE;
if (*skipwhite(p) == NUL)
need_expr = TRUE;
}
}
else if (any_default)
{
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2157,
/**/
2156,
/**/
Expand Down

0 comments on commit e4a450a

Please sign in to comment.