]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1279: Vim9: null_object and null_class are no reserved names v9.1.1279
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sat, 5 Apr 2025 14:00:22 +0000 (16:00 +0200)
committerChristian Brabandt <cb@256bit.org>
Sat, 5 Apr 2025 14:03:27 +0000 (16:03 +0200)
Problem:  Vim9: null_object and null_class are no reserved names
Solution: Add null_object and null_class as reserved names.
          (Yegappan Lakshmanan)

closes: #17054

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

index 7ba91e7d927207ed95533380722b9933e09e56c1..5d6f7fca184ebdc281aa067e8e3de5ea4480be97 100644 (file)
@@ -1,4 +1,4 @@
-*vim9class.txt*        For Vim version 9.1.  Last change: 2025 Feb 16
+*vim9class.txt*        For Vim version 9.1.  Last change: 2025 Apr 05
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -641,8 +641,8 @@ class, then the type of the variable is set.
 
 The following reserved keyword names cannot be used as an object or class
 variable name: "super", "this", "true", "false", "null", "null_blob",
-"null_dict", "null_function", "null_list", "null_partial", "null_string",
-"null_channel" and "null_job".
+"null_channel", "null_class", "null_dict", "null_function", "null_job",
+"null_list", "null_object", "null_partial" and "null_string".
 
 Extending a class ~
                                                        *extends*
index 97c11a740dd5f0089f84708091b481f1d9af6632..2294936ec39eaf1db452a6fac553dd27b9504adf 100644 (file)
@@ -326,6 +326,8 @@ def Test_reserved_name()
                'null_list',
                'null_partial',
                'null_string',
+               'null_object',
+               'null_class',
                ] + more_names
     v9.CheckDefExecAndScriptFailure(['var ' .. name .. ' =  0'], 'E1034:')
     v9.CheckDefExecAndScriptFailure(['var ' .. name .. ': bool'], 'E1034:')
index 883367da10a7577ce7b6a9703ae756f900166924..eba6725deda7b0e662cb423149cd2ab5599e9f99 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1279,
 /**/
     1278,
 /**/
index cdacf0b2300cc0adc1d6b5eb2b0c0d9007845ad0..7e33770a041d7059a72612f6ecc357138fbd965e 100644 (file)
@@ -1119,36 +1119,52 @@ check_script_var_type(
 }
 
 // words that cannot be used as a variable
+// Keep this array sorted, as bsearch() is used to search this array.
 static char *reserved[] = {
-    "true",
     "false",
     "null",
     "null_blob",
+    "null_channel",
+    "null_class",
     "null_dict",
     "null_function",
+    "null_job",
     "null_list",
-    "null_tuple",
+    "null_object",
     "null_partial",
     "null_string",
-    "null_channel",
-    "null_job",
+    "null_tuple",
     "super",
     "this",
-    NULL
+    "true",
 };
 
+/*
+ * String compare function used for bsearch()
+ */
+    static int
+comp_names(const void *s1, const void *s2)
+{
+    return STRCMP(*(char **)s1, *(char **)s2);
+}
+
+/*
+ * Returns OK if "name" is not a reserved keyword.  Otherwise returns FAIL.
+ */
     int
 check_reserved_name(char_u *name, int is_objm_access)
 {
-    int idx;
+    // "this" can be used in an object method
+    if (is_objm_access && STRCMP("this", name) == 0)
+       return OK;
+
+    if (bsearch(&name, reserved, ARRAY_LENGTH(reserved),
+                               sizeof(reserved[0]), comp_names) != NULL)
+    {
+       semsg(_(e_cannot_use_reserved_name_str), name);
+       return FAIL;
+    }
 
-    for (idx = 0; reserved[idx] != NULL; ++idx)
-       if (STRCMP(reserved[idx], name) == 0
-               && !(STRCMP("this", name) == 0 && is_objm_access))
-       {
-           semsg(_(e_cannot_use_reserved_name_str), name);
-           return FAIL;
-       }
     return OK;
 }
 
index a90c0cc1c2be97ea6016fc277e87ae5e7ed776dc..ab5e0775286f70cac179e4cf2d638c57a3461852 100644 (file)
@@ -333,6 +333,9 @@ tuple_type_add_types(
     return OK;
 }
 
+/*
+ * Get a list type, based on the member item type in "member_type".
+ */
     type_T *
 get_list_type(type_T *member_type, garray_T *type_gap)
 {
@@ -367,9 +370,7 @@ get_list_type(type_T *member_type, garray_T *type_gap)
  * "tuple_types_ga".
  */
     type_T *
-get_tuple_type(
-    garray_T   *tuple_types_gap,
-    garray_T   *type_gap)
+get_tuple_type(garray_T *tuple_types_gap, garray_T *type_gap)
 {
     type_T     *type;
     type_T     **tuple_types = tuple_types_gap->ga_data;
@@ -397,6 +398,9 @@ get_tuple_type(
     return type;
 }
 
+/*
+ * Get a dict type, based on the member item type in "member_type".
+ */
     type_T *
 get_dict_type(type_T *member_type, garray_T *type_gap)
 {