To: vim_dev@googlegroups.com Subject: Patch 8.2.1756 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1756 Problem: Vim9: :let will soon be disallowed. Solution: Add v:disallow_let temporarily. Fix tests. Files: src/vim.h, src/errors.h, src/evalvars.c, src/vim9compile.c, src/userfunc.c, src/testdir/test_vim9_script.vim *** ../vim-8.2.1755/src/vim.h 2020-09-26 15:08:52.885779899 +0200 --- src/vim.h 2020-09-27 14:31:28.181237171 +0200 *************** *** 1992,1998 **** #define VV_ECHOSPACE 93 #define VV_ARGV 94 #define VV_COLLATE 95 ! #define VV_LEN 96 // number of v: vars // used for v_number in VAR_BOOL and VAR_SPECIAL #define VVAL_FALSE 0L // VAR_BOOL --- 1992,1999 ---- #define VV_ECHOSPACE 93 #define VV_ARGV 94 #define VV_COLLATE 95 ! #define VV_DISALLOW_LET 96 // TODO: remove again ! #define VV_LEN 97 // number of v: vars // used for v_number in VAR_BOOL and VAR_SPECIAL #define VVAL_FALSE 0L // VAR_BOOL *** ../vim-8.2.1755/src/errors.h 2020-09-26 15:08:52.881779910 +0200 --- src/errors.h 2020-09-27 14:33:13.360937745 +0200 *************** *** 274,277 **** --- 274,279 ---- INIT(= N_("E1124: \"%s\" cannot be used in legacy Vim script")); EXTERN char e_final_requires_a_value[] INIT(= N_("E1125: Final requires a value")); + EXTERN char e_cannot_use_let_in_vim9_script[] + INIT(= N_("E1126: Cannot use :let in Vim9 script")); #endif *** ../vim-8.2.1755/src/evalvars.c 2020-09-27 14:22:45.006688671 +0200 --- src/evalvars.c 2020-09-27 14:42:47.575282572 +0200 *************** *** 146,151 **** --- 146,152 ---- {VV_NAME("echospace", VAR_NUMBER), VV_RO}, {VV_NAME("argv", VAR_LIST), VV_RO}, {VV_NAME("collate", VAR_STRING), VV_RO}, + {VV_NAME("disallow_let", VAR_NUMBER), 0}, // TODO: remove }; // shorthand *************** *** 734,739 **** --- 735,746 ---- ex_finally(eap); return; } + if (get_vim_var_nr(VV_DISALLOW_LET) + && eap->cmdidx == CMD_let && vim9script) + { + emsg(_(e_cannot_use_let_in_vim9_script)); + return; + } if (eap->cmdidx == CMD_const && !vim9script && !eap->forceit) // In legacy Vim script ":const" works like ":final". eap->cmdidx = CMD_final; *** ../vim-8.2.1755/src/vim9compile.c 2020-09-27 14:22:45.006688671 +0200 --- src/vim9compile.c 2020-09-27 14:37:05.980270494 +0200 *************** *** 6979,6984 **** --- 6979,6990 ---- break; case CMD_let: + if (get_vim_var_nr(VV_DISALLOW_LET)) + { + emsg(_(e_cannot_use_let_in_vim9_script)); + break; + } + // FALLTHROUGH case CMD_var: case CMD_final: case CMD_const: *** ../vim-8.2.1755/src/userfunc.c 2020-09-21 22:02:44.276720646 +0200 --- src/userfunc.c 2020-09-27 15:00:15.681046658 +0200 *************** *** 3214,3232 **** is_heredoc = TRUE; } ! // Check for ":let v =<< [trim] EOF" ! // and ":let [a, b] =<< [trim] EOF" arg = skipwhite(skiptowhite(p)); if (*arg == '[') arg = vim_strchr(arg, ']'); if (arg != NULL) { arg = skipwhite(skiptowhite(arg)); ! if ( arg[0] == '=' && arg[1] == '<' && arg[2] =='<' ! && ((p[0] == 'l' ! && p[1] == 'e' ! && (!ASCII_ISALNUM(p[2]) ! || (p[2] == 't' && !ASCII_ISALNUM(p[3])))))) { p = skipwhite(arg + 3); if (STRNCMP(p, "trim", 4) == 0) --- 3214,3233 ---- is_heredoc = TRUE; } ! // Check for ":cmd v =<< [trim] EOF" ! // and ":cmd [a, b] =<< [trim] EOF" ! // Where "cmd" can be "let", "var", "final" or "const". arg = skipwhite(skiptowhite(p)); if (*arg == '[') arg = vim_strchr(arg, ']'); if (arg != NULL) { arg = skipwhite(skiptowhite(arg)); ! if (arg[0] == '=' && arg[1] == '<' && arg[2] =='<' ! && (checkforcmd(&p, "let", 2) ! || checkforcmd(&p, "var", 3) ! || checkforcmd(&p, "final", 5) ! || checkforcmd(&p, "const", 5))) { p = skipwhite(arg + 3); if (STRNCMP(p, "trim", 4) == 0) *** ../vim-8.2.1755/src/testdir/test_vim9_script.vim 2020-09-26 17:20:49.693186820 +0200 --- src/testdir/test_vim9_script.vim 2020-09-27 15:10:01.431599549 +0200 *************** *** 6,11 **** --- 6,14 ---- source vim9.vim source shared.vim + " TODO: remove later + let v:disallow_let = 1 + def Test_range_only() new setline(1, ['blah', 'Blah']) *************** *** 45,61 **** CheckScriptFailure([ 'vim9script', ! 'let svar = 123', 'unlet svar', ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'let svar = 123', 'unlet s:svar', ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'let svar = 123', 'def Func()', ' unlet svar', 'enddef', --- 48,64 ---- CheckScriptFailure([ 'vim9script', ! 'var svar = 123', 'unlet svar', ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'var svar = 123', 'unlet s:svar', ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'var svar = 123', 'def Func()', ' unlet svar', 'enddef', *************** *** 63,69 **** ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'let svar = 123', 'def Func()', ' unlet s:svar', 'enddef', --- 66,72 ---- ], 'E1081:') CheckScriptFailure([ 'vim9script', ! 'var svar = 123', 'def Func()', ' unlet s:svar', 'enddef', *************** *** 119,125 **** ], 'E1084:') # Check that global :def function can be replaced and deleted ! let lines =<< trim END vim9script def g:Global(): string return "yes" --- 122,128 ---- ], 'E1084:') # Check that global :def function can be replaced and deleted ! var lines =<< trim END vim9script def g:Global(): string return "yes" *************** *** 168,226 **** enddef def Test_wrong_type() ! CheckDefFailure(['let var: list'], 'E1010:') ! CheckDefFailure(['let var: list>'], 'E1010:') ! CheckDefFailure(['let var: dict'], 'E1010:') ! CheckDefFailure(['let var: dict>'], 'E1010:') ! ! CheckDefFailure(['let var: dict'], 'E1009:') ! ! CheckDefFailure(['let var: ally'], 'E1010:') ! CheckDefFailure(['let var: bram'], 'E1010:') ! CheckDefFailure(['let var: cathy'], 'E1010:') ! CheckDefFailure(['let var: dom'], 'E1010:') ! CheckDefFailure(['let var: freddy'], 'E1010:') ! CheckDefFailure(['let var: john'], 'E1010:') ! CheckDefFailure(['let var: larry'], 'E1010:') ! CheckDefFailure(['let var: ned'], 'E1010:') ! CheckDefFailure(['let var: pam'], 'E1010:') ! CheckDefFailure(['let var: sam'], 'E1010:') ! CheckDefFailure(['let var: vim'], 'E1010:') ! CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') ! CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') enddef def Test_const() ! CheckDefFailure(['final var = 234', 'var = 99'], 'E1018:') ! CheckDefFailure(['final one = 234', 'let one = 99'], 'E1017:') ! CheckDefFailure(['final list = [1, 2]', 'let list = [3, 4]'], 'E1017:') CheckDefFailure(['final two'], 'E1125:') CheckDefFailure(['final &option'], 'E996:') ! let lines =<< trim END final list = [1, 2, 3] list[0] = 4 list->assert_equal([4, 2, 3]) const other = [5, 6, 7] other->assert_equal([5, 6, 7]) ! let varlist = [7, 8] const constlist = [1, varlist, 3] varlist[0] = 77 # TODO: does not work yet # constlist[1][1] = 88 ! let cl = constlist[1] cl[1] = 88 constlist->assert_equal([1, [77, 88], 3]) ! let vardict = #{five: 5, six: 6} const constdict = #{one: 1, two: vardict, three: 3} vardict['five'] = 55 # TODO: does not work yet # constdict['two']['six'] = 66 ! let cd = constdict['two'] cd['six'] = 66 constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3}) END --- 171,229 ---- enddef def Test_wrong_type() ! CheckDefFailure(['var name: list'], 'E1010:') ! CheckDefFailure(['var name: list>'], 'E1010:') ! CheckDefFailure(['var name: dict'], 'E1010:') ! CheckDefFailure(['var name: dict>'], 'E1010:') ! ! CheckDefFailure(['var name: dict'], 'E1009:') ! ! CheckDefFailure(['var name: ally'], 'E1010:') ! CheckDefFailure(['var name: bram'], 'E1010:') ! CheckDefFailure(['var name: cathy'], 'E1010:') ! CheckDefFailure(['var name: dom'], 'E1010:') ! CheckDefFailure(['var name: freddy'], 'E1010:') ! CheckDefFailure(['var name: john'], 'E1010:') ! CheckDefFailure(['var name: larry'], 'E1010:') ! CheckDefFailure(['var name: ned'], 'E1010:') ! CheckDefFailure(['var name: pam'], 'E1010:') ! CheckDefFailure(['var name: sam'], 'E1010:') ! CheckDefFailure(['var name: vim'], 'E1010:') ! CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') ! CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') enddef def Test_const() ! CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') ! CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') ! CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') CheckDefFailure(['final two'], 'E1125:') CheckDefFailure(['final &option'], 'E996:') ! var lines =<< trim END final list = [1, 2, 3] list[0] = 4 list->assert_equal([4, 2, 3]) const other = [5, 6, 7] other->assert_equal([5, 6, 7]) ! var varlist = [7, 8] const constlist = [1, varlist, 3] varlist[0] = 77 # TODO: does not work yet # constlist[1][1] = 88 ! var cl = constlist[1] cl[1] = 88 constlist->assert_equal([1, [77, 88], 3]) ! var vardict = #{five: 5, six: 6} const constdict = #{one: 1, two: vardict, three: 3} vardict['five'] = 55 # TODO: does not work yet # constdict['two']['six'] = 66 ! var cd = constdict['two'] cd['six'] = 66 constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3}) END *************** *** 228,234 **** enddef def Test_const_bang() ! let lines =<< trim END const var = 234 var = 99 END --- 231,237 ---- enddef def Test_const_bang() ! var lines =<< trim END const var = 234 var = 99 END *************** *** 273,281 **** def Test_block() ! let outer = 1 { ! let inner = 2 assert_equal(1, outer) assert_equal(2, inner) } --- 276,284 ---- def Test_block() ! var outer = 1 { ! var inner = 2 assert_equal(1, outer) assert_equal(2, inner) } *************** *** 283,289 **** enddef def Test_block_failure() ! CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') CheckDefFailure(['}'], 'E1025:') CheckDefFailure(['{', 'echo 1'], 'E1026:') enddef --- 286,292 ---- enddef def Test_block_failure() ! CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') CheckDefFailure(['}'], 'E1025:') CheckDefFailure(['{', 'echo 1'], 'E1026:') enddef *************** *** 293,299 **** endfunc def Test_try_catch() ! let l = [] try # comment add(l, '1') throw 'wrong' --- 296,302 ---- endfunc def Test_try_catch() ! var l = [] try # comment add(l, '1') throw 'wrong' *************** *** 321,327 **** endtry assert_equal(['1', 'caught', 'finally'], l) ! let n: number try n = l[3] catch /E684:/ --- 324,330 ---- endtry assert_equal(['1', 'caught', 'finally'], l) ! var n: number try n = l[3] catch /E684:/ *************** *** 358,364 **** endtry assert_equal(121, n) ! let d = #{one: 1} try n = d[g:astring] catch /E716:/ --- 361,367 ---- endtry assert_equal(121, n) ! var d = #{one: 1} try n = d[g:astring] catch /E716:/ *************** *** 387,393 **** endtry assert_equal(255, n) ! let nd: dict try nd = {g:anumber: 1} catch /E1012:/ --- 390,396 ---- endtry assert_equal(255, n) ! var nd: dict try nd = {g:anumber: 1} catch /E1012:/ *************** *** 452,458 **** endtry assert_equal(355, n) ! let P = function('g:NoSuchFunc') delfunc g:NoSuchFunc try echo P() --- 455,461 ---- endtry assert_equal(355, n) ! var P = function('g:NoSuchFunc') delfunc g:NoSuchFunc try echo P() *************** *** 553,559 **** def TryTwo(n: number): string try ! let x = {} catch endtry return 'text' --- 556,562 ---- def TryTwo(n: number): string try ! var x = {} catch endtry return 'text' *************** *** 564,570 **** enddef def Test_try_catch_match() ! let seq = 'a' try throw 'something' catch /nothing/ --- 567,573 ---- enddef def Test_try_catch_match() ! var seq = 'a' try throw 'something' catch /nothing/ *************** *** 599,605 **** def Test_throw_vimscript() # only checks line continuation ! let lines =<< trim END vim9script try throw 'one' --- 602,608 ---- def Test_throw_vimscript() # only checks line continuation ! var lines =<< trim END vim9script try throw 'one' *************** *** 613,619 **** def Test_error_in_nested_function() # an error in a nested :function aborts executin in the calling :def function ! let lines =<< trim END vim9script def Func() Error() --- 616,622 ---- def Test_error_in_nested_function() # an error in a nested :function aborts executin in the calling :def function ! var lines =<< trim END vim9script def Func() Error() *************** *** 632,638 **** def Test_cexpr_vimscript() # only checks line continuation set errorformat=File\ %f\ line\ %l ! let lines =<< trim END vim9script cexpr 'File' .. ' someFile' .. --- 635,641 ---- def Test_cexpr_vimscript() # only checks line continuation set errorformat=File\ %f\ line\ %l ! var lines =<< trim END vim9script cexpr 'File' .. ' someFile' .. *************** *** 645,651 **** def Test_statusline_syntax() # legacy syntax is used for 'statusline' ! let lines =<< trim END vim9script func g:Status() return '%{"x" is# "x"}' --- 648,654 ---- def Test_statusline_syntax() # legacy syntax is used for 'statusline' ! var lines =<< trim END vim9script func g:Status() return '%{"x" is# "x"}' *************** *** 659,667 **** def Test_list_vimscript() # checks line continuation and comments ! let lines =<< trim END vim9script ! let mylist = [ 'one', # comment 'two', # empty line follows --- 662,670 ---- def Test_list_vimscript() # checks line continuation and comments ! var lines =<< trim END vim9script ! var mylist = [ 'one', # comment 'two', # empty line follows *************** *** 702,708 **** let s:export_script_lines =<< trim END vim9script ! let name: string = 'bob' def Concat(arg: string): string return name .. arg enddef --- 705,711 ---- let s:export_script_lines =<< trim END vim9script ! var name: string = 'bob' def Concat(arg: string): string return name .. arg enddef *************** *** 710,717 **** g:localname = name export const CONST = 1234 ! export let exported = 9876 ! export let exp_name = 'John' export def Exported(): string return 'Exported' enddef --- 713,720 ---- g:localname = name export const CONST = 1234 ! export var exported = 9876 ! export var exp_name = 'John' export def Exported(): string return 'Exported' enddef *************** *** 723,729 **** enddef def Test_vim9_import_export() ! let import_script_lines =<< trim END vim9script import {exported, Exported} from './Xexport.vim' g:imported = exported --- 726,732 ---- enddef def Test_vim9_import_export() ! var import_script_lines =<< trim END vim9script import {exported, Exported} from './Xexport.vim' g:imported = exported *************** *** 732,738 **** g:imported_func = Exported() def GetExported(): string ! let local_dict = #{ref: Exported} return local_dict.ref() enddef g:funcref_result = GetExported() --- 735,741 ---- g:imported_func = Exported() def GetExported(): string ! var local_dict = #{ref: Exported} return local_dict.ref() enddef g:funcref_result = GetExported() *************** *** 769,775 **** delete('Ximport.vim') # similar, with line breaks ! let import_line_break_script_lines =<< trim END vim9script import { exported, --- 772,778 ---- delete('Ximport.vim') # similar, with line breaks ! var import_line_break_script_lines =<< trim END vim9script import { exported, *************** *** 797,803 **** delete('Ximport_lbr.vim') # import inside :def function ! let import_in_def_lines =<< trim END vim9script def ImportInDef() import exported from './Xexport.vim' --- 800,806 ---- delete('Ximport_lbr.vim') # import inside :def function ! var import_in_def_lines =<< trim END vim9script def ImportInDef() import exported from './Xexport.vim' *************** *** 816,822 **** unlet g:imported_added delete('Ximport2.vim') ! let import_star_as_lines =<< trim END vim9script import * as Export from './Xexport.vim' def UseExport() --- 819,825 ---- unlet g:imported_added delete('Ximport2.vim') ! var import_star_as_lines =<< trim END vim9script import * as Export from './Xexport.vim' def UseExport() *************** *** 828,868 **** source Ximport.vim assert_equal(9883, g:imported) ! let import_star_as_lines_no_dot =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! let dummy = 1 ! let imported = Export + dummy enddef defcompile END writefile(import_star_as_lines_no_dot, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') ! let import_star_as_lines_dot_space =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! let imported = Export . exported enddef defcompile END writefile(import_star_as_lines_dot_space, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') ! let import_star_as_lines_missing_name =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! let imported = Export. enddef defcompile END writefile(import_star_as_lines_missing_name, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') ! let import_star_as_lbr_lines =<< trim END vim9script import * as Export --- 831,871 ---- source Ximport.vim assert_equal(9883, g:imported) ! var import_star_as_lines_no_dot =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! var dummy = 1 ! var imported = Export + dummy enddef defcompile END writefile(import_star_as_lines_no_dot, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') ! var import_star_as_lines_dot_space =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! var imported = Export . exported enddef defcompile END writefile(import_star_as_lines_dot_space, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') ! var import_star_as_lines_missing_name =<< trim END vim9script import * as Export from './Xexport.vim' def Func() ! var imported = Export. enddef defcompile END writefile(import_star_as_lines_missing_name, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') ! var import_star_as_lbr_lines =<< trim END vim9script import * as Export *************** *** 877,883 **** source Ximport.vim assert_equal(9883, g:imported) ! let import_star_lines =<< trim END vim9script import * from './Xexport.vim' END --- 880,886 ---- source Ximport.vim assert_equal(9883, g:imported) ! var import_star_lines =<< trim END vim9script import * from './Xexport.vim' END *************** *** 885,891 **** assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') # try to import something that exists but is not exported ! let import_not_exported_lines =<< trim END vim9script import name from './Xexport.vim' END --- 888,894 ---- assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') # try to import something that exists but is not exported ! var import_not_exported_lines =<< trim END vim9script import name from './Xexport.vim' END *************** *** 893,901 **** assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') # try to import something that is already defined ! let import_already_defined =<< trim END vim9script ! let exported = 'something' import exported from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') --- 896,904 ---- assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') # try to import something that is already defined ! var import_already_defined =<< trim END vim9script ! var exported = 'something' import exported from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') *************** *** 904,910 **** # try to import something that is already defined import_already_defined =<< trim END vim9script ! let exported = 'something' import * as exported from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') --- 907,913 ---- # try to import something that is already defined import_already_defined =<< trim END vim9script ! var exported = 'something' import * as exported from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') *************** *** 913,954 **** # try to import something that is already defined import_already_defined =<< trim END vim9script ! let exported = 'something' import {exported} from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') # import a very long name, requires making a copy ! let import_long_name_lines =<< trim END vim9script import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' END writefile(import_long_name_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') ! let import_no_from_lines =<< trim END vim9script import name './Xexport.vim' END writefile(import_no_from_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') ! let import_invalid_string_lines =<< trim END vim9script import name from Xexport.vim END writefile(import_invalid_string_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') ! let import_wrong_name_lines =<< trim END vim9script import name from './XnoExport.vim' END writefile(import_wrong_name_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') ! let import_missing_comma_lines =<< trim END vim9script import {exported name} from './Xexport.vim' END --- 916,957 ---- # try to import something that is already defined import_already_defined =<< trim END vim9script ! var exported = 'something' import {exported} from './Xexport.vim' END writefile(import_already_defined, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') # import a very long name, requires making a copy ! var import_long_name_lines =<< trim END vim9script import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' END writefile(import_long_name_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') ! var import_no_from_lines =<< trim END vim9script import name './Xexport.vim' END writefile(import_no_from_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') ! var import_invalid_string_lines =<< trim END vim9script import name from Xexport.vim END writefile(import_invalid_string_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') ! var import_wrong_name_lines =<< trim END vim9script import name from './XnoExport.vim' END writefile(import_wrong_name_lines, 'Ximport.vim') assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') ! var import_missing_comma_lines =<< trim END vim9script import {exported name} from './Xexport.vim' END *************** *** 961,968 **** # Check that in a Vim9 script 'cpo' is set to the Vim default. set cpo&vi ! let cpo_before = &cpo ! let lines =<< trim END vim9script g:cpo_in_vim9script = &cpo END --- 964,971 ---- # Check that in a Vim9 script 'cpo' is set to the Vim default. set cpo&vi ! var cpo_before = &cpo ! var lines =<< trim END vim9script g:cpo_in_vim9script = &cpo END *************** *** 981,987 **** def Test_import_export_expr_map() # check that :import and :export work when buffer is locked ! let export_lines =<< trim END vim9script export def That(): string return 'yes' --- 984,990 ---- def Test_import_export_expr_map() # check that :import and :export work when buffer is locked ! var export_lines =<< trim END vim9script export def That(): string return 'yes' *************** *** 989,995 **** END writefile(export_lines, 'Xexport_that.vim') ! let import_lines =<< trim END vim9script import That from './Xexport_that.vim' assert_equal('yes', That()) --- 992,998 ---- END writefile(export_lines, 'Xexport_that.vim') ! var import_lines =<< trim END vim9script import That from './Xexport_that.vim' assert_equal('yes', That()) *************** *** 1007,1019 **** def Test_import_in_filetype() # check that :import works when the buffer is locked mkdir('ftplugin', 'p') ! let export_lines =<< trim END vim9script ! export let That = 'yes' END writefile(export_lines, 'ftplugin/Xexport_ft.vim') ! let import_lines =<< trim END vim9script import That from './Xexport_ft.vim' assert_equal('yes', That) --- 1010,1022 ---- def Test_import_in_filetype() # check that :import works when the buffer is locked mkdir('ftplugin', 'p') ! var export_lines =<< trim END vim9script ! export var That = 'yes' END writefile(export_lines, 'ftplugin/Xexport_ft.vim') ! var import_lines =<< trim END vim9script import That from './Xexport_ft.vim' assert_equal('yes', That) *************** *** 1021,1027 **** END writefile(import_lines, 'ftplugin/qf.vim') ! let save_rtp = &rtp &rtp = getcwd() .. ',' .. &rtp filetype plugin on --- 1024,1030 ---- END writefile(import_lines, 'ftplugin/qf.vim') ! var save_rtp = &rtp &rtp = getcwd() .. ',' .. &rtp filetype plugin on *************** *** 1035,1041 **** enddef def Test_use_import_in_mapping() ! let lines =<< trim END vim9script export def Funcx() g:result = 42 --- 1038,1044 ---- enddef def Test_use_import_in_mapping() ! var lines =<< trim END vim9script export def Funcx() g:result = 42 *************** *** 1062,1073 **** def Test_vim9script_fails() CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') ! CheckScriptFailure(['export let some = 123'], 'E1042:') CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') ! CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') ! CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') assert_fails('vim9script', 'E1038:') --- 1065,1076 ---- def Test_vim9script_fails() CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') ! CheckScriptFailure(['export var some = 123'], 'E1042:') CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') ! CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') ! CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') assert_fails('vim9script', 'E1038:') *************** *** 1082,1088 **** endfunc def Run_Test_import_fails_on_command_line() ! let export =<< trim END vim9script export def Foo(): number return 0 --- 1085,1091 ---- endfunc def Run_Test_import_fails_on_command_line() ! var export =<< trim END vim9script export def Foo(): number return 0 *************** *** 1090,1096 **** END writefile(export, 'XexportCmd.vim') ! let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ rows: 6, wait_for_ruler: 0}) WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) --- 1093,1099 ---- END writefile(export, 'XexportCmd.vim') ! var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ rows: 6, wait_for_ruler: 0}) WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) *************** *** 1099,1114 **** enddef def Test_vim9script_reload_import() ! let lines =<< trim END vim9script const var = '' ! let valone = 1234 def MyFunc(arg: string) valone = 5678 enddef END ! let morelines =<< trim END ! let valtwo = 222 export def GetValtwo(): number return valtwo enddef --- 1102,1117 ---- enddef def Test_vim9script_reload_import() ! var lines =<< trim END vim9script const var = '' ! var valone = 1234 def MyFunc(arg: string) valone = 5678 enddef END ! var morelines =<< trim END ! var valtwo = 222 export def GetValtwo(): number return valtwo enddef *************** *** 1118,1124 **** source Xreload.vim source Xreload.vim ! let testlines =<< trim END vim9script def TheFunc() import GetValtwo from './Xreload.vim' --- 1121,1127 ---- source Xreload.vim source Xreload.vim ! var testlines =<< trim END vim9script def TheFunc() import GetValtwo from './Xreload.vim' *************** *** 1137,1144 **** # cannot declare a var twice lines =<< trim END vim9script ! let valone = 1234 ! let valone = 5678 END writefile(lines, 'Xreload.vim') assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') --- 1140,1147 ---- # cannot declare a var twice lines =<< trim END vim9script ! var valone = 1234 ! var valone = 5678 END writefile(lines, 'Xreload.vim') assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') *************** *** 1154,1160 **** " Not exported function that is referenced needs to be accessed by the " script-local name. def Test_vim9script_funcref() ! let sortlines =<< trim END vim9script def Compare(i1: number, i2: number): number return i2 - i1 --- 1157,1163 ---- " Not exported function that is referenced needs to be accessed by the " script-local name. def Test_vim9script_funcref() ! var sortlines =<< trim END vim9script def Compare(i1: number, i2: number): number return i2 - i1 *************** *** 1166,1172 **** END writefile(sortlines, 'Xsort.vim') ! let lines =<< trim END vim9script import FastSort from './Xsort.vim' def Test() --- 1169,1175 ---- END writefile(sortlines, 'Xsort.vim') ! var lines =<< trim END vim9script import FastSort from './Xsort.vim' def Test() *************** *** 1183,1189 **** delete('Xsort.vim') delete('Xscript.vim') ! let Funcref = function('s:RetSome') assert_equal('some', Funcref()) enddef --- 1186,1192 ---- delete('Xsort.vim') delete('Xscript.vim') ! var Funcref = function('s:RetSome') assert_equal('some', Funcref()) enddef *************** *** 1191,1197 **** " script where FastFilter() is called from, both as a string and as a direct " function reference. def Test_vim9script_funcref_other_script() ! let filterLines =<< trim END vim9script export def FilterFunc(idx: number, val: number): bool return idx % 2 == 1 --- 1194,1200 ---- " script where FastFilter() is called from, both as a string and as a direct " function reference. def Test_vim9script_funcref_other_script() ! var filterLines =<< trim END vim9script export def FilterFunc(idx: number, val: number): bool return idx % 2 == 1 *************** *** 1205,1219 **** END writefile(filterLines, 'Xfilter.vim') ! let lines =<< trim END vim9script import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' def Test() ! let x: list = FastFilter() enddef Test() def TestDirect() ! let x: list = FastFilterDirect() enddef TestDirect() END --- 1208,1222 ---- END writefile(filterLines, 'Xfilter.vim') ! var lines =<< trim END vim9script import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' def Test() ! var x: list = FastFilter() enddef Test() def TestDirect() ! var x: list = FastFilterDirect() enddef TestDirect() END *************** *** 1222,1234 **** enddef def Test_vim9script_reload_delfunc() ! let first_lines =<< trim END vim9script def FuncYes(): string return 'yes' enddef END ! let withno_lines =<< trim END def FuncNo(): string return 'no' enddef --- 1225,1237 ---- enddef def Test_vim9script_reload_delfunc() ! var first_lines =<< trim END vim9script def FuncYes(): string return 'yes' enddef END ! var withno_lines =<< trim END def FuncNo(): string return 'no' enddef *************** *** 1237,1243 **** assert_equal('no', FuncNo()) enddef END ! let nono_lines =<< trim END def g:DoCheck(no_exists: bool) assert_equal('yes', FuncYes()) assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') --- 1240,1246 ---- assert_equal('no', FuncNo()) enddef END ! var nono_lines =<< trim END def g:DoCheck(no_exists: bool) assert_equal('yes', FuncYes()) assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') *************** *** 1264,1272 **** def Test_vim9script_reload_delvar() # write the script with a script-local variable ! let lines =<< trim END vim9script ! let var = 'string' END writefile(lines, 'XreloadVar.vim') source XreloadVar.vim --- 1267,1275 ---- def Test_vim9script_reload_delvar() # write the script with a script-local variable ! var lines =<< trim END vim9script ! var name = 'string' END writefile(lines, 'XreloadVar.vim') source XreloadVar.vim *************** *** 1275,1281 **** lines =<< trim END vim9script def Func() ! let var = 'string' enddef END writefile(lines, 'XreloadVar.vim') --- 1278,1284 ---- lines =<< trim END vim9script def Func() ! var name = 'string' enddef END writefile(lines, 'XreloadVar.vim') *************** *** 1285,1291 **** enddef def Test_import_absolute() ! let import_lines = [ 'vim9script', 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 'def UseExported()', --- 1288,1294 ---- enddef def Test_import_absolute() ! var import_lines = [ 'vim9script', 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 'def UseExported()', *************** *** 1323,1329 **** enddef def Test_import_rtp() ! let import_lines = [ 'vim9script', 'import exported from "Xexport_rtp.vim"', 'g:imported_rtp = exported', --- 1326,1332 ---- enddef def Test_import_rtp() ! var import_lines = [ 'vim9script', 'import exported from "Xexport_rtp.vim"', 'g:imported_rtp = exported', *************** *** 1332,1338 **** mkdir('import') writefile(s:export_script_lines, 'import/Xexport_rtp.vim') ! let save_rtp = &rtp &rtp = getcwd() source Ximport_rtp.vim &rtp = save_rtp --- 1335,1341 ---- mkdir('import') writefile(s:export_script_lines, 'import/Xexport_rtp.vim') ! var save_rtp = &rtp &rtp = getcwd() source Ximport_rtp.vim &rtp = save_rtp *************** *** 1346,1352 **** enddef def Test_import_compile_error() ! let export_lines = [ 'vim9script', 'export def ExpFunc(): string', ' return notDefined', --- 1349,1355 ---- enddef def Test_import_compile_error() ! var export_lines = [ 'vim9script', 'export def ExpFunc(): string', ' return notDefined', *************** *** 1354,1360 **** ] writefile(export_lines, 'Xexported.vim') ! let import_lines = [ 'vim9script', 'import ExpFunc from "./Xexported.vim"', 'def ImpFunc()', --- 1357,1363 ---- ] writefile(export_lines, 'Xexported.vim') ! var import_lines = [ 'vim9script', 'import ExpFunc from "./Xexported.vim"', 'def ImpFunc()', *************** *** 1377,1383 **** enddef def Test_func_redefine_error() ! let lines = [ 'vim9script', 'def Func()', ' eval [][0]', --- 1380,1386 ---- enddef def Test_func_redefine_error() ! var lines = [ 'vim9script', 'def Func()', ' eval [][0]', *************** *** 1400,1406 **** enddef def Test_func_overrules_import_fails() ! let export_lines =<< trim END vim9script export def Func() echo 'imported' --- 1403,1409 ---- enddef def Test_func_overrules_import_fails() ! var export_lines =<< trim END vim9script export def Func() echo 'imported' *************** *** 1408,1414 **** END writefile(export_lines, 'XexportedFunc.vim') ! let lines =<< trim END vim9script import Func from './XexportedFunc.vim' def Func() --- 1411,1417 ---- END writefile(export_lines, 'XexportedFunc.vim') ! var lines =<< trim END vim9script import Func from './XexportedFunc.vim' def Func() *************** *** 1433,1439 **** enddef def Test_func_redefine_fails() ! let lines =<< trim END vim9script def Func() echo 'one' --- 1436,1442 ---- enddef def Test_func_redefine_fails() ! var lines =<< trim END vim9script def Func() echo 'one' *************** *** 1450,1456 **** return 'foo' enddef def Func() ! let Foo = {-> 'lambda'} enddef defcompile END --- 1453,1459 ---- return 'foo' enddef def Func() ! var Foo = {-> 'lambda'} enddef defcompile END *************** *** 1459,1465 **** def Test_fixed_size_list() # will be allocated as one piece of memory, check that changes work ! let l = [1, 2, 3, 4] l->remove(0) l->add(5) l->insert(99, 1) --- 1462,1468 ---- def Test_fixed_size_list() # will be allocated as one piece of memory, check that changes work ! var l = [1, 2, 3, 4] l->remove(0) l->add(5) l->insert(99, 1) *************** *** 1485,1491 **** enddef def IfElse(what: number): string ! let res = '' if what == 1 res = "one" elseif what == 2 --- 1488,1494 ---- enddef def IfElse(what: number): string ! var res = '' if what == 1 res = "one" elseif what == 2 *************** *** 1514,1520 **** let g:bool_false = v:false def Test_if_const_expr() ! let res = false if true ? true : false res = true endif --- 1517,1523 ---- let g:bool_false = v:false def Test_if_const_expr() ! var res = false if true ? true : false res = true endif *************** *** 1643,1649 **** enddef def RunNested(i: number): number ! let x: number = 0 if i % 2 if 1 # comment --- 1646,1652 ---- enddef def RunNested(i: number): number ! var x: number = 0 if i % 2 if 1 # comment *************** *** 1671,1691 **** execute "setline(1, 'execute-string')" assert_equal('execute-string', getline(1)) ! let cmd1 = 'setline(1,' ! let cmd2 = '"execute-var")' execute cmd1 cmd2 # comment assert_equal('execute-var', getline(1)) execute cmd1 cmd2 '|setline(1, "execute-var-string")' assert_equal('execute-var-string', getline(1)) ! let cmd_first = 'call ' ! let cmd_last = 'setline(1, "execute-var-var")' execute cmd_first .. cmd_last assert_equal('execute-var-var', getline(1)) bwipe! ! let n = true execute 'echomsg' (n ? '"true"' : '"no"') assert_match('^true$', Screenline(&lines)) --- 1674,1694 ---- execute "setline(1, 'execute-string')" assert_equal('execute-string', getline(1)) ! var cmd1 = 'setline(1,' ! var cmd2 = '"execute-var")' execute cmd1 cmd2 # comment assert_equal('execute-var', getline(1)) execute cmd1 cmd2 '|setline(1, "execute-var-string")' assert_equal('execute-var-string', getline(1)) ! var cmd_first = 'call ' ! var cmd_last = 'setline(1, "execute-var-var")' execute cmd_first .. cmd_last assert_equal('execute-var-var', getline(1)) bwipe! ! var n = true execute 'echomsg' (n ? '"true"' : '"no"') assert_match('^true$', Screenline(&lines)) *************** *** 1699,1705 **** def Test_execute_cmd_vimscript() # only checks line continuation ! let lines =<< trim END vim9script execute 'g:someVar' .. ' = ' .. --- 1702,1708 ---- def Test_execute_cmd_vimscript() # only checks line continuation ! var lines =<< trim END vim9script execute 'g:someVar' .. ' = ' .. *************** *** 1719,1726 **** echon "thing" assert_match('^something$', Screenline(&lines)) ! let str1 = 'some' ! let str2 = 'more' echo str1 str2 assert_match('^some more$', Screenline(&lines)) --- 1722,1729 ---- echon "thing" assert_match('^something$', Screenline(&lines)) ! var str1 = 'some' ! var str2 = 'more' echo str1 str2 assert_match('^some more$', Screenline(&lines)) *************** *** 1739,1745 **** def Test_echomsg_cmd_vimscript() # only checks line continuation ! let lines =<< trim END vim9script echomsg 'here' .. ' is ' .. --- 1742,1748 ---- def Test_echomsg_cmd_vimscript() # only checks line continuation ! var lines =<< trim END vim9script echomsg 'here' .. ' is ' .. *************** *** 1759,1765 **** def Test_echoerr_cmd_vimscript() # only checks line continuation ! let lines =<< trim END vim9script try echoerr 'this' --- 1762,1768 ---- def Test_echoerr_cmd_vimscript() # only checks line continuation ! var lines =<< trim END vim9script try echoerr 'this' *************** *** 1773,1779 **** enddef def Test_for_outside_of_function() ! let lines =<< trim END vim9script new for var in range(0, 3) --- 1776,1782 ---- enddef def Test_for_outside_of_function() ! var lines =<< trim END vim9script new for var in range(0, 3) *************** *** 1788,1794 **** enddef def Test_for_loop() ! let result = '' for cnt in range(7) if cnt == 4 break --- 1791,1797 ---- enddef def Test_for_loop() ! var result = '' for cnt in range(7) if cnt == 4 break *************** *** 1800,1806 **** endfor assert_equal('0_1_3_', result) ! let concat = '' for str in eval('["one", "two"]') concat ..= str endfor --- 1803,1809 ---- endfor assert_equal('0_1_3_', result) ! var concat = '' for str in eval('["one", "two"]') concat ..= str endfor *************** *** 1810,1816 **** def Test_for_loop_fails() CheckDefFailure(['for # in range(5)'], 'E690:') CheckDefFailure(['for i In range(5)'], 'E690:') ! CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') CheckDefFailure(['for i in "text"'], 'E1012:') CheckDefFailure(['for i in xxx'], 'E1001:') --- 1813,1819 ---- def Test_for_loop_fails() CheckDefFailure(['for # in range(5)'], 'E690:') CheckDefFailure(['for i In range(5)'], 'E690:') ! CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') CheckDefFailure(['for i in "text"'], 'E1012:') CheckDefFailure(['for i in xxx'], 'E1001:') *************** *** 1819,1826 **** enddef def Test_while_loop() ! let result = '' ! let cnt = 0 while cnt < 555 if cnt == 3 break --- 1822,1829 ---- enddef def Test_while_loop() ! var result = '' ! var cnt = 0 while cnt < 555 if cnt == 3 break *************** *** 1845,1852 **** enddef def Test_interrupt_loop() ! let caught = false ! let x = 0 try while 1 x += 1 --- 1848,1855 ---- enddef def Test_interrupt_loop() ! var caught = false ! var x = 0 try while 1 x += 1 *************** *** 1864,1877 **** enddef def Test_automatic_line_continuation() ! let mylist = [ 'one', 'two', 'three', ] # comment assert_equal(['one', 'two', 'three'], mylist) ! let mydict = { 'one': 1, 'two': 2, 'three': --- 1867,1880 ---- enddef def Test_automatic_line_continuation() ! var mylist = [ 'one', 'two', 'three', ] # comment assert_equal(['one', 'two', 'three'], mylist) ! var mydict = { 'one': 1, 'two': 2, 'three': *************** *** 2340,2371 **** CheckScriptFailure([ 'vim9script', ! 'let g:var = 123', ], 'E1016: Cannot declare a global variable:') CheckScriptFailure([ 'vim9script', ! 'let b:var = 123', ], 'E1016: Cannot declare a buffer variable:') CheckScriptFailure([ 'vim9script', ! 'let w:var = 123', ], 'E1016: Cannot declare a window variable:') CheckScriptFailure([ 'vim9script', ! 'let t:var = 123', ], 'E1016: Cannot declare a tab variable:') CheckScriptFailure([ 'vim9script', ! 'let v:version = 123', ], 'E1016: Cannot declare a v: variable:') CheckScriptFailure([ 'vim9script', ! 'let $VARIABLE = "text"', ], 'E1016: Cannot declare an environment variable:') CheckScriptFailure([ --- 2343,2379 ---- CheckScriptFailure([ 'vim9script', ! 'let var = 123', ! ], 'E1126: Cannot use :let in Vim9 script') ! ! CheckScriptFailure([ ! 'vim9script', ! 'var g:var = 123', ], 'E1016: Cannot declare a global variable:') CheckScriptFailure([ 'vim9script', ! 'var b:var = 123', ], 'E1016: Cannot declare a buffer variable:') CheckScriptFailure([ 'vim9script', ! 'var w:var = 123', ], 'E1016: Cannot declare a window variable:') CheckScriptFailure([ 'vim9script', ! 'var t:var = 123', ], 'E1016: Cannot declare a tab variable:') CheckScriptFailure([ 'vim9script', ! 'var v:version = 123', ], 'E1016: Cannot declare a v: variable:') CheckScriptFailure([ 'vim9script', ! 'var $VARIABLE = "text"', ], 'E1016: Cannot declare an environment variable:') CheckScriptFailure([ *************** *** 2406,2417 **** CheckScriptSuccess([ 'vim9script', ! 'let v = 1 # comment5', ]) CheckScriptFailure([ 'vim9script', ! 'let v = 1# comment6', ], 'E15:') CheckScriptSuccess([ --- 2414,2425 ---- CheckScriptSuccess([ 'vim9script', ! 'var v = 1 # comment5', ]) CheckScriptFailure([ 'vim9script', ! 'var v = 1# comment6', ], 'E15:') CheckScriptSuccess([ *************** *** 2439,2445 **** enddef def Test_finish() ! let lines =<< trim END vim9script g:res = 'one' if v:false | finish | endif --- 2447,2453 ---- enddef def Test_finish() ! var lines =<< trim END vim9script g:res = 'one' if v:false | finish | endif *************** *** 2456,2462 **** enddef def Test_let_func_call() ! let lines =<< trim END vim9script func GetValue() if exists('g:count') --- 2464,2470 ---- enddef def Test_let_func_call() ! var lines =<< trim END vim9script func GetValue() if exists('g:count') *************** *** 2466,2474 **** endif return 'this' endfunc ! let val: string = GetValue() # env var is always a string ! let env = $TERM END writefile(lines, 'Xfinished') source Xfinished --- 2474,2482 ---- endif return 'this' endfunc ! var val: string = GetValue() # env var is always a string ! var env = $TERM END writefile(lines, 'Xfinished') source Xfinished *************** *** 2480,2511 **** enddef def Test_let_missing_type() ! let lines =<< trim END vim9script ! let var = g:unknown END CheckScriptFailure(lines, 'E121:') lines =<< trim END vim9script ! let nr: number = 123 ! let var = nr END CheckScriptSuccess(lines) enddef def Test_let_declaration() ! let lines =<< trim END vim9script ! let var: string ! g:var_uninit = var ! var = 'text' ! g:var_test = var # prefixing s: is optional ! s:var = 'prefixed' ! g:var_prefixed = s:var ! let s:other: number other = 1234 g:other_var = other --- 2488,2519 ---- enddef def Test_let_missing_type() ! var lines =<< trim END vim9script ! var name = g:unknown END CheckScriptFailure(lines, 'E121:') lines =<< trim END vim9script ! var nr: number = 123 ! var name = nr END CheckScriptSuccess(lines) enddef def Test_let_declaration() ! var lines =<< trim END vim9script ! var name: string ! g:var_uninit = name ! name = 'text' ! g:var_test = name # prefixing s: is optional ! s:name = 'prefixed' ! g:var_prefixed = s:name ! var s:other: number other = 1234 g:other_var = other *************** *** 2530,2536 **** enddef def Test_let_declaration_fails() ! let lines =<< trim END vim9script final var: string END --- 2538,2544 ---- enddef def Test_let_declaration_fails() ! var lines =<< trim END vim9script final var: string END *************** *** 2544,2584 **** lines =<< trim END vim9script ! let 9var: string END CheckScriptFailure(lines, 'E475:') enddef def Test_let_type_check() ! let lines =<< trim END vim9script ! let var: string ! var = 1234 END CheckScriptFailure(lines, 'E1012:') lines =<< trim END vim9script ! let var:string END CheckScriptFailure(lines, 'E1069:') lines =<< trim END vim9script ! let var: asdf END CheckScriptFailure(lines, 'E1010:') lines =<< trim END vim9script ! let s:l: list s:l = [] END CheckScriptSuccess(lines) lines =<< trim END vim9script ! let s:d: dict s:d = {} END CheckScriptSuccess(lines) --- 2552,2592 ---- lines =<< trim END vim9script ! var 9var: string END CheckScriptFailure(lines, 'E475:') enddef def Test_let_type_check() ! var lines =<< trim END vim9script ! var name: string ! name = 1234 END CheckScriptFailure(lines, 'E1012:') lines =<< trim END vim9script ! var name:string END CheckScriptFailure(lines, 'E1069:') lines =<< trim END vim9script ! var name: asdf END CheckScriptFailure(lines, 'E1010:') lines =<< trim END vim9script ! var s:l: list s:l = [] END CheckScriptSuccess(lines) lines =<< trim END vim9script ! var s:d: dict s:d = {} END CheckScriptSuccess(lines) *************** *** 2587,2614 **** let g:dict_number = #{one: 1, two: 2} def Test_let_list_dict_type() ! let ll: list ll = [1, 2, 2, 3, 3, 3]->uniq() ll->assert_equal([1, 2, 3]) ! let dd: dict dd = g:dict_number dd->assert_equal(g:dict_number) ! let lines =<< trim END ! let ll: list ll = [1, 2, 3]->map('"one"') END CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list but got list') enddef def Test_forward_declaration() ! let lines =<< trim END vim9script def GetValue(): string return theVal enddef ! let theVal = 'something' g:initVal = GetValue() theVal = 'else' g:laterVal = GetValue() --- 2595,2622 ---- let g:dict_number = #{one: 1, two: 2} def Test_let_list_dict_type() ! var ll: list ll = [1, 2, 2, 3, 3, 3]->uniq() ll->assert_equal([1, 2, 3]) ! var dd: dict dd = g:dict_number dd->assert_equal(g:dict_number) ! var lines =<< trim END ! var ll: list ll = [1, 2, 3]->map('"one"') END CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list but got list') enddef def Test_forward_declaration() ! var lines =<< trim END vim9script def GetValue(): string return theVal enddef ! var theVal = 'something' g:initVal = GetValue() theVal = 'else' g:laterVal = GetValue() *************** *** 2624,2630 **** enddef def Test_source_vim9_from_legacy() ! let legacy_lines =<< trim END source Xvim9_script.vim call assert_false(exists('local')) --- 2632,2638 ---- enddef def Test_source_vim9_from_legacy() ! var legacy_lines =<< trim END source Xvim9_script.vim call assert_false(exists('local')) *************** *** 2645,2655 **** END writefile(legacy_lines, 'Xlegacy_script.vim') ! let vim9_lines =<< trim END vim9script ! let local = 'local' g:global = 'global' ! export let exported = 'exported' export def GetText(): string return 'text' enddef --- 2653,2663 ---- END writefile(legacy_lines, 'Xlegacy_script.vim') ! var vim9_lines =<< trim END vim9script ! var local = 'local' g:global = 'global' ! export var exported = 'exported' export def GetText(): string return 'text' enddef *************** *** 2669,2675 **** " check that items defined in Vim9 script are script-local, not global let vim9lines =<< trim END vim9script ! let var = 'local' func TheFunc() echo 'local' endfunc --- 2677,2683 ---- " check that items defined in Vim9 script are script-local, not global let vim9lines =<< trim END vim9script ! var name = 'local' func TheFunc() echo 'local' endfunc *************** *** 2709,2715 **** " test using a vim9script that is auto-loaded from an autocmd def Test_vim9_autoload() ! let lines =<< trim END vim9script def foo#test() echomsg getreg('"') --- 2717,2723 ---- " test using a vim9script that is auto-loaded from an autocmd def Test_vim9_autoload() ! var lines =<< trim END vim9script def foo#test() echomsg getreg('"') *************** *** 2718,2724 **** mkdir('Xdir/autoload', 'p') writefile(lines, 'Xdir/autoload/foo.vim') ! let save_rtp = &rtp exe 'set rtp^=' .. getcwd() .. '/Xdir' augroup test autocmd TextYankPost * call foo#test() --- 2726,2732 ---- mkdir('Xdir/autoload', 'p') writefile(lines, 'Xdir/autoload/foo.vim') ! var save_rtp = &rtp exe 'set rtp^=' .. getcwd() .. '/Xdir' augroup test autocmd TextYankPost * call foo#test() *************** *** 2735,2741 **** " This was causing a crash because suppress_errthrow wasn't reset. def Test_vim9_autoload_error() ! let lines =<< trim END vim9script def crash#func() try --- 2743,2749 ---- " This was causing a crash because suppress_errthrow wasn't reset. def Test_vim9_autoload_error() ! var lines =<< trim END vim9script def crash#func() try *************** *** 2775,2781 **** def Test_script_var_in_autocmd() # using a script variable from an autocommand, defined in a :def function in a # legacy Vim script, cannot check the variable type. ! let lines =<< trim END let s:counter = 1 def s:Func() au! CursorHold --- 2783,2789 ---- def Test_script_var_in_autocmd() # using a script variable from an autocommand, defined in a :def function in a # legacy Vim script, cannot check the variable type. ! var lines =<< trim END let s:counter = 1 def s:Func() au! CursorHold *************** *** 2793,2809 **** # if the Vim syntax highlighting uses Vim9 constructs they can be used from # the command line window. mkdir('rtp/syntax', 'p') ! let export_lines =<< trim END vim9script ! export let That = 'yes' END writefile(export_lines, 'rtp/syntax/Xexport.vim') ! let import_lines =<< trim END vim9script import That from './Xexport.vim' END writefile(import_lines, 'rtp/syntax/vim.vim') ! let save_rtp = &rtp &rtp = getcwd() .. '/rtp' .. ',' .. &rtp syntax on augroup CmdWin --- 2801,2817 ---- # if the Vim syntax highlighting uses Vim9 constructs they can be used from # the command line window. mkdir('rtp/syntax', 'p') ! var export_lines =<< trim END vim9script ! export var That = 'yes' END writefile(export_lines, 'rtp/syntax/Xexport.vim') ! var import_lines =<< trim END vim9script import That from './Xexport.vim' END writefile(import_lines, 'rtp/syntax/vim.vim') ! var save_rtp = &rtp &rtp = getcwd() .. '/rtp' .. ',' .. &rtp syntax on augroup CmdWin *************** *** 2830,2838 **** enddef def Test_unset_any_variable() ! let lines =<< trim END ! let var: any ! assert_equal(0, var) END CheckDefAndScriptSuccess(lines) enddef --- 2838,2846 ---- enddef def Test_unset_any_variable() ! var lines =<< trim END ! var name: any ! assert_equal(0, name) END CheckDefAndScriptSuccess(lines) enddef *************** *** 2846,2852 **** def Run_Test_define_func_at_command_line() # run in a separate Vim instance to avoid the script context ! let lines =<< trim END func CheckAndQuit() call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') --- 2854,2860 ---- def Run_Test_define_func_at_command_line() # run in a separate Vim instance to avoid the script context ! var lines =<< trim END func CheckAndQuit() call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') *************** *** 2854,2860 **** END writefile([''], 'Xdidcmd') writefile(lines, 'XcallFunc') ! let buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) # define Afunc() on the command line term_sendkeys(buf, ":def Afunc()\Bfunc()\enddef\") term_sendkeys(buf, ":call CheckAndQuit()\") --- 2862,2868 ---- END writefile([''], 'Xdidcmd') writefile(lines, 'XcallFunc') ! var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) # define Afunc() on the command line term_sendkeys(buf, ":def Afunc()\Bfunc()\enddef\") term_sendkeys(buf, ":call CheckAndQuit()\") *************** *** 2874,2880 **** bwipe! # also when the context is Vim9 script ! let lines =<< trim END vim9script new setline(1, 'something') --- 2882,2888 ---- bwipe! # also when the context is Vim9 script ! var lines =<< trim END vim9script new setline(1, 'something') *** ../vim-8.2.1755/src/version.c 2020-09-27 14:22:45.006688671 +0200 --- src/version.c 2020-09-27 15:10:35.323511869 +0200 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 1756, /**/ -- All good vision statements are created by groups of people with bloated bladders who would rather be doing anything else. (Scott Adams - The Dilbert principle) /// 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 ///