patch 9.0.0366: cannot use import->Func() in lambda v9.0.0366
authorBram Moolenaar <Bram@vim.org>
Sat, 3 Sep 2022 11:09:07 +0000 (12:09 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 3 Sep 2022 11:09:07 +0000 (12:09 +0100)
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
src/testdir/test_vim9_import.vim
src/version.c

index 2dfe8174ab0adeb25e20fe3c3e3a4462ce385792..b8aa79fe4dfafbe5966e90c0cd2d6186e991adb8 100644 (file)
@@ -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;
 
index b688296f36b7789f2537333cabfd7844309aaa40..e844d4a0827fb8807997bb5de615d0ba17f02ec4 100644 (file)
@@ -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
index 3d9a9c758c001101500cbaabef16cb6f29eb04e8..1c685d1394741d2a7d5f08e2b932d5201e6de383 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    366,
 /**/
     365,
 /**/