changeset 21439:166c15374bda v8.2.1270

patch 8.2.1270: Vim9: not skipping over function type declaration Commit: https://github.com/vim/vim/commit/2f1980f7b74a6a47d72f9c56417bc4ad47c6b66c Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jul 22 19:30:06 2020 +0200 patch 8.2.1270: Vim9: not skipping over function type declaration Problem: Vim9: not skipping over function type declaration with only a return type. Solution: Skip over the return type. (issue #6507)
author Bram Moolenaar <Bram@vim.org>
date Wed, 22 Jul 2020 19:45:04 +0200
parents c114f045e405
children bd0a3a73f3da
files src/testdir/test_vim9_func.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 38 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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')
--- 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,
--- 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)
-    {
-	// handle func(args): type
-	++p;
-	while (*p != ')' && *p != NUL)
+    else if ((*p == '(' || (*p == ':' && VIM_ISWHITE(p[1])))
+					     && STRNCMP("func", start, 4) == 0)
+    {
+	if (*p == '(')
 	{
-	    char_u *sp = p;
-
-	    p = skip_type(p);
-	    if (p == sp)
-		return p;  // syntax error
-	    if (*p == ',')
-		p = skipwhite(p + 1);
+	    // 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);
+	    }
+	    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));
 	}
     }