mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.4447: Vim9: can still use s:var in a compiled function
Problem: Vim9: can still use s:var in a compiled function. Solution: Disallow using s:var for Vim9 script. (closes #9824)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
*vim9.txt* For Vim version 8.2. Last change: 2022 Feb 18
|
*vim9.txt* For Vim version 8.2. Last change: 2022 Feb 22
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -245,9 +245,11 @@ that the name interferes with builtin functions.
|
|||||||
*vim9-s-namespace*
|
*vim9-s-namespace*
|
||||||
The use of the "s:" prefix is not supported at the Vim9 script level. All
|
The use of the "s:" prefix is not supported at the Vim9 script level. All
|
||||||
functions and variables without a prefix are script-local.
|
functions and variables without a prefix are script-local.
|
||||||
In :def functions the use of "s:" is optional. This is because in legacy
|
|
||||||
script the "s:" might be needed. Disallowing the use of "s:" only in a :def
|
In :def functions the use of "s:" depends on the script: Script-local
|
||||||
function in Vim9 script would be a bit confusing.
|
variables and functions in a legacy script do use "s:", while in a Vim9 script
|
||||||
|
they do not use "s:". This matches what you see in the rest of the file.
|
||||||
|
|
||||||
In legacy functions the use of "s:" for script items is required, as before.
|
In legacy functions the use of "s:" for script items is required, as before.
|
||||||
|
|
||||||
In all cases the function must be defined before used. That is when it is
|
In all cases the function must be defined before used. That is when it is
|
||||||
@@ -1467,7 +1469,7 @@ strings: >
|
|||||||
# typename(mylist) == "list<string>", no error
|
# typename(mylist) == "list<string>", no error
|
||||||
|
|
||||||
There is a subtle difference between using a list constant directly and
|
There is a subtle difference between using a list constant directly and
|
||||||
through a variable declaraiton. Because of type inference, when using a list
|
through a variable declaration. Because of type inference, when using a list
|
||||||
constant to initialize a variable, this also sets the declared type: >
|
constant to initialize a variable, this also sets the declared type: >
|
||||||
var mylist = [1, 2, 3]
|
var mylist = [1, 2, 3]
|
||||||
# typename(mylist) == "list<number>"
|
# typename(mylist) == "list<number>"
|
||||||
|
@@ -220,7 +220,7 @@ def Test_assignment()
|
|||||||
enddef
|
enddef
|
||||||
defcompile
|
defcompile
|
||||||
END
|
END
|
||||||
v9.CheckScriptFailure(lines, 'E1089:')
|
v9.CheckScriptFailure(lines, 'E1268:')
|
||||||
|
|
||||||
g:inc_counter += 1
|
g:inc_counter += 1
|
||||||
assert_equal(2, g:inc_counter)
|
assert_equal(2, g:inc_counter)
|
||||||
@@ -2460,6 +2460,49 @@ def Run_Test_declare_command_line()
|
|||||||
g:StopVimInTerminal(buf)
|
g:StopVimInTerminal(buf)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_using_s_var_in_function()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
var scriptlevel = 123
|
||||||
|
def SomeFunc()
|
||||||
|
echo s:scriptlevel
|
||||||
|
enddef
|
||||||
|
SomeFunc()
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1268:')
|
||||||
|
|
||||||
|
# OK in legacy script
|
||||||
|
lines =<< trim END
|
||||||
|
let s:scriptlevel = 123
|
||||||
|
def s:SomeFunc()
|
||||||
|
echo s:scriptlevel
|
||||||
|
enddef
|
||||||
|
call s:SomeFunc()
|
||||||
|
END
|
||||||
|
v9.CheckScriptSuccess(lines)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
var scriptlevel = 123
|
||||||
|
def SomeFunc()
|
||||||
|
s:scriptlevel = 456
|
||||||
|
enddef
|
||||||
|
SomeFunc()
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1268:')
|
||||||
|
|
||||||
|
# OK in legacy script
|
||||||
|
lines =<< trim END
|
||||||
|
let s:scriptlevel = 123
|
||||||
|
def s:SomeFunc()
|
||||||
|
s:scriptlevel = 456
|
||||||
|
enddef
|
||||||
|
call s:SomeFunc()
|
||||||
|
call assert_equal(456, s:scriptlevel)
|
||||||
|
END
|
||||||
|
v9.CheckScriptSuccess(lines)
|
||||||
|
enddef
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4447,
|
||||||
/**/
|
/**/
|
||||||
4446,
|
4446,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1331,6 +1331,12 @@ compile_lhs(
|
|||||||
char_u *rawname = lhs->lhs_name
|
char_u *rawname = lhs->lhs_name
|
||||||
+ (lhs->lhs_name[1] == ':' ? 2 : 0);
|
+ (lhs->lhs_name[1] == ':' ? 2 : 0);
|
||||||
|
|
||||||
|
if (script_namespace && current_script_is_vim9())
|
||||||
|
{
|
||||||
|
semsg(_(e_cannot_use_s_colon_in_vim9_script_str),
|
||||||
|
var_start);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
if (is_decl)
|
if (is_decl)
|
||||||
{
|
{
|
||||||
if (script_namespace)
|
if (script_namespace)
|
||||||
|
@@ -422,8 +422,15 @@ compile_load(
|
|||||||
{
|
{
|
||||||
case 'v': res = generate_LOADV(cctx, name, error);
|
case 'v': res = generate_LOADV(cctx, name, error);
|
||||||
break;
|
break;
|
||||||
case 's': if (is_expr && ASCII_ISUPPER(*name)
|
case 's': if (current_script_is_vim9())
|
||||||
&& find_func(name, FALSE) != NULL)
|
{
|
||||||
|
semsg(_(e_cannot_use_s_colon_in_vim9_script_str),
|
||||||
|
*arg);
|
||||||
|
vim_free(name);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
if (is_expr && ASCII_ISUPPER(*name)
|
||||||
|
&& find_func(name, FALSE) != NULL)
|
||||||
res = generate_funcref(cctx, name, FALSE);
|
res = generate_funcref(cctx, name, FALSE);
|
||||||
else
|
else
|
||||||
res = compile_load_scriptvar(cctx, name,
|
res = compile_load_scriptvar(cctx, name,
|
||||||
|
Reference in New Issue
Block a user