From 6ac69ed9a23fcbccc54574ded1cbab5065e19c41 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 3 Sep 2022 12:09:07 +0100 Subject: [PATCH] patch 9.0.0366: cannot use import->Func() in lambda Problem: Cannot use import->Func() in lambda. (Israel Chauca Fuentes) Solution: Adjust how an expression in a lambda is parsed. (closes #11042) --- src/eval.c | 20 +++++++++++++++++--- src/testdir/test_vim9_import.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/eval.c b/src/eval.c index 2dfe8174ab..b8aa79fe4d 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 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 b688296f36..e844d4a082 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 3d9a9c758c..1c685d1394 100644 --- a/src/version.c +++ b/src/version.c @@ -707,6 +707,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 366, /**/ 365, /**/