0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.3178: Vim9: the file name of an :import cannot be an expression

Problem:    Vim9: the file name of an :import cannot be an expression.
Solution:   Accept an expression that results in a string.  Do not support
            :import in a function.
This commit is contained in:
Bram Moolenaar
2021-07-18 18:21:38 +02:00
parent ad2d4969e1
commit 4db572eeb2
5 changed files with 25 additions and 65 deletions

View File

@@ -412,6 +412,7 @@ handle_import(
garray_T names;
garray_T as_names;
tv.v_type = VAR_UNKNOWN;
ga_init2(&names, sizeof(char_u *), 10);
ga_init2(&as_names, sizeof(char_u *), 10);
if (*arg == '{')
@@ -496,14 +497,14 @@ handle_import(
goto erret;
}
// The name of the file can be an expression, which must evaluate to a
// string.
arg = skipwhite_and_linebreak(arg + 4, evalarg);
tv.v_type = VAR_UNKNOWN;
// TODO: should we accept any expression?
if (*arg == '\'')
ret = eval_lit_string(&arg, &tv, TRUE);
else if (*arg == '"')
ret = eval_string(&arg, &tv, TRUE);
if (ret == FAIL || tv.vval.v_string == NULL || *tv.vval.v_string == NUL)
ret = eval0(arg, &tv, NULL, evalarg);
if (ret == FAIL)
goto erret;
if (tv.v_type != VAR_STRING
|| tv.vval.v_string == NULL || *tv.vval.v_string == NUL)
{
emsg(_(e_invalid_string_after_from));
goto erret;
@@ -524,10 +525,7 @@ handle_import(
len = STRLEN(si->sn_name) - STRLEN(tail) + STRLEN(tv.vval.v_string) + 2;
from_name = alloc((int)len);
if (from_name == NULL)
{
clear_tv(&tv);
goto erret;
}
vim_strncpy(from_name, si->sn_name, tail - si->sn_name);
add_pathsep(from_name);
STRCAT(from_name, tv.vval.v_string);
@@ -550,7 +548,6 @@ handle_import(
from_name = alloc((int)len);
if (from_name == NULL)
{
clear_tv(&tv);
goto erret;
}
vim_snprintf((char *)from_name, len, "import/%s", tv.vval.v_string);
@@ -561,10 +558,8 @@ handle_import(
if (res == FAIL || sid <= 0)
{
semsg(_(e_could_not_import_str), tv.vval.v_string);
clear_tv(&tv);
goto erret;
}
clear_tv(&tv);
if (*arg_start == '*')
{
@@ -669,6 +664,7 @@ handle_import(
}
}
erret:
clear_tv(&tv);
ga_clear_strings(&names);
ga_clear_strings(&as_names);
return cmd_end;