mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.4044: Vim9: no error when importing the same script twice
Problem: Vim9: no error when importing the same script twice. Solution: Give an error, unless it is a reload.
This commit is contained in:
@@ -2891,3 +2891,5 @@ EXTERN char e_cannot_unlet_imported_item_str[]
|
|||||||
INIT(= N_("E1260: Cannot unlet an imported item: %s"));
|
INIT(= N_("E1260: Cannot unlet an imported item: %s"));
|
||||||
EXTERN char e_cannot_import_dot_vim_without_using_as[]
|
EXTERN char e_cannot_import_dot_vim_without_using_as[]
|
||||||
INIT(= N_("E1261: Cannot import .vim without using \"as\""));
|
INIT(= N_("E1261: Cannot import .vim without using \"as\""));
|
||||||
|
EXTERN char e_cannot_import_same_script_twice_str[]
|
||||||
|
INIT(= N_("E1262: Cannot import the same script twice: %s"));
|
||||||
|
@@ -189,25 +189,15 @@ def Test_vim9_import_export()
|
|||||||
writefile(import_star_as_lines_dot_space, 'Ximport.vim')
|
writefile(import_star_as_lines_dot_space, 'Ximport.vim')
|
||||||
assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
|
assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
|
||||||
|
|
||||||
var import_func_duplicated =<< trim END
|
writefile(s:export_script_lines, 'Xexport2.vim')
|
||||||
|
var import_as_duplicated =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
import './Xexport.vim' as expo
|
import './Xexport.vim' as expo
|
||||||
import './Xexport.vim' as expo
|
import './Xexport2.vim' as expo
|
||||||
|
|
||||||
ExportedInc()
|
|
||||||
END
|
END
|
||||||
writefile(import_func_duplicated, 'Ximport.vim')
|
writefile(import_as_duplicated, 'Ximport.vim')
|
||||||
assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
|
assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
|
||||||
|
delete('Xexport2.vim')
|
||||||
var import_star_as_duplicated =<< trim END
|
|
||||||
vim9script
|
|
||||||
import './Xexport.vim' as Export
|
|
||||||
var some = 'other'
|
|
||||||
import './Xexport.vim' as Export
|
|
||||||
defcompile
|
|
||||||
END
|
|
||||||
writefile(import_star_as_duplicated, 'Ximport.vim')
|
|
||||||
assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
|
|
||||||
|
|
||||||
var import_star_as_lines_script_no_dot =<< trim END
|
var import_star_as_lines_script_no_dot =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@@ -429,12 +419,21 @@ def Test_import_fails()
|
|||||||
export var Ref = TheFunc
|
export var Ref = TheFunc
|
||||||
END
|
END
|
||||||
writefile([], 'Xthat.vim')
|
writefile([], 'Xthat.vim')
|
||||||
|
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
import './Xthat.vim' as That
|
import './Xthat.vim' as That
|
||||||
That()
|
That()
|
||||||
END
|
END
|
||||||
CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
|
CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
import './Xthat.vim' as one
|
||||||
|
import './Xthat.vim' as two
|
||||||
|
END
|
||||||
|
CheckScriptFailure(lines, 'E1262:')
|
||||||
|
|
||||||
|
delete('Xthat.vim')
|
||||||
|
|
||||||
mkdir('Ximport')
|
mkdir('Ximport')
|
||||||
|
|
||||||
writefile(['vim9script'], 'Ximport/.vim')
|
writefile(['vim9script'], 'Ximport/.vim')
|
||||||
@@ -773,7 +772,14 @@ def Test_vim9_funcref()
|
|||||||
g:result = Xsort.FastSort()
|
g:result = Xsort.FastSort()
|
||||||
enddef
|
enddef
|
||||||
Test()
|
Test()
|
||||||
|
END
|
||||||
|
writefile(lines, 'Xscript.vim')
|
||||||
|
source Xscript.vim
|
||||||
|
assert_equal([4, 3, 2, 1, 0], g:result)
|
||||||
|
unlet g:result
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
# using a function imported with "as"
|
# using a function imported with "as"
|
||||||
import './Xsort.vim' as anAlias
|
import './Xsort.vim' as anAlias
|
||||||
assert_equal('yes', anAlias.GetString('yes'))
|
assert_equal('yes', anAlias.GetString('yes'))
|
||||||
@@ -790,10 +796,6 @@ def Test_vim9_funcref()
|
|||||||
END
|
END
|
||||||
writefile(lines, 'Xscript.vim')
|
writefile(lines, 'Xscript.vim')
|
||||||
|
|
||||||
source Xscript.vim
|
|
||||||
assert_equal([4, 3, 2, 1, 0], g:result)
|
|
||||||
|
|
||||||
unlet g:result
|
|
||||||
delete('Xsort.vim')
|
delete('Xsort.vim')
|
||||||
delete('Xscript.vim')
|
delete('Xscript.vim')
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
4044,
|
||||||
/**/
|
/**/
|
||||||
4043,
|
4043,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -374,6 +374,8 @@ handle_import(
|
|||||||
int sid = -1;
|
int sid = -1;
|
||||||
int res;
|
int res;
|
||||||
long start_lnum = SOURCING_LNUM;
|
long start_lnum = SOURCING_LNUM;
|
||||||
|
garray_T *import_gap;
|
||||||
|
int i;
|
||||||
|
|
||||||
// The name of the file can be an expression, which must evaluate to a
|
// The name of the file can be an expression, which must evaluate to a
|
||||||
// string.
|
// string.
|
||||||
@@ -440,6 +442,24 @@ handle_import(
|
|||||||
goto erret;
|
goto erret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import_gap = gap != NULL ? gap : &SCRIPT_ITEM(import_sid)->sn_imports;
|
||||||
|
for (i = 0; i < import_gap->ga_len; ++i)
|
||||||
|
{
|
||||||
|
imported_T *import = (imported_T *)import_gap->ga_data + i;
|
||||||
|
|
||||||
|
if (import->imp_sid == sid)
|
||||||
|
{
|
||||||
|
if (import->imp_flags & IMP_FLAGS_RELOAD)
|
||||||
|
{
|
||||||
|
// encountering same script first ime on a reload is OK
|
||||||
|
import->imp_flags &= ~IMP_FLAGS_RELOAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
semsg(_(e_cannot_import_same_script_twice_str), tv.vval.v_string);
|
||||||
|
goto erret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Allow for the "as Name" to be in the next line.
|
// Allow for the "as Name" to be in the next line.
|
||||||
nextarg = eval_next_non_blank(expr_end, evalarg, &getnext);
|
nextarg = eval_next_non_blank(expr_end, evalarg, &getnext);
|
||||||
if (STRNCMP("as", nextarg, 2) == 0 && IS_WHITE_OR_NUL(nextarg[2]))
|
if (STRNCMP("as", nextarg, 2) == 0 && IS_WHITE_OR_NUL(nextarg[2]))
|
||||||
@@ -494,22 +514,16 @@ handle_import(
|
|||||||
imported_T *imported;
|
imported_T *imported;
|
||||||
|
|
||||||
imported = find_imported(as_name, STRLEN(as_name), cctx);
|
imported = find_imported(as_name, STRLEN(as_name), cctx);
|
||||||
if (imported != NULL && imported->imp_sid == sid)
|
if (imported != NULL && imported->imp_sid != sid)
|
||||||
{
|
|
||||||
if (imported->imp_flags & IMP_FLAGS_RELOAD)
|
|
||||||
// import already defined on a previous script load
|
|
||||||
imported->imp_flags &= ~IMP_FLAGS_RELOAD;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
semsg(_(e_name_already_defined_str), as_name);
|
semsg(_(e_name_already_defined_str), as_name);
|
||||||
goto erret;
|
goto erret;
|
||||||
}
|
}
|
||||||
}
|
else if (imported == NULL
|
||||||
else if (check_defined(as_name, STRLEN(as_name), cctx, FALSE) == FAIL)
|
&& check_defined(as_name, STRLEN(as_name), cctx, FALSE) == FAIL)
|
||||||
goto erret;
|
goto erret;
|
||||||
|
|
||||||
imported = new_imported(gap != NULL ? gap
|
imported = new_imported(import_gap);
|
||||||
: &SCRIPT_ITEM(import_sid)->sn_imports);
|
|
||||||
if (imported == NULL)
|
if (imported == NULL)
|
||||||
goto erret;
|
goto erret;
|
||||||
imported->imp_name = as_name;
|
imported->imp_name = as_name;
|
||||||
|
Reference in New Issue
Block a user