diff options
-rw-r--r-- | src/testdir/test_vim9_script.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 71 |
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(['¬ex += 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 |