diff options
-rw-r--r-- | src/scriptfile.c | 9 | ||||
-rw-r--r-- | src/testdir/test_vim9_import.vim | 42 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9script.c | 25 |
4 files changed, 62 insertions, 16 deletions
diff --git a/src/scriptfile.c b/src/scriptfile.c index cc76260410..54af7597e5 100644 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -1430,8 +1430,13 @@ do_source_buffer_init(source_cookie_T *sp, exarg_T *eap) return NULL; // Use ":source buffer=<num>" as the script name - vim_snprintf((char *)IObuff, IOSIZE, ":source buffer=%d", curbuf->b_fnum); - fname = vim_strsave(IObuff); + if (curbuf->b_ffname != NULL) + fname = vim_strsave(curbuf->b_ffname); + else + { + vim_snprintf((char *)IObuff, IOSIZE, ":source buffer=%d", curbuf->b_fnum); + fname = vim_strsave(IObuff); + } if (fname == NULL) return NULL; diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index b7902f10c0..78383ee79b 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -1140,13 +1140,9 @@ def Test_autoload_import_relative() v9.CheckScriptFailure(lines, 'E484:') enddef +" autoload relative, access from compiled function. +" Github issues: #14565, #14579 def Test_autoload_import_relative_compiled_buffer() - if !has('unix') - # temporary, until it's discovered why the test fails on Windows. - CheckUnix - return - endif - # autoload relative, access from compiled function. #14565, #14579 var lines =<< trim END vim9script @@ -1168,6 +1164,40 @@ def Test_autoload_import_relative_compiled_buffer() new setline(1, lines) :source + # source one more time to detect issues with clearing the script state and + # variables + :source + :bw! +enddef + +" Test for relative import when sourcing a buffer in another directory +def Test_autoload_import_relative_from_buffer_in_dir() + mkdir('Ximportrelative/dir1/dir2', 'pR') + var lines =<< trim END + vim9script + + export def F1(): string + return 'InFile.vim' + enddef + END + writefile(lines, 'Ximportrelative/dir1/dir2/Ximport.vim') + lines =<< trim END + vim9script + + import autoload './Ximport.vim' as xfile + + def F(): string + return xfile.F1() + enddef + assert_equal('InFile.vim', F()) + END + writefile(lines, 'Ximportrelative/dir1/dir2/Xrelative.vim') + + split Ximportrelative/dir1/dir2/Xrelative.vim + :source + # source one more time to detect issues with clearing the script state and + # variables + :source :bw! enddef diff --git a/src/version.c b/src/version.c index ee34063155..9e2acb87e2 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 359, +/**/ 358, /**/ 357, diff --git a/src/vim9script.c b/src/vim9script.c index a64ce72126..3035889649 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -456,15 +456,24 @@ handle_import( scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid); char_u *tail = gettail(si->sn_name); char_u *from_name; + int sourced_from_nofile_buf = FALSE; - // Relative to current script: "./name.vim", "../../name.vim". - len = STRLEN(si->sn_name) - STRLEN(tail) + STRLEN(tv.vval.v_string) + 2; - from_name = alloc((int)len); - if (from_name == NULL) - goto erret; - vim_strncpy(from_name, si->sn_name, tail - si->sn_name); - add_pathsep(from_name); - STRCAT(from_name, tv.vval.v_string); + if (STRNCMP(si->sn_name, ":source buffer=", 15) == 0) + sourced_from_nofile_buf = TRUE; + + if (!sourced_from_nofile_buf) + { + // Relative to current script: "./name.vim", "../../name.vim". + len = STRLEN(si->sn_name) - STRLEN(tail) + STRLEN(tv.vval.v_string) + 2; + from_name = alloc((int)len); + if (from_name == NULL) + goto erret; + vim_strncpy(from_name, si->sn_name, tail - si->sn_name); + add_pathsep(from_name); + STRCAT(from_name, tv.vval.v_string); + } + else + from_name = vim_strsave(tv.vval.v_string); simplify_filename(from_name); res = handle_import_fname(from_name, is_autoload, &sid); |