]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0975: Vim9: interpolated string expr not working in object methods v9.1.0975
authorYegappan Lakshmanan <yegappan@yahoo.com>
Mon, 30 Dec 2024 08:52:16 +0000 (09:52 +0100)
committerChristian Brabandt <cb@256bit.org>
Mon, 30 Dec 2024 08:52:16 +0000 (09:52 +0100)
Problem:  Vim9: interpolated string expr not working in object methods
          (Igbanam Ogbuluijah)
Solution: Check the evalarg argument (Yegappan Lakshmanan)

fixes: #16317
closes: #16342

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/eval.c
src/testdir/test_vim9_class.vim
src/version.c

index f4f8c058db3aefea2770029c31a0287702214b07..306cfe7f426491125766236630a3aa20153a2f57 100644 (file)
@@ -819,6 +819,8 @@ deref_function_name(
     typval_T   ref;
     char_u     *name = *arg;
     int                save_flags = 0;
+    int                evaluate = evalarg != NULL
+                                     && (evalarg->eval_flags & EVAL_EVALUATE);
 
     ref.v_type = VAR_UNKNOWN;
     if (evalarg != NULL)
@@ -867,7 +869,7 @@ deref_function_name(
            *tofree = name;
        }
     }
-    else
+    else if (evaluate)
     {
        if (verbose)
            semsg(_(e_not_callable_type_str), name);
index 75f1b501db1cd5138fae5e13220cd0a787e80522..309898bb65016b0433f1243204d4ac47c64f32ef 100644 (file)
@@ -11657,4 +11657,46 @@ def Test_mapnew_with_instance_method()
   v9.CheckSourceSuccess(lines)
 enddef
 
+" Test for using an object method in a method call.
+def Test_use_object_method_in_a_method_call()
+  var lines =<< trim END
+    vim9script
+
+    class Foo
+      def Cost(nums: list<number>): number
+        return nums[0] * nums[1]
+      enddef
+
+      def ShowCost(): string
+        var g = [4, 5]
+        return $"Cost is: {g->this.Cost()}"
+      enddef
+    endclass
+
+    var d = Foo.new()
+    assert_equal('Cost is: 20', d.ShowCost())
+  END
+  v9.CheckSourceSuccess(lines)
+
+  # Test for using a non-existing object method in string interpolation
+  lines =<< trim END
+    vim9script
+
+    class Foo
+      def Cost(nums: list<number>): number
+        return nums[0] * nums[1]
+      enddef
+
+      def ShowCost(): string
+        var g = [4, 5]
+        echo $"Cost is: {g->this.NewCost()}"
+      enddef
+    endclass
+
+    var d = Foo.new()
+    d.ShowCost()
+  END
+  v9.CheckSourceFailure(lines, 'E1326: Variable "NewCost" not found in object "Foo"')
+enddef
+
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 3e3d9b29c26b2ea039b3f67c40565235e0c00b1b..ca353c28c85810b95858ea8a4b3e9dd48450a038 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    975,
 /**/
     974,
 /**/