changeset 35062:f57990be7526 v9.1.0376

patch 9.1.0376: Vim9: Trailing commands after class/enum keywords ignored Commit: https://github.com/vim/vim/commit/ac7731895c996acef4d02b784f9952749226e203 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sat Apr 27 11:36:12 2024 +0200 patch 9.1.0376: Vim9: Trailing commands after class/enum keywords ignored Problem: Vim9: Trailing commands after class/enum keywords ignored Solution: Remove EX_TRLBAR keyword from command definition (Yegappan Lakshmanan) closes: #14649 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 27 Apr 2024 12:00:03 +0200
parents 04ab7e07642d
children ae9a86e4df2a
files runtime/doc/cmdline.txt src/ex_cmds.h src/testdir/test_vim9_class.vim src/testdir/test_vim9_enum.vim src/testdir/test_vim9_typealias.vim src/version.c src/vim9class.c
diffstat 7 files changed, 90 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -1,4 +1,4 @@
-*cmdline.txt*   For Vim version 9.1.  Last change: 2023 Dec 09
+*cmdline.txt*   For Vim version 9.1.  Last change: 2024 Apr 27
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -650,6 +650,12 @@ followed by another Vim command:
     :[range]!
     a user defined command without the "-bar" argument |:command|
 
+    and the following |Vim9-script| keywords: 
+    :abstract
+    :class
+    :enum
+    :interface
+
 Note that this is confusing (inherited from Vi): With ":g" the '|' is included
 in the command, with ":s" it is not.
 
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -129,7 +129,7 @@ EXCMD(CMD_aboveleft,	"aboveleft",	ex_wro
 	EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM,
 	ADDR_NONE),
 EXCMD(CMD_abstract,	"abstract",	ex_class,
-	EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
+	EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
 	ADDR_NONE),
 EXCMD(CMD_all,		"all",		ex_all,
 	EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR,
@@ -357,7 +357,7 @@ EXCMD(CMD_clast,	"clast",	ex_cc,
 	EX_RANGE|EX_COUNT|EX_TRLBAR|EX_BANG,
 	ADDR_UNSIGNED),
 EXCMD(CMD_class,	"class",	ex_class,
-	EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
+	EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
 	ADDR_NONE),
 EXCMD(CMD_close,	"close",	ex_close,
 	EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
@@ -597,7 +597,7 @@ EXCMD(CMD_enew,		"enew",		ex_edit,
 	EX_BANG|EX_TRLBAR,
 	ADDR_NONE),
 EXCMD(CMD_enum,		"enum",		ex_class,
-	EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
+	EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
 	ADDR_NONE),
 EXCMD(CMD_eval,		"eval",		ex_eval,
 	EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
@@ -759,7 +759,7 @@ EXCMD(CMD_intro,	"intro",	ex_intro,
 	EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
 	ADDR_NONE),
 EXCMD(CMD_interface,	"interface",	ex_class,
-	EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
+	EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
 	ADDR_NONE),
 EXCMD(CMD_isearch,	"isearch",	ex_findpat,
 	EX_BANG|EX_RANGE|EX_DFLALL|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK,
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -67,6 +67,42 @@ def Test_class_basic()
   END
   v9.CheckSourceFailure(lines, "E488: Trailing characters: | echo 'done'", 3)
 
+  # Additional command after "class name"
+  lines =<< trim END
+    vim9script
+    class Something | var x = 10
+    endclass
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var x = 10", 2)
+
+  # Additional command after "object variable"
+  lines =<< trim END
+    vim9script
+    class Something
+      var l: list<number> = [] | var y = 10
+    endclass
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var y = 10", 3)
+
+  # Additional command after "class variable"
+  lines =<< trim END
+    vim9script
+    class Something
+      static var d = {a: 10} | var y = 10
+    endclass
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var y = 10", 3)
+
+  # Additional command after "object method"
+  lines =<< trim END
+    vim9script
+    class Something
+      def Foo() | var y = 10
+      enddef
+    endclass
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var y = 10", 3)
+
   # Try to define a class with the same name as an existing variable
   lines =<< trim END
     vim9script
@@ -2237,6 +2273,14 @@ def Test_interface_basics()
   END
   v9.CheckSourceFailure(lines, 'E1345: Not a valid command in an interface: return 5', 6)
 
+  # Additional commands after "interface name"
+  lines =<< trim END
+    vim9script
+    interface Something | var x = 10 | var y = 20
+    endinterface
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var x = 10", 2)
+
   lines =<< trim END
     vim9script
     export interface EnterExit
@@ -3233,6 +3277,14 @@ def Test_abstract_class()
   END
   v9.CheckSourceFailure(lines, 'E1316: Class can only be defined in Vim9 script', 1)
 
+  # Additional commands after "abstract class"
+  lines =<< trim END
+    vim9script
+    abstract class Something | var x = []
+    endclass
+  END
+  v9.CheckSourceFailure(lines, "E488: Trailing characters: | var x = []", 2)
+
   # Abstract class cannot have a "new" function
   lines =<< trim END
     vim9script
--- a/src/testdir/test_vim9_enum.vim
+++ b/src/testdir/test_vim9_enum.vim
@@ -97,7 +97,16 @@ def Test_enum_parse()
     vim9script
     enum Something | endenum
   END
-  v9.CheckSourceFailure(lines, 'E1420: Missing :endenum', 3)
+  v9.CheckSourceFailure(lines, 'E488: Trailing characters: | endenum', 2)
+
+  # another command follows the enum name
+  lines =<< trim END
+    vim9script
+    enum Something | var x = 10
+      Foo
+    endenum
+  END
+  v9.CheckSourceFailure(lines, 'E488: Trailing characters: | var x = 10', 2)
 
   # Try to define an enum with the same name as an existing variable
   lines =<< trim END
--- a/src/testdir/test_vim9_typealias.vim
+++ b/src/testdir/test_vim9_typealias.vim
@@ -172,6 +172,14 @@ def Test_typealias()
   END
   v9.CheckSourceSuccess(lines)
 
+  # another command follows a type alias
+  lines =<< trim END
+    vim9script
+    type MyType = number | var x = 20
+    assert_equal(20, x)
+  END
+  v9.CheckSourceSuccess(lines)
+
   # Sourcing a script twice (which will free script local variables)
   # Uses "lines" from the previous test
   new
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    376,
+/**/
     375,
 /**/
     374,
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -136,6 +136,13 @@ parse_member(
 	fill_evalarg_from_eap(&evalarg, eap, FALSE);
 	(void)skip_expr_concatenate(&init_arg, &expr_start, &expr_end, &evalarg);
 
+	init_arg = skipwhite(init_arg);
+	if (*init_arg != NUL)
+	{
+	    semsg(_(e_trailing_characters_str), init_arg);
+	    return FAIL;
+	}
+
 	// No type specified for the member.  Set it to "any" and the correct
 	// type will be set when the object is instantiated.
 	if (type == NULL)