summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-16 13:00:29 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-16 13:00:29 +0200
commitcb711abf0f71d8c743cf73c76077f52e17732a8c (patch)
treedeba0fe02b289a9e45200aa60b9be51859dc278d
parentb4a549fb161a390834371db8370b1f75695e25d0 (diff)
downloadvim-git-8.2.0583.tar.gz
patch 8.2.0583: Vim9: # comment not recognized in :def functionv8.2.0583
Problem: Vim9: # comment not recognized in :def function. Solution: Recognize and skip # comment.
-rw-r--r--src/testdir/test_vim9_script.vim8
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c71
3 files changed, 51 insertions, 30 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 9c6e5c047..5b5d8d913 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -63,9 +63,9 @@ def Test_assignment()
let Funky2: func = function('len')
let Party2: func = funcref('Test_syntax')
- " type becomes list<any>
+ # type becomes list<any>
let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
- " type becomes dict<any>
+ # type becomes dict<any>
let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
g:newvar = 'new'
@@ -104,7 +104,7 @@ def Test_assignment()
call CheckDefFailure(['&notex += 3'], 'E113:')
call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
call CheckDefFailure(['&path += 3'], 'E1013:')
- " test freeing ISN_STOREOPT
+ # test freeing ISN_STOREOPT
call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
&ts = 8
@@ -131,7 +131,7 @@ enddef
def Test_assignment_default()
- " Test default values.
+ # Test default values.
let thebool: bool
assert_equal(v:false, thebool)
diff --git a/src/version.c b/src/version.c
index f7dfb3856..c0c2e9855 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 583,
+/**/
582,
/**/
581,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 1ccf1a725..4137c56c3 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5772,7 +5772,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
*/
for (;;)
{
- int is_ex_command;
+ int is_ex_command = FALSE;
// Bail out on the first error to avoid a flood of errors and report
// the right line number when inside try/catch.
@@ -5791,6 +5791,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
{
line = next_line_from_context(&cctx);
if (cctx.ctx_lnum >= ufunc->uf_lines.ga_len)
+ // beyond the last line
break;
}
emsg_before = called_emsg;
@@ -5800,35 +5801,53 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
ea.cmdlinep = &line;
ea.cmd = skipwhite(line);
- // "}" ends a block scope
- if (*ea.cmd == '}')
+ // Some things can be recognized by the first character.
+ switch (*ea.cmd)
{
- scopetype_T stype = cctx.ctx_scope == NULL
- ? NO_SCOPE : cctx.ctx_scope->se_type;
+ case '#':
+ // "#" starts a comment, but not "#{".
+ if (ea.cmd[1] != '{')
+ {
+ line = (char_u *)"";
+ continue;
+ }
+ break;
- if (stype == BLOCK_SCOPE)
- {
- compile_endblock(&cctx);
- line = ea.cmd;
- }
- else
- {
- emsg(_("E1025: using } outside of a block scope"));
- goto erret;
- }
- if (line != NULL)
- line = skipwhite(ea.cmd + 1);
- continue;
- }
+ case '}':
+ {
+ // "}" ends a block scope
+ scopetype_T stype = cctx.ctx_scope == NULL
+ ? NO_SCOPE : cctx.ctx_scope->se_type;
- // "{" starts a block scope
- // "{'a': 1}->func() is something else
- if (*ea.cmd == '{' && ends_excmd(*skipwhite(ea.cmd + 1)))
- {
- line = compile_block(ea.cmd, &cctx);
- continue;
+ if (stype == BLOCK_SCOPE)
+ {
+ compile_endblock(&cctx);
+ line = ea.cmd;
+ }
+ else
+ {
+ emsg(_("E1025: using } outside of a block scope"));
+ goto erret;
+ }
+ if (line != NULL)
+ line = skipwhite(ea.cmd + 1);
+ continue;
+ }
+
+ case '{':
+ // "{" starts a block scope
+ // "{'a': 1}->func() is something else
+ if (ends_excmd(*skipwhite(ea.cmd + 1)))
+ {
+ line = compile_block(ea.cmd, &cctx);
+ continue;
+ }
+ break;
+
+ case ':':
+ is_ex_command = TRUE;
+ break;
}
- is_ex_command = *ea.cmd == ':';
/*
* COMMAND MODIFIERS