summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-22 23:02:51 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-22 23:02:51 +0200
commitdf069eec3b90401e880e9b0e258146d8f36c474d (patch)
tree9c61c092a5982318a5f7ee92f51b553621b019f5
parent7eaafe65eef88493c789b160914c8e2e8e42d4a7 (diff)
downloadvim-git-df069eec3b90401e880e9b0e258146d8f36c474d.tar.gz
patch 8.2.1042: Vim9: cannot put an operator on the next linev8.2.1042
Problem: Vim9: cannot put an operator on the next line. Solution: Require a colon before a range to see if that causes problems.
-rw-r--r--runtime/doc/vim9.txt34
-rw-r--r--src/ex_docmd.c9
-rw-r--r--src/globals.h1
-rw-r--r--src/testdir/test_vim9_expr.vim12
-rw-r--r--src/testdir/test_vim9_script.vim14
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c12
7 files changed, 59 insertions, 25 deletions
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index 9a40959e5..21bc542a1 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -1,4 +1,4 @@
-*vim9.txt* For Vim version 8.2. Last change: 2020 Jun 21
+*vim9.txt* For Vim version 8.2. Last change: 2020 Jun 22
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -257,27 +257,32 @@ Function call: >
arg2
)
-For binary operators iin expressions not in [], {} or () a line break is
-possible AFTER the operators. For example: >
- let text = lead ..
- middle ..
- end
+For binary operators in expressions not in [], {} or () a line break is
+possible just before or after the operator. For example: >
+ let text = lead
+ .. middle
+ .. end
let total = start +
end -
correction
- let result = positive ?
- PosFunc(arg) :
- NegFunc(arg)
+ let result = positive
+ ? PosFunc(arg)
+ : NegFunc(arg)
-A special case is "->" for function call chains, it can appear in the next
-line: >
let result = GetBuilder()
->BuilderSetWidth(333)
->BuilderSetHeight(777)
->BuilderBuild()
-Note that "enddef" cannot be used at the start of a continuation line, it ends
-the current function.
+< *E1050*
+To make it possible for the operator at the start of the line to be
+recognized, it is required to put a colon before a range. This will adde
+"start" and print: >
+ let result = start
+ + print
+This will assign "start" and print a line: >
+ let result = start
+ :+ print
It is also possible to split a function header over multiple lines, in between
arguments: >
@@ -286,6 +291,9 @@ arguments: >
separator = '-'
): string
+Note that "enddef" cannot be used at the start of a continuation line, it ends
+the current function.
+
No curly braces expansion ~
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 93f33ae42..4755a01b4 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1729,7 +1729,14 @@ do_one_cmd(
#ifdef FEAT_EVAL
if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 && !starts_with_colon)
+ {
+ if (ea.cmd > cmd)
+ {
+ emsg(_(e_colon_required));
+ goto doend;
+ }
p = find_ex_command(&ea, NULL, lookup_scriptvar, NULL);
+ }
else
#endif
p = find_ex_command(&ea, NULL, NULL, NULL);
@@ -3446,7 +3453,7 @@ excmd_get_argt(cmdidx_T idx)
* Backslashed delimiters after / or ? will be skipped, and commands will
* not be expanded between /'s and ?'s or after "'".
*
- * Also skip white space and ":" characters.
+ * Also skip white space and ":" characters after the range.
* Returns the "cmd" pointer advanced to beyond the range.
*/
char_u *
diff --git a/src/globals.h b/src/globals.h
index a8ff50cc4..cd1549117 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1790,6 +1790,7 @@ EXTERN char e_const_req_value[] INIT(= N_("E1021: const requires a value"));
EXTERN char e_type_req[] INIT(= N_("E1022: type or initialization required"));
EXTERN char e_declare_var[] INIT(= N_("E1016: Cannot declare a %s variable: %s"));
EXTERN char e_declare_env_var[] INIT(= N_("E1016: Cannot declare an environment variable: %s"));
+EXTERN char e_colon_required[] INIT(= N_("E1050: Colon required before a range"));
#endif
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s"));
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index b46e04bc8..46816fdc7 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -585,12 +585,12 @@ func Test_expr5_fails()
call CheckDefFailure(["let x = '1' ..'2'"], msg)
call CheckDefFailure(["let x = '1'.. '2'"], msg)
- call CheckDefFailure(["let x = 0z1122 + 33"], 'E1035')
- call CheckDefFailure(["let x = 0z1122 + [3]"], 'E1035')
- call CheckDefFailure(["let x = 0z1122 + 'asd'"], 'E1035')
- call CheckDefFailure(["let x = 33 + 0z1122"], 'E1035')
- call CheckDefFailure(["let x = [3] + 0z1122"], 'E1035')
- call CheckDefFailure(["let x = 'asdf' + 0z1122"], 'E1035')
+ call CheckDefFailure(["let x = 0z1122 + 33"], 'E1051')
+ call CheckDefFailure(["let x = 0z1122 + [3]"], 'E1051')
+ call CheckDefFailure(["let x = 0z1122 + 'asd'"], 'E1051')
+ call CheckDefFailure(["let x = 33 + 0z1122"], 'E1051')
+ call CheckDefFailure(["let x = [3] + 0z1122"], 'E1051')
+ call CheckDefFailure(["let x = 'asdf' + 0z1122"], 'E1051')
call CheckDefFailure(["let x = 6 + xxx"], 'E1001')
endfunc
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index a733bf168..ff1b13422 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -468,6 +468,14 @@ func Test_const()
call CheckDefFailure(['const &option'], 'E996:')
endfunc
+def Test_range_no_colon()
+ call CheckDefFailure(['%s/a/b/'], 'E1050:')
+ call CheckDefFailure(['+ s/a/b/'], 'E1050:')
+ call CheckDefFailure(['- s/a/b/'], 'E1050:')
+ call CheckDefFailure(['. s/a/b/'], 'E1050:')
+enddef
+
+
def Test_block()
let outer = 1
{
@@ -1279,7 +1287,7 @@ def Test_echomsg_cmd()
echomsg 'some' 'more' # comment
assert_match('^some more$', Screenline(&lines))
echo 'clear'
- 1messages
+ :1messages
assert_match('^some more$', Screenline(&lines))
call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
@@ -1898,7 +1906,7 @@ def Test_vim9_comment_not_compiled()
'vim9script',
'new'
'call setline(1, ["# define pat", "last"])',
- '$',
+ ':$',
'dsearch /pat/ #comment',
'bwipe!',
])
@@ -1907,7 +1915,7 @@ def Test_vim9_comment_not_compiled()
'vim9script',
'new'
'call setline(1, ["# define pat", "last"])',
- '$',
+ ':$',
'dsearch /pat/#comment',
'bwipe!',
], 'E488:')
diff --git a/src/version.c b/src/version.c
index 4b4fb4047..f4afb9a67 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 */
/**/
+ 1042,
+/**/
1041,
/**/
1040,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 30e447f75..39ef5f6cd 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -643,7 +643,7 @@ check_number_or_float(vartype_T type1, vartype_T type2, char_u *op)
|| type2 == VAR_ANY)))
{
if (*op == '+')
- emsg(_("E1035: wrong argument type for +"));
+ emsg(_("E1051: wrong argument type for +"));
else
semsg(_("E1036: %c requires number or float arguments"), *op);
return FAIL;
@@ -6695,6 +6695,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
{
exarg_T ea;
int starts_with_colon = FALSE;
+ char_u *cmd;
// Bail out on the first error to avoid a flood of errors and report
// the right line number when inside try/catch.
@@ -6853,7 +6854,13 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
/*
* COMMAND after range
*/
+ cmd = ea.cmd;
ea.cmd = skip_range(ea.cmd, NULL);
+ if (ea.cmd > cmd && !starts_with_colon)
+ {
+ emsg(_(e_colon_required));
+ goto erret;
+ }
p = find_ex_command(&ea, NULL, starts_with_colon ? NULL
: (void *(*)(char_u *, size_t, cctx_T *))lookup_local,
&cctx);
@@ -7008,8 +7015,9 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
line = compile_mult_expr(p, ea.cmdidx, &cctx);
break;
+ // TODO: other commands with an expression argument
+
default:
- // TODO: other commands with an expression argument
// Not recognized, execute with do_cmdline_cmd().
ea.arg = p;
line = compile_exec(line, &ea, &cctx);