summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-22 19:30:06 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-22 19:30:06 +0200
commit2f1980f7b74a6a47d72f9c56417bc4ad47c6b66c (patch)
treed80f47ee5b487aa356f079467b9ca35e0ed93fce
parent054f14bbe58fece17f1a74ca63f0b37518f0b4de (diff)
downloadvim-git-2f1980f7b74a6a47d72f9c56417bc4ad47c6b66c.tar.gz
patch 8.2.1270: Vim9: not skipping over function type declarationv8.2.1270
Problem: Vim9: not skipping over function type declaration with only a return type. Solution: Skip over the return type. (issue #6507)
-rw-r--r--src/testdir/test_vim9_func.vim10
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c39
3 files changed, 36 insertions, 15 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 6d83ddc51..3fa5d6abe 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -260,6 +260,16 @@ def Test_call_funcref()
assert_equal(3, g:SomeFunc('abc'))
assert_fails('NotAFunc()', 'E117:')
assert_fails('g:NotAFunc()', 'E117:')
+
+ let lines =<< trim END
+ vim9script
+ def RetNumber(): number
+ return 123
+ enddef
+ let Funcref: func: number = function('RetNumber')
+ assert_equal(123, Funcref())
+ END
+ CheckScriptSuccess(lines)
enddef
let SomeFunc = function('len')
diff --git a/src/version.c b/src/version.c
index cf6432720..9ac0340a3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1270,
+/**/
1269,
/**/
1268,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 0e3e01ac7..55f08a73e 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1881,26 +1881,35 @@ skip_type(char_u *start)
if (*p == '>')
++p;
}
- else if (*p == '(' && STRNCMP("func", start, 4) == 0)
+ else if ((*p == '(' || (*p == ':' && VIM_ISWHITE(p[1])))
+ && STRNCMP("func", start, 4) == 0)
{
- // handle func(args): type
- ++p;
- while (*p != ')' && *p != NUL)
+ if (*p == '(')
{
- char_u *sp = p;
+ // handle func(args): type
+ ++p;
+ while (*p != ')' && *p != NUL)
+ {
+ char_u *sp = p;
- p = skip_type(p);
- if (p == sp)
- return p; // syntax error
- if (*p == ',')
- p = skipwhite(p + 1);
+ p = skip_type(p);
+ if (p == sp)
+ return p; // syntax error
+ if (*p == ',')
+ p = skipwhite(p + 1);
+ }
+ if (*p == ')')
+ {
+ if (p[1] == ':')
+ p = skip_type(skipwhite(p + 2));
+ else
+ p = skipwhite(p + 1);
+ }
}
- if (*p == ')')
+ else
{
- if (p[1] == ':')
- p = skip_type(skipwhite(p + 2));
- else
- p = skipwhite(p + 1);
+ // handle func: return_type
+ p = skip_type(skipwhite(p + 1));
}
}