]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2182: Vim9: need a way to reserve future extension v9.0.2182
authorYegappan Lakshmanan <yegappan@yahoo.com>
Thu, 21 Dec 2023 15:46:18 +0000 (16:46 +0100)
committerChristian Brabandt <cb@256bit.org>
Thu, 21 Dec 2023 15:46:18 +0000 (16:46 +0100)
Problem:  Vim9: need a way to reserve future extension
Solution: reserve double underscore prefix for future use
          (Yegappan Lakshmanan)

related: #13238
closes: #13742

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

index 4dc67bd8723fea6e0b5ac77cca0228e36ff5834b..929597c70bf81d681ffe076bd1cca1ead29a2a57 100644 (file)
@@ -364,6 +364,9 @@ super class.  Depending on the class where the member is used the
 corresponding class member will be used.  The type of the class member in a
 child class can be different from that in the super class.
 
+The double underscore (__) prefix for a class or object method name is
+reserved for future use.
+
                                        *object-final-variable* *E1409*
 The |:final| keyword can be used to make a class or object variable a
 constant.  Examples: >
index c28716aa1bd57361485c2e24dbf65843108dacd1..e2c61b03b7b98dd2f3c2a477ae8f38856b0b4382 100644 (file)
@@ -9659,4 +9659,31 @@ def Test_const_class_object_variable()
   v9.CheckSourceFailure(lines, 'E1022: Type or initialization required', 3)
 enddef
 
+" Test for using double underscore prefix in a class/object method name.
+def Test_method_double_underscore_prefix()
+  # class method
+  var lines =<< trim END
+    vim9script
+    class A
+      static def __foo()
+        echo "foo"
+      enddef
+    endclass
+    defcompile
+  END
+  v9.CheckSourceFailure(lines, 'E1034: Cannot use reserved name __foo()', 3)
+
+  # object method
+  lines =<< trim END
+    vim9script
+    class A
+      def __foo()
+        echo "foo"
+      enddef
+    endclass
+    defcompile
+  END
+  v9.CheckSourceFailure(lines, 'E1034: Cannot use reserved name __foo()', 3)
+enddef
+
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 316e638920303ffe229c517c2a2e93c65a45a951..6120c538a7cc819ba66c9a4d146b32a6bfeee975 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2182,
 /**/
     2181,
 /**/
index ec1bb86d09d79a57690924f1168a76d57a700057..e5d9aeb4baa0ddc6de089fa7a674632a93d1af6e 100644 (file)
@@ -1774,6 +1774,15 @@ early_ret:
                break;
            }
 
+           if (*p == '_' && *(p + 1) == '_')
+           {
+               // double underscore prefix for a method name is currently
+               // reserved.  This could be used in the future to support
+               // object methods called by Vim builtin functions.
+               semsg(_(e_cannot_use_reserved_name_str), p);
+               break;
+           }
+
            CLEAR_FIELD(ea);
            ea.cmd = line;
            ea.arg = p;
index 17a3b6a5c336a175a019e057dfcd79e2bdc4160f..868acb46982739c12181a4d777ff3252081f80ae 100644 (file)
@@ -2263,12 +2263,12 @@ compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx)
        // "this.value": load "this" object and get the value at index for an
        // object or class member get the type of the member.
        // Also for "obj.value".
-       char_u *dot = vim_strchr(var_start, '.');
-       if (dot == NULL)
-       {
-          semsg(_(e_missing_dot_after_object_str), lhs->lhs_name);
-          return FAIL;
-       }
+       char_u *dot = vim_strchr(var_start, '.');
+       if (dot == NULL)
+       {
+           semsg(_(e_missing_dot_after_object_str), lhs->lhs_name);
+           return FAIL;
+       }
 
        class_T *cl = lhs->lhs_type->tt_class;
        type_T  *type = oc_member_type(cl, TRUE, dot + 1,
@@ -2295,12 +2295,12 @@ compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx)
     else if (lhs->lhs_type->tt_type == VAR_CLASS)
     {
        // "<classname>.value": load class variable "classname.value"
-       char_u *dot = vim_strchr(var_start, '.');
-       if (dot == NULL)
-       {
-          check_type_is_value(lhs->lhs_type);
-          return FAIL;
-       }
+       char_u *dot = vim_strchr(var_start, '.');
+       if (dot == NULL)
+       {
+           check_type_is_value(lhs->lhs_type);
+           return FAIL;
+       }
 
        class_T *cl = lhs->lhs_type->tt_class;
        ocmember_T *m = class_member_lookup(cl, dot + 1,