0
0
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:
Bram Moolenaar
2022-01-08 17:03:55 +00:00
parent 04935fb17e
commit 7c24dfddc2
4 changed files with 51 additions and 31 deletions

View File

@@ -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"));

View File

@@ -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')

View File

@@ -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,
/**/ /**/

View File

@@ -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;