]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1179: not all errors around inheritance are tested v9.0.1179
authorBram Moolenaar <Bram@vim.org>
Wed, 11 Jan 2023 17:59:38 +0000 (17:59 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 11 Jan 2023 17:59:38 +0000 (17:59 +0000)
Problem:    Not all errors around inheritance are tested.
Solution:   Add more tests.  Fix uncovered problems.

src/errors.h
src/testdir/test_vim9_class.vim
src/version.c
src/vim9compile.c
src/vim9expr.c

index 6fa1abb787f94057c72b368b4cd0af461d031346..de1ae4bd0362f3236d7bc6246a7d28e273d826d5 100644 (file)
@@ -3438,4 +3438,6 @@ EXTERN char e_super_must_be_followed_by_dot[]
        INIT(= N_("E1356: \"super\" must be followed by a dot"));
 EXTERN char e_using_super_not_in_class_function[]
        INIT(= N_("E1357: Using \"super\" not in a class function"));
+EXTERN char e_using_super_not_in_child_class[]
+       INIT(= N_("E1358: Using \"super\" not in a child class"));
 #endif
index 220cb7578eff7d8a38066ed91460d46f75d6b8f3..c6da4f49c1f66a9b6fb91c54ad8594842dc588b7 100644 (file)
@@ -838,6 +838,63 @@ def Test_class_extends()
       assert_equal('John: 42', o.ToString())
   END
   v9.CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      class Child
+        this.age: number
+        def ToString(): number
+          return this.age
+        enddef
+        def ToString(): string
+          return this.age
+        enddef
+      endclass
+  END
+  v9.CheckScriptFailure(lines, 'E1355: Duplicate function: ToString')
+
+  lines =<< trim END
+      vim9script
+      class Child
+        this.age: number
+        def ToString(): string
+          return super .ToString() .. ': ' .. this.age
+        enddef
+      endclass
+      var o = Child.new(42)
+      echo o.ToString()
+  END
+  v9.CheckScriptFailure(lines, 'E1356:')
+
+  lines =<< trim END
+      vim9script
+      class Base
+        this.name: string
+        def ToString(): string
+          return this.name
+        enddef
+      endclass
+
+      var age = 42
+      def ToString(): string
+        return super.ToString() .. ': ' .. age
+      enddef
+      echo ToString()
+  END
+  v9.CheckScriptFailure(lines, 'E1357:')
+
+  lines =<< trim END
+      vim9script
+      class Child
+        this.age: number
+        def ToString(): string
+          return super.ToString() .. ': ' .. this.age
+        enddef
+      endclass
+      var o = Child.new(42)
+      echo o.ToString()
+  END
+  v9.CheckScriptFailure(lines, 'E1358:')
 enddef
 
 
index 1c8bf60861ad410c5b87d0ec632ade41e3c76daf..b16a3f7577718ef66d071353e674d08c65019eb7 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1179,
 /**/
     1178,
 /**/
index 9fe850775c8ddb284d42f71796ce065d3bc87806..cc7a3bdc4319ff684b5808137c1abd45e74ea3be 100644 (file)
@@ -49,6 +49,20 @@ lookup_local(char_u *name, size_t len, lvar_T *lvar, cctx_T *cctx)
            && (cctx->ctx_ufunc->uf_flags & (FC_OBJECT|FC_NEW)))
     {
        int is_super = *name == 's';
+       if (is_super)
+       {
+           if (name[5] != '.')
+           {
+               emsg(_(e_super_must_be_followed_by_dot));
+               return FAIL;
+           }
+           if (cctx->ctx_ufunc->uf_class != NULL
+                   && cctx->ctx_ufunc->uf_class->class_extends == NULL)
+           {
+               emsg(_(e_using_super_not_in_child_class));
+               return FAIL;
+           }
+       }
        if (lvar != NULL)
        {
            CLEAR_POINTER(lvar);
index 27f3bc465f4c626bd02fb9b7bd2adb20316583c3..bbf3059e2b00a1f56fac347bac035d0530f66882 100644 (file)
@@ -268,14 +268,14 @@ compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type)
     if (type == &t_super)
     {
        if (cctx->ctx_ufunc == NULL || cctx->ctx_ufunc->uf_class == NULL)
-           emsg(_(e_using_super_not_in_class_function));
-       else
        {
-           is_super = TRUE;
-           cl = cctx->ctx_ufunc->uf_class;
-           // Remove &t_super from the stack.
-           --cctx->ctx_type_stack.ga_len;
+           emsg(_(e_using_super_not_in_class_function));
+           return FAIL;
        }
+       is_super = TRUE;
+       cl = cctx->ctx_ufunc->uf_class;
+       // Remove &t_super from the stack.
+       --cctx->ctx_type_stack.ga_len;
     }
     else if (type->tt_type == VAR_CLASS)
     {
@@ -2261,6 +2261,7 @@ compile_subscript(
            // class constructor: SomeClass.new()
            // object member: someObject.varname, this.varname
            // object method: someObject.SomeMethod(), this.SomeMethod()
+           *arg = p;
            if (compile_class_object_index(cctx, arg, type) == FAIL)
                return FAIL;
        }