diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-07-22 19:30:06 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-07-22 19:30:06 +0200 |
commit | 2f1980f7b74a6a47d72f9c56417bc4ad47c6b66c (patch) | |
tree | d80f47ee5b487aa356f079467b9ca35e0ed93fce | |
parent | 054f14bbe58fece17f1a74ca63f0b37518f0b4de (diff) | |
download | vim-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.vim | 10 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 39 |
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)); } } |