To: vim_dev@googlegroups.com Subject: Patch 8.2.1024 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1024 Problem: Vim9: no error for using "let g:var = val". Solution: Add an error. Files: src/evalvars.c, src/globals.h, src/structs.h, src/vim9compile.c, src/scriptfile.c, src/userfunc.c, src/testdir/test_vim9_script.vim, src/testdir/test_vim9_disassemble.vim, src/testdir/test_vim9_func.vim *** ../vim-8.2.1023/src/evalvars.c 2020-06-20 18:19:05.920877872 +0200 --- src/evalvars.c 2020-06-20 20:25:39.608163563 +0200 *************** *** 2864,2869 **** --- 2864,2877 ---- semsg(_(e_illvar), name); return; } + if (current_sctx.sc_version == SCRIPT_VERSION_VIM9 + && ht == &globvarht + && (flags & LET_NO_COMMAND) == 0) + { + semsg(_(e_declare_global), name); + return; + } + is_script_local = ht == get_script_local_ht(); di = find_var_in_ht(ht, 0, varname, TRUE); *** ../vim-8.2.1023/src/globals.h 2020-06-16 22:27:35.827988257 +0200 --- src/globals.h 2020-06-20 20:24:52.752475481 +0200 *************** *** 1788,1793 **** --- 1788,1794 ---- EXTERN char e_lock_unlock[] INIT(= N_("E940: Cannot lock or unlock variable %s")); 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_global[] INIT(= N_("E1016: Cannot declare a global variable: %s")); #endif #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) EXTERN char e_alloc_color[] INIT(= N_("E254: Cannot allocate color %s")); *** ../vim-8.2.1023/src/structs.h 2020-06-20 18:19:05.920877872 +0200 --- src/structs.h 2020-06-20 22:32:21.934805144 +0200 *************** *** 67,72 **** --- 67,74 ---- typedef struct VimMenu vimmenu_T; #endif + // maximum value for sc_version + #define SCRIPT_VERSION_MAX 4 // value for sc_version in a Vim9 script file #define SCRIPT_VERSION_VIM9 999999 *** ../vim-8.2.1023/src/vim9compile.c 2020-06-20 18:19:05.916877882 +0200 --- src/vim9compile.c 2020-06-20 20:24:02.376827247 +0200 *************** *** 4871,4878 **** dest = dest_global; if (is_decl) { ! semsg(_("E1016: Cannot declare a global variable: %s"), ! name); goto theend; } } --- 4871,4877 ---- dest = dest_global; if (is_decl) { ! semsg(_(e_declare_global), name); goto theend; } } *** ../vim-8.2.1023/src/scriptfile.c 2020-06-19 19:01:39.038497746 +0200 --- src/scriptfile.c 2020-06-20 22:32:00.314870204 +0200 *************** *** 1873,1879 **** nr = getdigits(&eap->arg); if (nr == 0 || *eap->arg != NUL) emsg(_(e_invarg)); ! else if (nr > 4) semsg(_("E999: scriptversion not supported: %d"), nr); else { --- 1873,1879 ---- nr = getdigits(&eap->arg); if (nr == 0 || *eap->arg != NUL) emsg(_(e_invarg)); ! else if (nr > SCRIPT_VERSION_MAX) semsg(_("E999: scriptversion not supported: %d"), nr); else { *** ../vim-8.2.1023/src/userfunc.c 2020-06-20 18:19:05.920877872 +0200 --- src/userfunc.c 2020-06-20 22:33:45.182554129 +0200 *************** *** 3325,3330 **** --- 3325,3333 ---- if (eap->cmdidx == CMD_def) set_function_type(fp); + else if (fp->uf_script_ctx.sc_version == SCRIPT_VERSION_VIM9) + // :func does not use Vim9 script syntax, even in a Vim9 script file + fp->uf_script_ctx.sc_version = SCRIPT_VERSION_MAX; goto ret_free; *** ../vim-8.2.1023/src/testdir/test_vim9_script.vim 2020-06-19 19:01:39.038497746 +0200 --- src/testdir/test_vim9_script.vim 2020-06-20 22:38:05.097766109 +0200 *************** *** 1099,1109 **** g:glob = 2 if false ! execute('let g:glob = 3') endif assert_equal(2, g:glob) if true ! execute('let g:glob = 3') endif assert_equal(3, g:glob) --- 1099,1109 ---- g:glob = 2 if false ! execute('g:glob = 3') endif assert_equal(2, g:glob) if true ! execute('g:glob = 3') endif assert_equal(3, g:glob) *************** *** 1790,1797 **** enddef def Test_vim9_comment_not_compiled() ! au TabEnter *.vim let g:entered = 1 ! au TabEnter *.x let g:entered = 2 edit test.vim doautocmd TabEnter #comment --- 1790,1797 ---- enddef def Test_vim9_comment_not_compiled() ! au TabEnter *.vim g:entered = 1 ! au TabEnter *.x g:entered = 2 edit test.vim doautocmd TabEnter #comment *************** *** 1811,1817 **** CheckScriptSuccess([ 'vim9script', ! 'let g:var = 123', 'let w:var = 777', 'unlet g:var w:var # something', ]) --- 1811,1817 ---- CheckScriptSuccess([ 'vim9script', ! 'g:var = 123', 'let w:var = 777', 'unlet g:var w:var # something', ]) *************** *** 1819,1824 **** --- 1819,1829 ---- CheckScriptFailure([ 'vim9script', 'let g:var = 123', + ], 'E1016:') + + CheckScriptFailure([ + 'vim9script', + 'g:var = 123', 'unlet g:var# comment1', ], 'E108:') *************** *** 1889,1899 **** def Test_finish() let lines =<< trim END vim9script ! let g:res = 'one' if v:false | finish | endif ! let g:res = 'two' finish ! let g:res = 'three' END writefile(lines, 'Xfinished') source Xfinished --- 1894,1904 ---- def Test_finish() let lines =<< trim END vim9script ! g:res = 'one' if v:false | finish | endif ! g:res = 'two' finish ! g:res = 'three' END writefile(lines, 'Xfinished') source Xfinished *** ../vim-8.2.1023/src/testdir/test_vim9_disassemble.vim 2020-06-18 22:18:07.396246807 +0200 --- src/testdir/test_vim9_disassemble.vim 2020-06-20 22:43:28.008869384 +0200 *************** *** 1190,1196 **** def FuncTwo(): string return 'two' enddef ! let g:res_FuncOne: string = execute('disass FuncOne') END writefile(lines, 'Xdisassemble') source Xdisassemble --- 1190,1196 ---- def FuncTwo(): string return 'two' enddef ! g:res_FuncOne = execute('disass FuncOne') END writefile(lines, 'Xdisassemble') source Xdisassemble *** ../vim-8.2.1023/src/testdir/test_vim9_func.vim 2020-06-18 20:50:06.349864243 +0200 --- src/testdir/test_vim9_func.vim 2020-06-20 22:47:50.408116145 +0200 *************** *** 323,329 **** str->MyFunc() assert_equal('barfoo', var) ! let g:value = 'value' g:value->MyFunc() assert_equal('value', var) --- 323,329 ---- str->MyFunc() assert_equal('barfoo', var) ! g:value = 'value' g:value->MyFunc() assert_equal('value', var) *** ../vim-8.2.1023/src/version.c 2020-06-20 18:19:05.920877872 +0200 --- src/version.c 2020-06-20 22:49:39.043799255 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1024, /**/ -- An indication you must be a manager: You give constructive feedback to your dog. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///