changeset 11543:57c452316da1 v8.0.0654

patch 8.0.0654: no warning for text after :endfunction commit https://github.com/vim/vim/commit/663bb2331626944cea156374858131fcd323b9e9 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jun 22 19:12:10 2017 +0200 patch 8.0.0654: no warning for text after :endfunction Problem: Text found after :endfunction is silently ignored. Solution: Give a warning if 'verbose' is set. When | or \n are used, execute the text as a command.
author Christian Brabandt <cb@256bit.org>
date Thu, 22 Jun 2017 19:15:04 +0200
parents 3d17be8e9d2d
children c5f791fb7861
files runtime/doc/eval.txt src/testdir/test_vimscript.vim src/userfunc.c src/version.c
diffstat 4 files changed, 56 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.0.  Last change: 2017 Jun 13
+*eval.txt*	For Vim version 8.0.  Last change: 2017 Jun 22
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -8764,18 +8764,32 @@ See |:verbose-cmd| for more information.
 			implies that the effect of |:nohlsearch| is undone
 			when the function returns.
 
-					*:endf* *:endfunction* *E126* *E193*
-:endf[unction]		The end of a function definition.  Must be on a line
-			by its own, without other commands.
+				*:endf* *:endfunction* *E126* *E193* *E946*
+:endf[unction] [argument]
+			The end of a function definition.  Best is to put it
+			on a line by its own, without [argument].
+
+			[argument] can be:
+				| command	command to execute next
+				\n command	command to execute next
+				" comment	always ignored
+				anything else	ignored, unless 'verbose' is
+						non-zero
+			The support for a following command was added in Vim
+			8.0.0654, before that any argument was silently
+			ignored.
 
 				*:delf* *:delfunction* *E130* *E131* *E933*
-:delf[unction] {name}	Delete function {name}.
+:delf[unction][!] {name}
+			Delete function {name}.
 			{name} can also be a |Dictionary| entry that is a
 			|Funcref|: >
 				:delfunc dict.init
 <			This will remove the "init" entry from "dict".  The
 			function is deleted if there are no more references to
 			it.
+			With the ! there is no error if the function does not
+			exist.
 							*:retu* *:return* *E133*
 :retu[rn] [expr]	Return from a function.  When "[expr]" is given, it is
 			evaluated and returned as the result of the function.
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -1363,6 +1363,33 @@ func Test_bitwise_functions()
     call assert_fails("call invert({})", 'E728:')
 endfunc
 
+" Test trailing text after :endfunction				    {{{1
+func Test_endfunction_trailing()
+    call assert_false(exists('*Xtest'))
+
+    exe "func Xtest()\necho 'hello'\nendfunc\nlet done = 'yes'"
+    call assert_true(exists('*Xtest'))
+    call assert_equal('yes', done)
+    delfunc Xtest
+    unlet done
+
+    exe "func Xtest()\necho 'hello'\nendfunc|let done = 'yes'"
+    call assert_true(exists('*Xtest'))
+    call assert_equal('yes', done)
+    delfunc Xtest
+    unlet done
+
+    set verbose=1
+    exe "func Xtest()\necho 'hello'\nendfunc \" garbage"
+    call assert_true(exists('*Xtest'))
+    delfunc Xtest
+
+    call assert_fails("func Xtest()\necho 'hello'\nendfunc garbage", 'E946')
+    call assert_true(exists('*Xtest'))
+    delfunc Xtest
+    set verbose=0
+endfunc
+
 "-------------------------------------------------------------------------------
 " Modelines								    {{{1
 " vim: ts=8 sw=4 tw=80 fdm=marker
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -2130,6 +2130,14 @@ ex_function(exarg_T *eap)
 	    /* Check for "endfunction". */
 	    if (checkforcmd(&p, "endfunction", 4) && nesting-- == 0)
 	    {
+		if (*p == '|')
+		    /* Another command follows. */
+		    eap->nextcmd = vim_strsave(p + 1);
+		else if (line_arg != NULL && *skipwhite(line_arg) != NUL)
+		    /* Another command follows. */
+		    eap->nextcmd = line_arg;
+		else if (*p != NUL && *p != '"' && p_verbose > 0)
+		    EMSG2((char_u *)_("E946: Text found after :endfunction: %s"), p);
 		if (line_arg == NULL)
 		    vim_free(theline);
 		break;
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    654,
+/**/
     653,
 /**/
     652,