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:
@@ -374,6 +374,8 @@ handle_import(
|
||||
int sid = -1;
|
||||
int res;
|
||||
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
|
||||
// string.
|
||||
@@ -440,6 +442,24 @@ handle_import(
|
||||
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.
|
||||
nextarg = eval_next_non_blank(expr_end, evalarg, &getnext);
|
||||
if (STRNCMP("as", nextarg, 2) == 0 && IS_WHITE_OR_NUL(nextarg[2]))
|
||||
@@ -494,22 +514,16 @@ handle_import(
|
||||
imported_T *imported;
|
||||
|
||||
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);
|
||||
goto erret;
|
||||
}
|
||||
semsg(_(e_name_already_defined_str), as_name);
|
||||
goto erret;
|
||||
}
|
||||
else if (check_defined(as_name, STRLEN(as_name), cctx, FALSE) == FAIL)
|
||||
else if (imported == NULL
|
||||
&& check_defined(as_name, STRLEN(as_name), cctx, FALSE) == FAIL)
|
||||
goto erret;
|
||||
|
||||
imported = new_imported(gap != NULL ? gap
|
||||
: &SCRIPT_ITEM(import_sid)->sn_imports);
|
||||
imported = new_imported(import_gap);
|
||||
if (imported == NULL)
|
||||
goto erret;
|
||||
imported->imp_name = as_name;
|
||||
|
Reference in New Issue
Block a user