changeset 17732:1726c2db81bf v8.1.1863

patch 8.1.1863: confusing error when using a builtin function as method commit https://github.com/vim/vim/commit/9174639a82799011cfa0013cbc4c4709b3833bf0 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 16 22:22:31 2019 +0200 patch 8.1.1863: confusing error when using a builtin function as method Problem: Confusing error when using a builtin function as method while it does not support that. Solution: Add a specific error message.
author Bram Moolenaar <Bram@vim.org>
date Fri, 16 Aug 2019 22:30:04 +0200
parents 314da6ab06bd
children 5fbbdaaa7f7c
files src/evalfunc.c src/testdir/test_method.vim src/userfunc.c src/version.c src/vim.h
diffstat 5 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1113,8 +1113,10 @@ call_internal_method(
     typval_T	argv[MAX_FUNC_ARGS + 1];
 
     fi = find_internal_func(name);
-    if (fi < 0 || global_functions[fi].f_argtype == 0)
+    if (fi < 0)
 	return ERROR_UNKNOWN;
+    if (global_functions[fi].f_argtype == 0)
+	return ERROR_NOTMETHOD;
     if (argcount + 1 < global_functions[fi].f_min_argc)
 	return ERROR_TOOFEW;
     if (argcount + 1 > global_functions[fi].f_max_argc)
--- a/src/testdir/test_method.vim
+++ b/src/testdir/test_method.vim
@@ -134,3 +134,7 @@ func Test_method_lambda()
   " todo: lambda accepts more arguments than it consumes
   " call assert_fails('eval "text"->{x -> x .. " extended"}("more")', 'E99:')
 endfunc
+
+func Test_method_not_supported()
+  call assert_fails('eval 123->changenr()', 'E276:')
+endfunc
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1678,6 +1678,11 @@ call_func(
 	    case ERROR_UNKNOWN:
 		    emsg_funcname(N_("E117: Unknown function: %s"), name);
 		    break;
+	    case ERROR_NOTMETHOD:
+		    emsg_funcname(
+			       N_("E276: Cannot use function as a method: %s"),
+									 name);
+		    break;
 	    case ERROR_DELETED:
 		    emsg_funcname(N_("E933: Function was deleted: %s"), name);
 		    break;
@@ -1685,15 +1690,18 @@ call_func(
 		    emsg_funcname((char *)e_toomanyarg, name);
 		    break;
 	    case ERROR_TOOFEW:
-		    emsg_funcname(N_("E119: Not enough arguments for function: %s"),
+		    emsg_funcname(
+			     N_("E119: Not enough arguments for function: %s"),
 									name);
 		    break;
 	    case ERROR_SCRIPT:
-		    emsg_funcname(N_("E120: Using <SID> not in a script context: %s"),
+		    emsg_funcname(
+			   N_("E120: Using <SID> not in a script context: %s"),
 									name);
 		    break;
 	    case ERROR_DICT:
-		    emsg_funcname(N_("E725: Calling dict function without Dictionary: %s"),
+		    emsg_funcname(
+		      N_("E725: Calling dict function without Dictionary: %s"),
 									name);
 		    break;
 	}
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1863,
+/**/
     1862,
 /**/
     1861,
--- a/src/vim.h
+++ b/src/vim.h
@@ -2518,6 +2518,7 @@ typedef enum {
 #define ERROR_NONE	5
 #define ERROR_OTHER	6
 #define ERROR_DELETED	7
+#define ERROR_NOTMETHOD	8   // function cannot be used as a method
 
 /* flags for find_name_end() */
 #define FNE_INCL_BR	1	/* include [] in name */