To: vim_dev@googlegroups.com Subject: Patch 8.2.0348 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0348 Problem: Vim9: not all code tested. Solution: Add a few more tests. fix using "b:" in literal dictionary. Files: src/testdir/test_vim9_expr.vim, src/vim9compile.c, src/proto/vim9compile.pro, src/testdir/test_vim9_script.vim *** ../vim-8.2.0347/src/testdir/test_vim9_expr.vim 2020-02-29 23:23:44.484659204 +0100 --- src/testdir/test_vim9_expr.vim 2020-03-02 21:33:36.998399557 +0100 *************** *** 37,45 **** assert_equal('one', 0.1 ? 'one' : 'two') endif assert_equal('one', 'x' ? 'one' : 'two') ! " assert_equal('one', 0z1234 ? 'one' : 'two') assert_equal('one', [0] ? 'one' : 'two') ! " assert_equal('one', #{x: 0} ? 'one' : 'two') let var = 1 assert_equal('one', var ? 'one' : 'two') --- 37,45 ---- assert_equal('one', 0.1 ? 'one' : 'two') endif assert_equal('one', 'x' ? 'one' : 'two') ! assert_equal('one', 0z1234 ? 'one' : 'two') assert_equal('one', [0] ? 'one' : 'two') ! assert_equal('one', #{x: 0} ? 'one' : 'two') let var = 1 assert_equal('one', var ? 'one' : 'two') *************** *** 49,57 **** assert_equal('two', 0.0 ? 'one' : 'two') endif assert_equal('two', '' ? 'one' : 'two') ! " assert_equal('one', 0z ? 'one' : 'two') assert_equal('two', [] ? 'one' : 'two') ! " assert_equal('two', {} ? 'one' : 'two') var = 0 assert_equal('two', var ? 'one' : 'two') enddef --- 49,57 ---- assert_equal('two', 0.0 ? 'one' : 'two') endif assert_equal('two', '' ? 'one' : 'two') ! assert_equal('two', 0z ? 'one' : 'two') assert_equal('two', [] ? 'one' : 'two') ! assert_equal('two', {} ? 'one' : 'two') var = 0 assert_equal('two', var ? 'one' : 'two') enddef *************** *** 447,452 **** --- 447,457 ---- call CheckDefFailure("let x = [13] <= [88]", 'Cannot compare list with list') call CheckDefFailure("let x = [13] =~ [88]", 'Cannot compare list with list') call CheckDefFailure("let x = [13] !~ [88]", 'Cannot compare list with list') + + call CheckDefFailureMult(['let j: job', 'let chan: channel', 'let r = j == chan'], 'Cannot compare job with channel') + call CheckDefFailureMult(['let j: job', 'let x: list', 'let r = j == x'], 'Cannot compare job with list') + call CheckDefFailureMult(['let j: job', 'let x: func', 'let r = j == x'], 'Cannot compare job with func') + call CheckDefFailureMult(['let j: job', 'let x: partial', 'let r = j == x'], 'Cannot compare job with partial') endfunc " test addition, subtraction, concatenation *** ../vim-8.2.0347/src/vim9compile.c 2020-03-01 23:32:22.348059441 +0100 --- src/vim9compile.c 2020-03-02 22:03:45.982074243 +0100 *************** *** 507,513 **** && (type1 == VAR_BLOB || type2 == VAR_BLOB || type1 == VAR_LIST || type2 == VAR_LIST)))) { ! semsg(_("E1037: Cannot compare %s with %s"), vartype_name(type1), vartype_name(type2)); return FAIL; } --- 507,513 ---- && (type1 == VAR_BLOB || type2 == VAR_BLOB || type1 == VAR_LIST || type2 == VAR_LIST)))) { ! semsg(_("E1072: Cannot compare %s with %s"), vartype_name(type1), vartype_name(type2)); return FAIL; } *************** *** 1494,1501 **** { switch (type) { case VAR_VOID: return "void"; - case VAR_UNKNOWN: return "any"; case VAR_SPECIAL: return "special"; case VAR_BOOL: return "bool"; case VAR_NUMBER: return "number"; --- 1494,1501 ---- { switch (type) { + case VAR_UNKNOWN: break; case VAR_VOID: return "void"; case VAR_SPECIAL: return "special"; case VAR_BOOL: return "bool"; case VAR_NUMBER: return "number"; *************** *** 1509,1515 **** case VAR_FUNC: return "func"; case VAR_PARTIAL: return "partial"; } ! return "???"; } /* --- 1509,1515 ---- case VAR_FUNC: return "func"; case VAR_PARTIAL: return "partial"; } ! return "any"; } /* *************** *** 1907,1917 **** /* * Find the end of a variable or function name. Unlike find_name_end() this * does not recognize magic braces. * Return a pointer to just after the name. Equal to "arg" if there is no * valid name. */ ! char_u * ! to_name_end(char_u *arg) { char_u *p; --- 1907,1918 ---- /* * Find the end of a variable or function name. Unlike find_name_end() this * does not recognize magic braces. + * When "namespace" is TRUE recognize "b:", "s:", etc. * Return a pointer to just after the name. Equal to "arg" if there is no * valid name. */ ! static char_u * ! to_name_end(char_u *arg, int namespace) { char_u *p; *************** *** 1923,1928 **** --- 1924,1930 ---- // Include a namespace such as "s:var" and "v:var". But "n:" is not // and can be used in slice "[n:]". if (*p == ':' && (p != arg + 1 + || !namespace || vim_strchr(VIM9_NAMESPACE_CHAR, *arg) == NULL)) break; return p; *************** *** 1934,1940 **** char_u * to_name_const_end(char_u *arg) { ! char_u *p = to_name_end(arg); typval_T rettv; if (p == arg && *arg == '[') --- 1936,1942 ---- char_u * to_name_const_end(char_u *arg) { ! char_u *p = to_name_end(arg, TRUE); typval_T rettv; if (p == arg && *arg == '[') *************** *** 2145,2151 **** if (literal) { ! char_u *p = to_name_end(*arg); if (p == *arg) { --- 2147,2153 ---- if (literal) { ! char_u *p = to_name_end(*arg, !literal); if (p == *arg) { *************** *** 2766,2772 **** } // "name" or "name()" ! p = to_name_end(*arg); if (*p == '(') r = compile_call(arg, p - *arg, cctx, 0); else --- 2768,2774 ---- } // "name" or "name()" ! p = to_name_end(*arg, TRUE); if (*p == '(') r = compile_call(arg, p - *arg, cctx, 0); else *************** *** 4980,4986 **** // val". p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@') ? ea.cmd + 1 : ea.cmd; ! p = to_name_end(p); if ((p > ea.cmd && *p != NUL) || *p == '(') { int oplen; --- 4982,4988 ---- // val". p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@') ? ea.cmd + 1 : ea.cmd; ! p = to_name_end(p, TRUE); if ((p > ea.cmd && *p != NUL) || *p == '(') { int oplen; *************** *** 4992,4998 **** // Recognize an assignment if we recognize the variable // name: // "g:var = expr" ! // "var = expr" where "var" is a local var name. // "&opt = expr" // "$ENV = expr" // "@r = expr" --- 4994,5002 ---- // Recognize an assignment if we recognize the variable // name: // "g:var = expr" ! // "local = expr" where "local" is a local var. ! // "script = expr" where "script" is a script-local var. ! // "import = expr" where "import" is an imported var // "&opt = expr" // "$ENV = expr" // "@r = expr" *** ../vim-8.2.0347/src/proto/vim9compile.pro 2020-02-03 20:50:55.672929674 +0100 --- src/proto/vim9compile.pro 2020-03-02 21:43:32.954859207 +0100 *************** *** 5,11 **** char *type_name(type_T *type, char **tofree); int get_script_item_idx(int sid, char_u *name, int check_writable); imported_T *find_imported(char_u *name, size_t len, cctx_T *cctx); - char_u *to_name_end(char_u *arg); char_u *to_name_const_end(char_u *arg); int assignment_len(char_u *p, int *heredoc); void compile_def_function(ufunc_T *ufunc, int set_return_type); --- 5,10 ---- *** ../vim-8.2.0347/src/testdir/test_vim9_script.vim 2020-03-01 23:32:22.348059441 +0100 --- src/testdir/test_vim9_script.vim 2020-03-02 22:52:06.712807422 +0100 *************** *** 68,73 **** --- 68,75 ---- " type becomes list let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] + " type becomes dict + let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} g:newvar = 'new' assert_equal('new', g:newvar) *************** *** 373,378 **** --- 375,381 ---- g:imported_name = exp_name exp_name ..= ' Doe' g:imported_name_appended = exp_name + g:imported_later = exported END writefile(import_script_lines, 'Ximport.vim') *************** *** 384,389 **** --- 387,393 ---- assert_equal('bob', g:localname) assert_equal(9876, g:imported) assert_equal(9879, g:imported_added) + assert_equal(9879, g:imported_later) assert_equal('Exported', g:imported_func) assert_equal('John', g:imported_name) assert_equal('John Doe', g:imported_name_appended) *************** *** 393,402 **** --- 397,426 ---- unlet g:localname unlet g:imported unlet g:imported_added + unlet g:imported_later unlet g:imported_func unlet g:imported_name g:imported_name_appended delete('Ximport.vim') + let import_in_def_lines =<< trim END + vim9script + def ImportInDef() + import exported from './Xexport.vim' + g:imported = exported + exported += 7 + g:imported_added = exported + enddef + ImportInDef() + END + writefile(import_in_def_lines, 'Ximport2.vim') + source Ximport2.vim + " TODO: this should be 9879 + assert_equal(9876, g:imported) + assert_equal(9883, g:imported_added) + unlet g:imported + unlet g:imported_added + delete('Ximport2.vim') + let import_star_as_lines =<< trim END vim9script import * as Export from './Xexport.vim' *************** *** 407,413 **** END writefile(import_star_as_lines, 'Ximport.vim') source Ximport.vim ! assert_equal(9876, g:imported) let import_star_lines =<< trim END vim9script --- 431,437 ---- END writefile(import_star_as_lines, 'Ximport.vim') source Ximport.vim ! assert_equal(9883, g:imported) let import_star_lines =<< trim END vim9script *** ../vim-8.2.0347/src/version.c 2020-03-02 20:54:19.323757498 +0100 --- src/version.c 2020-03-02 21:43:07.594993289 +0100 *************** *** 740,741 **** --- 740,743 ---- { /* Add new patch number below this line */ + /**/ + 348, /**/ -- hundred-and-one symptoms of being an internet addict: 168. You have your own domain name. /// 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 ///