summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-09-03 12:09:07 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-03 12:09:07 +0100
commit6ac69ed9a23fcbccc54574ded1cbab5065e19c41 (patch)
tree933e6d9b26eaa6665da58cfc72c47fc765861fb7
parent91a874eb88eff2df9b8fdd64ccf98eed337823cf (diff)
downloadvim-git-6ac69ed9a23fcbccc54574ded1cbab5065e19c41.tar.gz
patch 9.0.0366: cannot use import->Func() in lambdav9.0.0366
Problem: Cannot use import->Func() in lambda. (Israel Chauca Fuentes) Solution: Adjust how an expression in a lambda is parsed. (closes #11042)
-rw-r--r--src/eval.c20
-rw-r--r--src/testdir/test_vim9_import.vim22
-rw-r--r--src/version.c2
3 files changed, 41 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c
index 2dfe8174a..b8aa79fe4 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -694,8 +694,15 @@ deref_function_name(
{
typval_T ref;
char_u *name = *arg;
+ int save_flags;
ref.v_type = VAR_UNKNOWN;
+ if (evalarg != NULL)
+ {
+ // need to evaluate this to get an import, like in "a.Func"
+ save_flags = evalarg->eval_flags;
+ evalarg->eval_flags |= EVAL_EVALUATE;
+ }
if (eval9(arg, &ref, evalarg, FALSE) == FAIL)
{
dictitem_T *v;
@@ -703,7 +710,10 @@ deref_function_name(
// If <SID>VarName was used it would not be found, try another way.
v = find_var_also_in_script(name, NULL, FALSE);
if (v == NULL)
- return NULL;
+ {
+ name = NULL;
+ goto theend;
+ }
copy_tv(&v->di_tv, &ref);
}
if (*skipwhite(*arg) != NUL)
@@ -739,7 +749,11 @@ deref_function_name(
semsg(_(e_not_callable_type_str), name);
name = NULL;
}
+
+theend:
clear_tv(&ref);
+ if (evalarg != NULL)
+ evalarg->eval_flags = save_flags;
return name;
}
@@ -4080,7 +4094,7 @@ eval9(
// Handle following '[', '(' and '.' for expr[expr], expr.name,
// expr(expr), expr->name(expr)
if (ret == OK)
- ret = handle_subscript(arg, name_start, rettv, evalarg, TRUE);
+ ret = handle_subscript(arg, name_start, rettv, evalarg, evaluate);
/*
* Apply logical NOT and unary '-', from right to left, ignore '+'.
@@ -4349,7 +4363,7 @@ eval_method(
rettv->v_type = VAR_UNKNOWN;
name = *arg;
- len = get_name_len(arg, &alias, evaluate, TRUE);
+ len = get_name_len(arg, &alias, evaluate, evaluate);
if (alias != NULL)
name = alias;
diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim
index b688296f3..e844d4a08 100644
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -1454,6 +1454,28 @@ def Run_Test_import_in_spellsuggest_expr()
set nospell spellsuggest& verbose=0
enddef
+def Test_import_in_lambda_method()
+ var lines =<< trim END
+ vim9script
+ export def Retarg(e: any): any
+ return e
+ enddef
+ END
+ writefile(lines, 'XexportRetarg.vim')
+ lines =<< trim END
+ vim9script
+ import './XexportRetarg.vim'
+ def Lambda(): string
+ var F = (x) => x->XexportRetarg.Retarg()
+ return F('arg')
+ enddef
+ assert_equal('arg', Lambda())
+ END
+ v9.CheckScriptSuccess(lines)
+
+ delete('XexportRetarg.vim')
+enddef
+
def Test_export_shadows_global_function()
mkdir('Xglobdir/autoload', 'p')
var save_rtp = &rtp
diff --git a/src/version.c b/src/version.c
index 3d9a9c758..1c685d139 100644
--- a/src/version.c
+++ b/src/version.c
@@ -708,6 +708,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 366,
+/**/
365,
/**/
364,