comparison src/testdir/test_vim9_class.vim @ 33343:41b50abddeea v9.0.1935

patch 9.0.1935: Vim9: not consistent error messages Commit: https://github.com/vim/vim/commit/7fe8f43f49f4fa6f024d0e0ea76d3df5b62a0879 Author: RestorerZ <restorer@mail2k.ru> Date: Sun Sep 24 23:21:24 2023 +0200 patch 9.0.1935: Vim9: not consistent error messages Problem: Vim9: not consistent error messages Solution: Make error messages more consistent. Use "variable" for (object/class) member closes: #13155 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: RestorerZ <restorer@mail2k.ru>
author Christian Brabandt <cb@256bit.org>
date Sun, 24 Sep 2023 23:30:06 +0200
parents 19b4f85c2649
children 3e9a91624b40
comparison
equal deleted inserted replaced
33342:bc1076074f49 33343:41b50abddeea
130 this.state = 0 130 this.state = 0
131 enddef 131 enddef
132 endclass 132 endclass
133 var obj = Something.new() 133 var obj = Something.new()
134 END 134 END
135 v9.CheckSourceFailure(lines, 'E1326: Member not found on object "Something": state') 135 v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Something": state')
136 136
137 # Space before ":" in a member variable declaration 137 # Space before ":" in a member variable declaration
138 lines =<< trim END 138 lines =<< trim END
139 vim9script 139 vim9script
140 class Something 140 class Something
561 561
562 var inner_obj = Inner.new('a') 562 var inner_obj = Inner.new('a')
563 var outer_obj = Outer.new(inner_obj) 563 var outer_obj = Outer.new(inner_obj)
564 F(outer_obj) 564 F(outer_obj)
565 END 565 END
566 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _value') 566 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _value')
567 567
568 # Try modifying a non-existing variable using an "any" object 568 # Try modifying a non-existing variable using an "any" object
569 lines =<< trim END 569 lines =<< trim END
570 vim9script 570 vim9script
571 571
583 583
584 var inner_obj = Inner.new('a') 584 var inner_obj = Inner.new('a')
585 var outer_obj = Outer.new(inner_obj) 585 var outer_obj = Outer.new(inner_obj)
586 F(outer_obj) 586 F(outer_obj)
587 END 587 END
588 v9.CheckSourceFailure(lines, 'E1326: Member not found on object "Inner": someval') 588 v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Inner": someval')
589 enddef 589 enddef
590 590
591 " Nested assignment to a object variable which is of another class type 591 " Nested assignment to a object variable which is of another class type
592 def Test_assignment_nested_type() 592 def Test_assignment_nested_type()
593 var lines =<< trim END 593 var lines =<< trim END
1007 vim9script 1007 vim9script
1008 class A 1008 class A
1009 this.value: void 1009 this.value: void
1010 endclass 1010 endclass
1011 END 1011 END
1012 v9.CheckSourceFailure(lines, 'E1330: Invalid type for object member: void') 1012 v9.CheckSourceFailure(lines, 'E1330: Invalid type for object variable: void')
1013 enddef 1013 enddef
1014 1014
1015 " Test for instance variable access 1015 " Test for instance variable access
1016 def Test_instance_variable_access() 1016 def Test_instance_variable_access()
1017 var lines =<< trim END 1017 var lines =<< trim END
1152 class A 1152 class A
1153 public this.val = 1 1153 public this.val = 1
1154 endclass 1154 endclass
1155 A.val = 1 1155 A.val = 1
1156 END 1156 END
1157 v9.CheckSourceFailure(lines, 'E1376: Object member "val" accessible only using class "A" object') 1157 v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object')
1158 1158
1159 # Read a instance variable using the class name in the script context 1159 # Read a instance variable using the class name in the script context
1160 lines =<< trim END 1160 lines =<< trim END
1161 vim9script 1161 vim9script
1162 class A 1162 class A
1163 public this.val = 1 1163 public this.val = 1
1164 endclass 1164 endclass
1165 var i = A.val 1165 var i = A.val
1166 END 1166 END
1167 v9.CheckSourceFailure(lines, 'E1376: Object member "val" accessible only using class "A" object') 1167 v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object')
1168 1168
1169 # Modify a instance variable using the class name in a def function 1169 # Modify a instance variable using the class name in a def function
1170 lines =<< trim END 1170 lines =<< trim END
1171 vim9script 1171 vim9script
1172 class A 1172 class A
1175 def T() 1175 def T()
1176 A.val = 1 1176 A.val = 1
1177 enddef 1177 enddef
1178 T() 1178 T()
1179 END 1179 END
1180 v9.CheckSourceFailure(lines, 'E1376: Object member "val" accessible only using class "A" object') 1180 v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object')
1181 1181
1182 # Read a instance variable using the class name in a def function 1182 # Read a instance variable using the class name in a def function
1183 lines =<< trim END 1183 lines =<< trim END
1184 vim9script 1184 vim9script
1185 class A 1185 class A
1188 def T() 1188 def T()
1189 var i = A.val 1189 var i = A.val
1190 enddef 1190 enddef
1191 T() 1191 T()
1192 END 1192 END
1193 v9.CheckSourceFailure(lines, 'E1376: Object member "val" accessible only using class "A" object') 1193 v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object')
1194 1194
1195 # Access from child class extending a class: 1195 # Access from child class extending a class:
1196 lines =<< trim END 1196 lines =<< trim END
1197 vim9script 1197 vim9script
1198 class A 1198 class A
1235 vim9script 1235 vim9script
1236 class Something 1236 class Something
1237 static this.val = 1 1237 static this.val = 1
1238 endclass 1238 endclass
1239 END 1239 END
1240 v9.CheckSourceFailure(lines, 'E1368: Static cannot be followed by "this" in a member name') 1240 v9.CheckSourceFailure(lines, 'E1368: Static cannot be followed by "this" in a variable name')
1241 1241
1242 # Test for "static" cannot be followed by "public". 1242 # Test for "static" cannot be followed by "public".
1243 lines =<< trim END 1243 lines =<< trim END
1244 vim9script 1244 vim9script
1245 class Something 1245 class Something
1280 endclass 1280 endclass
1281 1281
1282 var b = B.new() 1282 var b = B.new()
1283 b.Foo() 1283 b.Foo()
1284 END 1284 END
1285 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _priv_class_var') 1285 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var')
1286 1286
1287 # A private class variable cannot be modified from a child class 1287 # A private class variable cannot be modified from a child class
1288 lines =<< trim END 1288 lines =<< trim END
1289 vim9script 1289 vim9script
1290 class A 1290 class A
1298 endclass 1298 endclass
1299 1299
1300 var b = B.new() 1300 var b = B.new()
1301 b.Foo() 1301 b.Foo()
1302 END 1302 END
1303 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _priv_class_var') 1303 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var')
1304 1304
1305 # Access from child class extending a class and from script context 1305 # Access from child class extending a class and from script context
1306 lines =<< trim END 1306 lines =<< trim END
1307 vim9script 1307 vim9script
1308 class A 1308 class A
1687 class A 1687 class A
1688 endclass 1688 endclass
1689 var a = A.new() 1689 var a = A.new()
1690 var v = a.bar 1690 var v = a.bar
1691 END 1691 END
1692 v9.CheckSourceFailure(lines, 'E1326: Member not found on object "A": bar') 1692 v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": bar')
1693 enddef 1693 enddef
1694 1694
1695 func Test_class_garbagecollect() 1695 func Test_class_garbagecollect()
1696 let lines =<< trim END 1696 let lines =<< trim END
1697 vim9script 1697 vim9script
1879 enddef 1879 enddef
1880 endclass 1880 endclass
1881 1881
1882 defcompile C.new 1882 defcompile C.new
1883 END 1883 END
1884 v9.CheckSourceFailure(lines, 'E1370: Cannot define a "new" function as static') 1884 v9.CheckSourceFailure(lines, 'E1370: Cannot define a "new" method as static')
1885 1885
1886 # Trying to compile a function using a non-existing class variable 1886 # Trying to compile a function using a non-existing class variable
1887 lines =<< trim END 1887 lines =<< trim END
1888 vim9script 1888 vim9script
1889 defcompile x.Foo() 1889 defcompile x.Foo()
2101 def Method(nr: number) 2101 def Method(nr: number)
2102 echo nr 2102 echo nr
2103 enddef 2103 enddef
2104 endclass 2104 endclass
2105 END 2105 END
2106 v9.CheckSourceFailure(lines, 'E1348: Member "counter" of interface "Some" is not implemented') 2106 v9.CheckSourceFailure(lines, 'E1348: Variable "counter" of interface "Some" is not implemented')
2107 2107
2108 lines =<< trim END 2108 lines =<< trim END
2109 vim9script 2109 vim9script
2110 2110
2111 interface Some 2111 interface Some
2716 this.new(3) 2716 this.new(3)
2717 enddef 2717 enddef
2718 endclass 2718 endclass
2719 var c = Child.new() 2719 var c = Child.new()
2720 END 2720 END
2721 v9.CheckSourceFailure(lines, 'E1375: Class member "new" accessible only using class "Child"') 2721 v9.CheckSourceFailure(lines, 'E1385: Class method "new" accessible only using class "Child"')
2722 2722
2723 # base class with more than one object member 2723 # base class with more than one object member
2724 lines =<< trim END 2724 lines =<< trim END
2725 vim9script 2725 vim9script
2726 2726
3998 var oc = C.new() 3998 var oc = C.new()
3999 assert_equal(101, oa.AccessObject()) 3999 assert_equal(101, oa.AccessObject())
4000 assert_equal(102, ob.AccessObject()) 4000 assert_equal(102, ob.AccessObject())
4001 assert_equal(103, oc.AccessObject()) 4001 assert_equal(103, oc.AccessObject())
4002 4002
4003 assert_fails('echo oc.AccessPrivateStaticThroughClassName()', 'E1333: Cannot access private member: _svar') 4003 assert_fails('echo oc.AccessPrivateStaticThroughClassName()', 'E1333: Cannot access private variable: _svar')
4004 4004
4005 # verify object properly resolves to correct static 4005 # verify object properly resolves to correct static
4006 assert_equal(1, oa.AccessStaticThroughObject()) 4006 assert_equal(1, oa.AccessStaticThroughObject())
4007 assert_equal(1, ob.AccessStaticThroughObject()) 4007 assert_equal(1, ob.AccessStaticThroughObject())
4008 assert_equal(1, oc.AccessStaticThroughObject()) 4008 assert_equal(1, oc.AccessStaticThroughObject())
4018 class C 4018 class C
4019 this.val = 10 4019 this.val = 10
4020 this.val = 20 4020 this.val = 20
4021 endclass 4021 endclass
4022 END 4022 END
4023 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: val') 4023 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val')
4024 4024
4025 # Duplicate private member variable 4025 # Duplicate private member variable
4026 lines =<< trim END 4026 lines =<< trim END
4027 vim9script 4027 vim9script
4028 class C 4028 class C
4029 this._val = 10 4029 this._val = 10
4030 this._val = 20 4030 this._val = 20
4031 endclass 4031 endclass
4032 END 4032 END
4033 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _val') 4033 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val')
4034 4034
4035 # Duplicate public member variable 4035 # Duplicate public member variable
4036 lines =<< trim END 4036 lines =<< trim END
4037 vim9script 4037 vim9script
4038 class C 4038 class C
4039 public this.val = 10 4039 public this.val = 10
4040 public this.val = 20 4040 public this.val = 20
4041 endclass 4041 endclass
4042 END 4042 END
4043 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: val') 4043 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val')
4044 4044
4045 # Duplicate private member variable 4045 # Duplicate private member variable
4046 lines =<< trim END 4046 lines =<< trim END
4047 vim9script 4047 vim9script
4048 class C 4048 class C
4049 this.val = 10 4049 this.val = 10
4050 this._val = 20 4050 this._val = 20
4051 endclass 4051 endclass
4052 END 4052 END
4053 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _val') 4053 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val')
4054 4054
4055 # Duplicate public and private member variable 4055 # Duplicate public and private member variable
4056 lines =<< trim END 4056 lines =<< trim END
4057 vim9script 4057 vim9script
4058 class C 4058 class C
4059 this._val = 20 4059 this._val = 20
4060 public this.val = 10 4060 public this.val = 10
4061 endclass 4061 endclass
4062 END 4062 END
4063 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: val') 4063 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val')
4064 4064
4065 # Duplicate class member variable 4065 # Duplicate class member variable
4066 lines =<< trim END 4066 lines =<< trim END
4067 vim9script 4067 vim9script
4068 class C 4068 class C
4069 static s: string = "abc" 4069 static s: string = "abc"
4070 static _s: string = "def" 4070 static _s: string = "def"
4071 endclass 4071 endclass
4072 END 4072 END
4073 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _s') 4073 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s')
4074 4074
4075 # Duplicate public and private class member variable 4075 # Duplicate public and private class member variable
4076 lines =<< trim END 4076 lines =<< trim END
4077 vim9script 4077 vim9script
4078 class C 4078 class C
4079 public static s: string = "abc" 4079 public static s: string = "abc"
4080 static _s: string = "def" 4080 static _s: string = "def"
4081 endclass 4081 endclass
4082 END 4082 END
4083 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _s') 4083 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s')
4084 4084
4085 # Duplicate class and object member variable 4085 # Duplicate class and object member variable
4086 lines =<< trim END 4086 lines =<< trim END
4087 vim9script 4087 vim9script
4088 class C 4088 class C
4107 endclass 4107 endclass
4108 class C extends B 4108 class C extends B
4109 this.val = 20 4109 this.val = 20
4110 endclass 4110 endclass
4111 END 4111 END
4112 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: val') 4112 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val')
4113 4113
4114 # Duplicate object private member variable in a derived class 4114 # Duplicate object private member variable in a derived class
4115 lines =<< trim END 4115 lines =<< trim END
4116 vim9script 4116 vim9script
4117 class A 4117 class A
4121 endclass 4121 endclass
4122 class C extends B 4122 class C extends B
4123 this._val = 20 4123 this._val = 20
4124 endclass 4124 endclass
4125 END 4125 END
4126 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _val') 4126 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val')
4127 4127
4128 # Duplicate object private member variable in a derived class 4128 # Duplicate object private member variable in a derived class
4129 lines =<< trim END 4129 lines =<< trim END
4130 vim9script 4130 vim9script
4131 class A 4131 class A
4135 endclass 4135 endclass
4136 class C extends B 4136 class C extends B
4137 this._val = 20 4137 this._val = 20
4138 endclass 4138 endclass
4139 END 4139 END
4140 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: _val') 4140 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val')
4141 4141
4142 # Duplicate object member variable in a derived class 4142 # Duplicate object member variable in a derived class
4143 lines =<< trim END 4143 lines =<< trim END
4144 vim9script 4144 vim9script
4145 class A 4145 class A
4149 endclass 4149 endclass
4150 class C extends B 4150 class C extends B
4151 this.val = 20 4151 this.val = 20
4152 endclass 4152 endclass
4153 END 4153 END
4154 v9.CheckSourceFailure(lines, 'E1369: Duplicate member: val') 4154 v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val')
4155 4155
4156 # Two member variables with a common prefix 4156 # Two member variables with a common prefix
4157 lines =<< trim END 4157 lines =<< trim END
4158 vim9script 4158 vim9script
4159 class A 4159 class A
4179 var a = A.new() 4179 var a = A.new()
4180 a._val = 20 4180 a._val = 20
4181 enddef 4181 enddef
4182 T() 4182 T()
4183 END 4183 END
4184 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _val') 4184 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val')
4185 4185
4186 # access a non-existing private object member variable 4186 # access a non-existing private object member variable
4187 lines =<< trim END 4187 lines =<< trim END
4188 vim9script 4188 vim9script
4189 class A 4189 class A
4193 var a = A.new() 4193 var a = A.new()
4194 a._a = 1 4194 a._a = 1
4195 enddef 4195 enddef
4196 T() 4196 T()
4197 END 4197 END
4198 v9.CheckSourceFailure(lines, 'E1326: Member not found on object "A": _a') 4198 v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": _a')
4199 4199
4200 # private static member variable 4200 # private static member variable
4201 lines =<< trim END 4201 lines =<< trim END
4202 vim9script 4202 vim9script
4203 class A 4203 class A
4207 var a = A.new() 4207 var a = A.new()
4208 var x = a._val 4208 var x = a._val
4209 enddef 4209 enddef
4210 T() 4210 T()
4211 END 4211 END
4212 v9.CheckSourceFailure(lines, 'E1375: Class member "_val" accessible only using class "A"') 4212 v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"')
4213 4213
4214 # private static member variable 4214 # private static member variable
4215 lines =<< trim END 4215 lines =<< trim END
4216 vim9script 4216 vim9script
4217 class A 4217 class A
4221 var a = A.new() 4221 var a = A.new()
4222 a._val = 3 4222 a._val = 3
4223 enddef 4223 enddef
4224 T() 4224 T()
4225 END 4225 END
4226 v9.CheckSourceFailure(lines, 'E1375: Class member "_val" accessible only using class "A"') 4226 v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"')
4227 4227
4228 # private static class variable 4228 # private static class variable
4229 lines =<< trim END 4229 lines =<< trim END
4230 vim9script 4230 vim9script
4231 class A 4231 class A
4234 def T() 4234 def T()
4235 var x = A._val 4235 var x = A._val
4236 enddef 4236 enddef
4237 T() 4237 T()
4238 END 4238 END
4239 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _val') 4239 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val')
4240 4240
4241 # private static class variable 4241 # private static class variable
4242 lines =<< trim END 4242 lines =<< trim END
4243 vim9script 4243 vim9script
4244 class A 4244 class A
4247 def T() 4247 def T()
4248 A._val = 3 4248 A._val = 3
4249 enddef 4249 enddef
4250 T() 4250 T()
4251 END 4251 END
4252 v9.CheckSourceFailure(lines, 'E1333: Cannot access private member: _val') 4252 v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val')
4253 enddef 4253 enddef
4254 4254
4255 " Test for changing the member access of an interface in a implementation class 4255 " Test for changing the member access of an interface in a implementation class
4256 def Test_change_interface_member_access() 4256 def Test_change_interface_member_access()
4257 var lines =<< trim END 4257 var lines =<< trim END
4261 endinterface 4261 endinterface
4262 class B implements A 4262 class B implements A
4263 this.val = 10 4263 this.val = 10
4264 endclass 4264 endclass
4265 END 4265 END
4266 v9.CheckSourceFailure(lines, 'E1367: Access level of member "val" of interface "A" is different') 4266 v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different')
4267 4267
4268 lines =<< trim END 4268 lines =<< trim END
4269 vim9script 4269 vim9script
4270 interface A 4270 interface A
4271 this.val: number 4271 this.val: number
4272 endinterface 4272 endinterface
4273 class B implements A 4273 class B implements A
4274 public this.val = 10 4274 public this.val = 10
4275 endclass 4275 endclass
4276 END 4276 END
4277 v9.CheckSourceFailure(lines, 'E1367: Access level of member "val" of interface "A" is different') 4277 v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different')
4278 enddef 4278 enddef
4279 4279
4280 " Test for trying to change a readonly member from a def function 4280 " Test for trying to change a readonly member from a def function
4281 def Test_readonly_member_change_in_def_func() 4281 def Test_readonly_member_change_in_def_func()
4282 var lines =<< trim END 4282 var lines =<< trim END
4308 assert_equal({a: 1, b: 2}, A.var3) 4308 assert_equal({a: 1, b: 2}, A.var3)
4309 A.var2 = [3, 4] 4309 A.var2 = [3, 4]
4310 A.var3 = {c: 3, d: 4} 4310 A.var3 = {c: 3, d: 4}
4311 assert_equal([3, 4], A.var2) 4311 assert_equal([3, 4], A.var2)
4312 assert_equal({c: 3, d: 4}, A.var3) 4312 assert_equal({c: 3, d: 4}, A.var3)
4313 assert_fails('echo A._priv_var4', 'E1333: Cannot access private member: _priv_var4') 4313 assert_fails('echo A._priv_var4', 'E1333: Cannot access private variable: _priv_var4')
4314 enddef 4314 enddef
4315 T() 4315 T()
4316 END 4316 END
4317 v9.CheckSourceSuccess(lines) 4317 v9.CheckSourceSuccess(lines)
4318 enddef 4318 enddef
4350 endclass 4350 endclass
4351 4351
4352 var a = A.new() 4352 var a = A.new()
4353 echo a.svar2 4353 echo a.svar2
4354 END 4354 END
4355 v9.CheckSourceFailure(lines, 'E1375: Class member "svar2" accessible only using class "A"') 4355 v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"')
4356 4356
4357 # Cannot write to a class variable using an object in script context 4357 # Cannot write to a class variable using an object in script context
4358 lines =<< trim END 4358 lines =<< trim END
4359 vim9script 4359 vim9script
4360 class A 4360 class A
4363 endclass 4363 endclass
4364 4364
4365 var a = A.new() 4365 var a = A.new()
4366 a.svar2 = [2] 4366 a.svar2 = [2]
4367 END 4367 END
4368 v9.CheckSourceFailure(lines, 'E1375: Class member "svar2" accessible only using class "A"') 4368 v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"')
4369 4369
4370 # Cannot read from a class variable using an object in def method context 4370 # Cannot read from a class variable using an object in def method context
4371 lines =<< trim END 4371 lines =<< trim END
4372 vim9script 4372 vim9script
4373 class A 4373 class A
4379 var a = A.new() 4379 var a = A.new()
4380 echo a.svar2 4380 echo a.svar2
4381 enddef 4381 enddef
4382 T() 4382 T()
4383 END 4383 END
4384 v9.CheckSourceFailure(lines, 'E1375: Class member "svar2" accessible only using class "A"') 4384 v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"')
4385 4385
4386 # Cannot write to a class variable using an object in def method context 4386 # Cannot write to a class variable using an object in def method context
4387 lines =<< trim END 4387 lines =<< trim END
4388 vim9script 4388 vim9script
4389 class A 4389 class A
4395 var a = A.new() 4395 var a = A.new()
4396 a.svar2 = [2] 4396 a.svar2 = [2]
4397 enddef 4397 enddef
4398 T() 4398 T()
4399 END 4399 END
4400 v9.CheckSourceFailure(lines, 'E1375: Class member "svar2" accessible only using class "A"') 4400 v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"')
4401 enddef 4401 enddef
4402 4402
4403 " Test for using a interface method using a child object 4403 " Test for using a interface method using a child object
4404 def Test_interface_method_from_child() 4404 def Test_interface_method_from_child()
4405 var lines =<< trim END 4405 var lines =<< trim END
4634 endclass 4634 endclass
4635 4635
4636 var b = B.new() 4636 var b = B.new()
4637 b.Bar() 4637 b.Bar()
4638 END 4638 END
4639 v9.CheckSourceFailure(lines, 'E1374: Class member "Foo" accessible only inside class "A"') 4639 v9.CheckSourceFailure(lines, 'E1384: Class method "Foo" accessible only inside class "A"')
4640 enddef 4640 enddef
4641 4641
4642 " Test for calling a class method using an object in a def function context and 4642 " Test for calling a class method using an object in a def function context and
4643 " script context. 4643 " script context.
4644 def Test_class_method_call_using_object() 4644 def Test_class_method_call_using_object()
4678 endclass 4678 endclass
4679 4679
4680 var a = A.new() 4680 var a = A.new()
4681 assert_equal('foo', a.Foo()) 4681 assert_equal('foo', a.Foo())
4682 END 4682 END
4683 v9.CheckSourceFailure(lines, 'E1375: Class member "Foo" accessible only using class "A"') 4683 v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"')
4684 4684
4685 # def function context 4685 # def function context
4686 lines =<< trim END 4686 lines =<< trim END
4687 vim9script 4687 vim9script
4688 class A 4688 class A
4695 var a = A.new() 4695 var a = A.new()
4696 assert_equal('foo', a.Foo()) 4696 assert_equal('foo', a.Foo())
4697 enddef 4697 enddef
4698 T() 4698 T()
4699 END 4699 END
4700 v9.CheckSourceFailure(lines, 'E1375: Class member "Foo" accessible only using class "A"') 4700 v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"')
4701 enddef 4701 enddef
4702 4702
4703 def Test_class_variable() 4703 def Test_class_variable()
4704 var lines =<< trim END 4704 var lines =<< trim END
4705 vim9script 4705 vim9script
4748 val = 20 4748 val = 20
4749 enddef 4749 enddef
4750 endclass 4750 endclass
4751 B.ClassFunc() 4751 B.ClassFunc()
4752 END 4752 END
4753 v9.CheckSourceFailure(lines, 'E1374: Class member "val" accessible only inside class "A"') 4753 v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"')
4754 4754
4755 # Reading a parent class variable from a child class method 4755 # Reading a parent class variable from a child class method
4756 lines =<< trim END 4756 lines =<< trim END
4757 vim9script 4757 vim9script
4758 4758
4765 var i = val 4765 var i = val
4766 enddef 4766 enddef
4767 endclass 4767 endclass
4768 B.ClassFunc() 4768 B.ClassFunc()
4769 END 4769 END
4770 v9.CheckSourceFailure(lines, 'E1374: Class member "val" accessible only inside class "A"') 4770 v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"')
4771 4771
4772 # Modifying a parent class variable from a child object method 4772 # Modifying a parent class variable from a child object method
4773 lines =<< trim END 4773 lines =<< trim END
4774 vim9script 4774 vim9script
4775 4775
4783 enddef 4783 enddef
4784 endclass 4784 endclass
4785 var b = B.new() 4785 var b = B.new()
4786 b.ObjFunc() 4786 b.ObjFunc()
4787 END 4787 END
4788 v9.CheckSourceFailure(lines, 'E1374: Class member "val" accessible only inside class "A"') 4788 v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"')
4789 4789
4790 # Reading a parent class variable from a child object method 4790 # Reading a parent class variable from a child object method
4791 lines =<< trim END 4791 lines =<< trim END
4792 vim9script 4792 vim9script
4793 4793
4801 enddef 4801 enddef
4802 endclass 4802 endclass
4803 var b = B.new() 4803 var b = B.new()
4804 b.ObjFunc() 4804 b.ObjFunc()
4805 END 4805 END
4806 v9.CheckSourceFailure(lines, 'E1374: Class member "val" accessible only inside class "A"') 4806 v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"')
4807 4807
4808 # Modifying a class variable using an object at script level 4808 # Modifying a class variable using an object at script level
4809 lines =<< trim END 4809 lines =<< trim END
4810 vim9script 4810 vim9script
4811 4811
4813 static val: number = 10 4813 static val: number = 10
4814 endclass 4814 endclass
4815 var a = A.new() 4815 var a = A.new()
4816 a.val = 20 4816 a.val = 20
4817 END 4817 END
4818 v9.CheckSourceFailure(lines, 'E1375: Class member "val" accessible only using class "A"') 4818 v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"')
4819 4819
4820 # Reading a class variable using an object at script level 4820 # Reading a class variable using an object at script level
4821 lines =<< trim END 4821 lines =<< trim END
4822 vim9script 4822 vim9script
4823 4823
4825 static val: number = 10 4825 static val: number = 10
4826 endclass 4826 endclass
4827 var a = A.new() 4827 var a = A.new()
4828 var i = a.val 4828 var i = a.val
4829 END 4829 END
4830 v9.CheckSourceFailure(lines, 'E1375: Class member "val" accessible only using class "A"') 4830 v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"')
4831 4831
4832 # Modifying a class variable using an object at function level 4832 # Modifying a class variable using an object at function level
4833 lines =<< trim END 4833 lines =<< trim END
4834 vim9script 4834 vim9script
4835 4835
4841 var a = A.new() 4841 var a = A.new()
4842 a.val = 20 4842 a.val = 20
4843 enddef 4843 enddef
4844 T() 4844 T()
4845 END 4845 END
4846 v9.CheckSourceFailure(lines, 'E1375: Class member "val" accessible only using class "A"') 4846 v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"')
4847 4847
4848 # Reading a class variable using an object at function level 4848 # Reading a class variable using an object at function level
4849 lines =<< trim END 4849 lines =<< trim END
4850 vim9script 4850 vim9script
4851 4851
4856 var a = A.new() 4856 var a = A.new()
4857 var i = a.val 4857 var i = a.val
4858 enddef 4858 enddef
4859 T() 4859 T()
4860 END 4860 END
4861 v9.CheckSourceFailure(lines, 'E1375: Class member "val" accessible only using class "A"') 4861 v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"')
4862 enddef 4862 enddef
4863 4863
4864 " Test for using a duplicate class method and class variable in a child class 4864 " Test for using a duplicate class method and class variable in a child class
4865 def Test_dup_class_member() 4865 def Test_dup_class_member()
4866 # duplicate class variable, class method and overridden object method 4866 # duplicate class variable, class method and overridden object method
4955 echo "foo" 4955 echo "foo"
4956 enddef 4956 enddef
4957 endclass 4957 endclass
4958 A.Foo() 4958 A.Foo()
4959 END 4959 END
4960 v9.CheckSourceFailure(lines, 'E1376: Object member "Foo" accessible only using class "A" object') 4960 v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object')
4961 4961
4962 # Invoke an object method using a class in def function context 4962 # Invoke an object method using a class in def function context
4963 lines =<< trim END 4963 lines =<< trim END
4964 vim9script 4964 vim9script
4965 class A 4965 class A
4970 def T() 4970 def T()
4971 A.Foo() 4971 A.Foo()
4972 enddef 4972 enddef
4973 T() 4973 T()
4974 END 4974 END
4975 v9.CheckSourceFailure(lines, 'E1376: Object member "Foo" accessible only using class "A" object') 4975 v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object')
4976 enddef 4976 enddef
4977 4977
4978 " Test for duplicate class method and instance method 4978 " Test for duplicate class method and instance method
4979 def Test_dup_classmethod_objmethod() 4979 def Test_dup_classmethod_objmethod()
4980 # Duplicate instance method 4980 # Duplicate instance method
5216 class C implements A, B 5216 class C implements A, B
5217 def Foo() 5217 def Foo()
5218 enddef 5218 enddef
5219 endclass 5219 endclass
5220 END 5220 END
5221 v9.CheckSourceFailure(lines, 'E1348: Member "var2" of interface "B" is not implemented') 5221 v9.CheckSourceFailure(lines, 'E1348: Variable "var2" of interface "B" is not implemented')
5222 5222
5223 # interface cannot extend a class 5223 # interface cannot extend a class
5224 lines =<< trim END 5224 lines =<< trim END
5225 vim9script 5225 vim9script
5226 class A 5226 class A
5274 interface C extends B 5274 interface C extends B
5275 this.val1: string 5275 this.val1: string
5276 this.val2: number 5276 this.val2: number
5277 endinterface 5277 endinterface
5278 END 5278 END
5279 v9.CheckSourceFailure(lines, 'E1382: Member "val1": type mismatch, expected number but got string') 5279 v9.CheckSourceFailure(lines, 'E1382: Variable "val1": type mismatch, expected number but got string')
5280 enddef 5280 enddef
5281 5281
5282 " Test for a child class implementing an interface when some of the methods are 5282 " Test for a child class implementing an interface when some of the methods are
5283 " defined in the parent class. 5283 " defined in the parent class.
5284 def Test_child_class_implements_interface() 5284 def Test_child_class_implements_interface()
5431 class C extends B implements Intf 5431 class C extends B implements Intf
5432 this.v3: list<list<number>> = [[0]] 5432 this.v3: list<list<number>> = [[0]]
5433 this.var1 = [{a: 10}] 5433 this.var1 = [{a: 10}]
5434 endclass 5434 endclass
5435 END 5435 END
5436 v9.CheckSourceFailure(lines, 'E1348: Member "var3" of interface "Intf" is not implemented') 5436 v9.CheckSourceFailure(lines, 'E1348: Variable "var3" of interface "Intf" is not implemented')
5437 5437
5438 # One of the interface variables is of different type 5438 # One of the interface variables is of different type
5439 lines =<< trim END 5439 lines =<< trim END
5440 vim9script 5440 vim9script
5441 5441
5458 class C extends B implements Intf 5458 class C extends B implements Intf
5459 this.v3: list<list<number>> = [[0]] 5459 this.v3: list<list<number>> = [[0]]
5460 this.var1 = [{a: 10}] 5460 this.var1 = [{a: 10}]
5461 endclass 5461 endclass
5462 END 5462 END
5463 v9.CheckSourceFailure(lines, 'E1382: Member "var3": type mismatch, expected list<dict<number>> but got list<dict<string>>') 5463 v9.CheckSourceFailure(lines, 'E1382: Variable "var3": type mismatch, expected list<dict<number>> but got list<dict<string>>')
5464 enddef 5464 enddef
5465 5465
5466 " Test for extending an interface with duplicate variables and methods 5466 " Test for extending an interface with duplicate variables and methods
5467 def Test_interface_extends_with_dup_members() 5467 def Test_interface_extends_with_dup_members()
5468 var lines =<< trim END 5468 var lines =<< trim END
5529 class B implements A 5529 class B implements A
5530 this.val = {a: 1, b: 2} 5530 this.val = {a: 1, b: 2}
5531 endclass 5531 endclass
5532 var b = B.new() 5532 var b = B.new()
5533 END 5533 END
5534 v9.CheckSourceFailure(lines, 'E1382: Member "val": type mismatch, expected list<dict<string>> but got dict<number>') 5534 v9.CheckSourceFailure(lines, 'E1382: Variable "val": type mismatch, expected list<dict<string>> but got dict<number>')
5535 enddef 5535 enddef
5536 5536
5537 " Test for assigning to a member variable in a nested class 5537 " Test for assigning to a member variable in a nested class
5538 def Test_nested_object_assignment() 5538 def Test_nested_object_assignment()
5539 var lines =<< trim END 5539 var lines =<< trim END