@@ -173,6 +173,24 @@ free_imports_and_script_vars(int sid)
173173 clear_type_list (& si -> sn_type_list );
174174}
175175
176+ /*
177+ * Mark all imports as possible to redefine. Used when a script is loaded
178+ * again but not cleared.
179+ */
180+ void
181+ mark_imports_for_reload (int sid )
182+ {
183+ scriptitem_T * si = SCRIPT_ITEM (sid );
184+ int idx ;
185+
186+ for (idx = 0 ; idx < si -> sn_imports .ga_len ; ++ idx )
187+ {
188+ imported_T * imp = ((imported_T * )si -> sn_imports .ga_data ) + idx ;
189+
190+ imp -> imp_flags |= IMP_FLAGS_RELOAD ;
191+ }
192+ }
193+
176194/*
177195 * ":import Item from 'filename'"
178196 * ":import Item as Alias from 'filename'"
@@ -459,15 +477,29 @@ handle_import(
459477
460478 if (* arg_start == '*' )
461479 {
462- imported_T * imported = new_imported (gap != NULL ? gap
463- : & SCRIPT_ITEM (import_sid )-> sn_imports );
480+ imported_T * imported ;
464481
482+ imported = find_imported (as_name , STRLEN (as_name ), cctx );
483+ if (imported != NULL && imported -> imp_sid == sid )
484+ {
485+ if (imported -> imp_flags & IMP_FLAGS_RELOAD )
486+ // import already defined on a previous script load
487+ imported -> imp_flags &= ~IMP_FLAGS_RELOAD ;
488+ else
489+ {
490+ semsg (_ (e_name_already_defined_str ), as_name );
491+ goto erret ;
492+ }
493+ }
494+
495+ imported = new_imported (gap != NULL ? gap
496+ : & SCRIPT_ITEM (import_sid )-> sn_imports );
465497 if (imported == NULL )
466498 goto erret ;
467499 imported -> imp_name = as_name ;
468500 as_name = NULL ;
469501 imported -> imp_sid = sid ;
470- imported -> imp_all = TRUE ;
502+ imported -> imp_flags = IMP_FLAGS_STAR ;
471503 }
472504 else
473505 {
@@ -479,6 +511,7 @@ handle_import(
479511 for (i = 0 ; i < names .ga_len ; ++ i )
480512 {
481513 char_u * name = ((char_u * * )names .ga_data )[i ];
514+ size_t len = STRLEN (name );
482515 int idx ;
483516 imported_T * imported ;
484517 ufunc_T * ufunc = NULL ;
@@ -489,28 +522,47 @@ handle_import(
489522 if (idx < 0 && ufunc == NULL )
490523 goto erret ;
491524
492- if (check_defined (name , STRLEN (name ), cctx ) == FAIL )
493- goto erret ;
494-
495- imported = new_imported (gap != NULL ? gap
496- : & SCRIPT_ITEM (import_sid )-> sn_imports );
497- if (imported == NULL )
498- goto erret ;
499-
500- // TODO: check for "as" following
501- // imported->imp_name = vim_strsave(as_name);
502- imported -> imp_name = name ;
503- ((char_u * * )names .ga_data )[i ] = NULL ;
504- imported -> imp_sid = sid ;
505- if (idx >= 0 )
525+ // If already imported with the same propertis and the
526+ // IMP_FLAGS_RELOAD set then we keep that entry. Otherwise create
527+ // a new one (and give an error for an existing import).
528+ imported = find_imported (name , len , cctx );
529+ if (imported != NULL
530+ && (imported -> imp_flags & IMP_FLAGS_RELOAD )
531+ && imported -> imp_sid == sid
532+ && (idx >= 0
533+ ? (equal_type (imported -> imp_type , type )
534+ && imported -> imp_var_vals_idx == idx )
535+ : (equal_type (imported -> imp_type , ufunc -> uf_func_type )
536+ && STRCMP (imported -> imp_funcname ,
537+ ufunc -> uf_name ) == 0 )))
506538 {
507- imported -> imp_type = type ;
508- imported -> imp_var_vals_idx = idx ;
539+ imported -> imp_flags &= ~IMP_FLAGS_RELOAD ;
509540 }
510541 else
511542 {
512- imported -> imp_type = ufunc -> uf_func_type ;
513- imported -> imp_funcname = ufunc -> uf_name ;
543+ if (check_defined (name , len , cctx ) == FAIL )
544+ goto erret ;
545+
546+ imported = new_imported (gap != NULL ? gap
547+ : & SCRIPT_ITEM (import_sid )-> sn_imports );
548+ if (imported == NULL )
549+ goto erret ;
550+
551+ // TODO: check for "as" following
552+ // imported->imp_name = vim_strsave(as_name);
553+ imported -> imp_name = name ;
554+ ((char_u * * )names .ga_data )[i ] = NULL ;
555+ imported -> imp_sid = sid ;
556+ if (idx >= 0 )
557+ {
558+ imported -> imp_type = type ;
559+ imported -> imp_var_vals_idx = idx ;
560+ }
561+ else
562+ {
563+ imported -> imp_type = ufunc -> uf_func_type ;
564+ imported -> imp_funcname = ufunc -> uf_name ;
565+ }
514566 }
515567 }
516568 }
0 commit comments