# HG changeset patch # User Christian Brabandt # Date 1695936603 -7200 # Node ID b5ad84fdc7026e38101e27670af202d7a257db02 # Parent 245624dcfea22853aafc075b73a2b1cc9faf4a50 patch 9.0.1951: Vim9: hard to debug vim9_class errors from CI Commit: https://github.com/vim/vim/commit/b90e3bc491c02bd6e4db1a1c1849ce3d21811c43 Author: Yegappan Lakshmanan Date: Thu Sep 28 23:06:48 2023 +0200 patch 9.0.1951: Vim9: hard to debug vim9_class errors from CI Problem: Vim9: hard to debug vim9_class errors from CI Solution: Include the line number in assert_xxx() calls. Include the entire error message in the tests. Fix the indentation in the test file. Add tags for new error codes. closes: #13206 Signed-off-by: Christian Brabandt Co-authored-by: Yegappan Lakshmanan diff --git a/runtime/doc/tags b/runtime/doc/tags --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4479,6 +4479,9 @@ E1380 vim9class.txt /*E1380* E1381 vim9class.txt /*E1381* E1382 vim9class.txt /*E1382* E1383 vim9class.txt /*E1383* +E1384 vim9class.txt /*E1384* +E1385 vim9class.txt /*E1385* +E1386 vim9class.txt /*E1386* E1387 vim9class.txt /*E1387* E1388 vim9class.txt /*E1388* E1389 vim9class.txt /*E1389* diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt --- a/runtime/doc/vim9class.txt +++ b/runtime/doc/vim9class.txt @@ -258,10 +258,15 @@ If the class extends a parent class, the step the object variables of the parent class are initialized first. There is no need to call "super()" or "new()" on the parent. - *E1365* + *E1365* When defining the new() method the return type should not be specified. It always returns an object of the class. + *E1386* +When invoking an object method, the method name should be preceded by the +object variable name. A object method cannot be invoked using the class +name. + ============================================================================== 3. Class Variables and Methods *Vim9-class-member* @@ -282,7 +287,7 @@ prefix in the class where they are defin Since the name is used as-is, shadowing the name by a method argument name or local variable name is not allowed. - *E1374* *E1375* + *E1374* *E1375* *E1384* *E1385* To access a class member outside of the class where it is defined, the class name prefix must be used. A class member cannot be accessed using an object. diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -2396,6 +2396,7 @@ EXTERN char e_io_file_requires_name_to_b #ifdef FEAT_EVAL EXTERN char e_invalid_callback_argument[] INIT(= N_("E921: Invalid callback argument")); +// E922 unused EXTERN char e_second_argument_of_function_must_be_list_or_dict[] INIT(= N_("E923: Second argument of function() must be a list or a dict")); #endif @@ -2790,7 +2791,7 @@ EXTERN char e_no_white_space_allowed_aft INIT(= N_("E1074: No white space allowed after dot")); EXTERN char e_namespace_not_supported_str[] INIT(= N_("E1075: Namespace not supported: %s")); -// E1076 was deleted +// E1076 unused (was deleted) EXTERN char e_missing_argument_type_for_str[] INIT(= N_("E1077: Missing argument type for %s")); #endif @@ -2858,6 +2859,7 @@ PLURAL_MSG(e_one_argument_too_many, "E11 EXTERN char e_string_list_dict_or_blob_required[] INIT(= N_("E1107: String, List, Dict or Blob required")); +// E1108 unused EXTERN char e_list_item_nr_is_not_list[] INIT(= N_("E1109: List item %d is not a List")); EXTERN char e_list_item_nr_does_not_contain_3_numbers[] @@ -3210,6 +3212,7 @@ EXTERN char e_list_dict_blob_or_string_r INIT(= N_("E1251: List, Dictionary, Blob or String required for argument %d")); EXTERN char e_string_list_or_blob_required_for_argument_nr[] INIT(= N_("E1252: String, List or Blob required for argument %d")); +// E1253 unused EXTERN char e_cannot_use_script_variable_in_for_loop[] INIT(= N_("E1254: Cannot use script variable in for loop")); #endif @@ -3523,7 +3526,7 @@ EXTERN char e_class_method_str_accessibl INIT(= N_("E1385: Class method \"%s\" accessible only using class \"%s\"")); EXTERN char e_object_method_str_accessible_only_using_object_str[] INIT(= N_("E1386: Object method \"%s\" accessible only using class \"%s\" object")); -EXTERN char e_public_member_not_supported_in_interface[] +EXTERN char e_public_variable_not_supported_in_interface[] INIT(= N_("E1387: Public variable not supported in an interface")); EXTERN char e_public_keyword_not_supported_for_method[] INIT(= N_("E1388: Public keyword not supported for a method")); diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -6,151 +6,151 @@ import './vim9.vim' as v9 def Test_class_basic() # Class supported only in "vim9script" var lines =<< trim END - class NotWorking - endclass - END - v9.CheckSourceFailure(lines, 'E1316:') + class NotWorking + endclass + END + v9.CheckSourceFailure(lines, 'E1316: Class can only be defined in Vim9 script', 1) # First character in a class name should be capitalized. lines =<< trim END - vim9script - class notWorking - endclass - END - v9.CheckSourceFailure(lines, 'E1314:') + vim9script + class notWorking + endclass + END + v9.CheckSourceFailure(lines, 'E1314: Class name must start with an uppercase letter: notWorking', 2) # Only alphanumeric characters are supported in a class name lines =<< trim END - vim9script - class Not@working - endclass - END - v9.CheckSourceFailure(lines, 'E1315:') + vim9script + class Not@working + endclass + END + v9.CheckSourceFailure(lines, 'E1315: White space required after name: Not@working', 2) # Unsupported keyword (instead of class) lines =<< trim END - vim9script - abstract noclass Something - endclass - END - v9.CheckSourceFailure(lines, 'E475:') + vim9script + abstract noclass Something + endclass + END + v9.CheckSourceFailure(lines, 'E475: Invalid argument: noclass Something', 2) # Only the completed word "class" should be recognized lines =<< trim END - vim9script - abstract classy Something - endclass - END - v9.CheckSourceFailure(lines, 'E475:') + vim9script + abstract classy Something + endclass + END + v9.CheckSourceFailure(lines, 'E475: Invalid argument: classy Something', 2) # The complete "endclass" should be specified. lines =<< trim END - vim9script - class Something - endcl - END - v9.CheckSourceFailure(lines, 'E1065:') + vim9script + class Something + endcl + END + v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: endcl', 3) # Additional words after "endclass" lines =<< trim END - vim9script - class Something - endclass school's out - END - v9.CheckSourceFailure(lines, 'E488:') + vim9script + class Something + endclass school's out + END + v9.CheckSourceFailure(lines, "E488: Trailing characters: school's out", 3) # Additional commands after "endclass" lines =<< trim END - vim9script - class Something - endclass | echo 'done' - END - v9.CheckSourceFailure(lines, 'E488:') + vim9script + class Something + endclass | echo 'done' + END + v9.CheckSourceFailure(lines, "E488: Trailing characters: | echo 'done'", 3) # Use "this" without any member variable name lines =<< trim END - vim9script - class Something - this - endclass - END - v9.CheckSourceFailure(lines, 'E1317:') + vim9script + class Something + this + endclass + END + v9.CheckSourceFailure(lines, 'E1317: Invalid object variable declaration: this', 3) # Use "this." without any member variable name lines =<< trim END - vim9script - class Something - this. - endclass - END - v9.CheckSourceFailure(lines, 'E1317:') + vim9script + class Something + this. + endclass + END + v9.CheckSourceFailure(lines, 'E1317: Invalid object variable declaration: this.', 3) # Space between "this" and "." lines =<< trim END - vim9script - class Something - this .count - endclass - END - v9.CheckSourceFailure(lines, 'E1317:') + vim9script + class Something + this .count + endclass + END + v9.CheckSourceFailure(lines, 'E1317: Invalid object variable declaration: this .count', 3) # Space between "this." and the member variable name lines =<< trim END - vim9script - class Something - this. count - endclass - END - v9.CheckSourceFailure(lines, 'E1317:') + vim9script + class Something + this. count + endclass + END + v9.CheckSourceFailure(lines, 'E1317: Invalid object variable declaration: this. count', 3) # Use "that" instead of "this" lines =<< trim END - vim9script - class Something - this.count: number - that.count - endclass - END - v9.CheckSourceFailure(lines, 'E1318: Not a valid command in a class: that.count') + vim9script + class Something + this.count: number + that.count + endclass + END + v9.CheckSourceFailure(lines, 'E1318: Not a valid command in a class: that.count', 4) # Member variable without a type or initialization lines =<< trim END - vim9script - class Something - this.count - endclass - END - v9.CheckSourceFailure(lines, 'E1022:') + vim9script + class Something + this.count + endclass + END + v9.CheckSourceFailure(lines, 'E1022: Type or initialization required', 3) # Use a non-existing member variable in new() lines =<< trim END - vim9script - class Something - def new() - this.state = 0 - enddef - endclass - var obj = Something.new() - END - v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Something": state') + vim9script + class Something + def new() + this.state = 0 + enddef + endclass + var obj = Something.new() + END + v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Something": state', 1) # Space before ":" in a member variable declaration lines =<< trim END - vim9script - class Something - this.count : number - endclass - END - v9.CheckSourceFailure(lines, 'E1059:') + vim9script + class Something + this.count : number + endclass + END + v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: count : number', 3) # No space after ":" in a member variable declaration lines =<< trim END - vim9script - class Something - this.count:number - endclass - END - v9.CheckSourceFailure(lines, 'E1069:') + vim9script + class Something + this.count:number + endclass + END + v9.CheckSourceFailure(lines, "E1069: White space required after ':'", 3) # Test for unsupported comment specifier lines =<< trim END @@ -160,7 +160,7 @@ def Test_class_basic() #{ endclass END - v9.CheckSourceFailure(lines, 'E1170:') + v9.CheckSourceFailure(lines, 'E1170: Cannot use #{ to start a comment', 3) # Test for using class as a bool lines =<< trim END @@ -170,7 +170,7 @@ def Test_class_basic() if A endif END - v9.CheckSourceFailure(lines, 'E1319: Using a class as a Number') + v9.CheckSourceFailure(lines, 'E1319: Using a class as a Number', 4) # Test for using object as a bool lines =<< trim END @@ -181,7 +181,7 @@ def Test_class_basic() if a endif END - v9.CheckSourceFailure(lines, 'E1320: Using an object as a Number') + v9.CheckSourceFailure(lines, 'E1320: Using an object as a Number', 5) # Test for using class as a float lines =<< trim END @@ -190,7 +190,7 @@ def Test_class_basic() endclass sort([1.1, A], 'f') END - v9.CheckSourceFailure(lines, 'E1321: Using a class as a Float') + v9.CheckSourceFailure(lines, 'E1321: Using a class as a Float', 4) # Test for using object as a float lines =<< trim END @@ -200,7 +200,7 @@ def Test_class_basic() var a = A.new() sort([1.1, a], 'f') END - v9.CheckSourceFailure(lines, 'E1322: Using an object as a Float') + v9.CheckSourceFailure(lines, 'E1322: Using an object as a Float', 5) # Test for using class as a string lines =<< trim END @@ -209,7 +209,7 @@ def Test_class_basic() endclass :exe 'call ' .. A END - v9.CheckSourceFailure(lines, 'E1323: Using a class as a String') + v9.CheckSourceFailure(lines, 'E1323: Using a class as a String', 4) # Test for using object as a string lines =<< trim END @@ -219,35 +219,35 @@ def Test_class_basic() var a = A.new() :exe 'call ' .. a END - v9.CheckSourceFailure(lines, 'E1324: Using an object as a String') + v9.CheckSourceFailure(lines, 'E1324: Using an object as a String', 5) # Test creating a class with member variables and methods, calling a object # method. Check for using type() and typename() with a class and an object. lines =<< trim END - vim9script - - class TextPosition - this.lnum: number - this.col: number - - # make a nicely formatted string - def ToString(): string - return $'({this.lnum}, {this.col})' - enddef - endclass - - # use the automatically generated new() method - var pos = TextPosition.new(2, 12) - assert_equal(2, pos.lnum) - assert_equal(12, pos.col) - - # call an object method - assert_equal('(2, 12)', pos.ToString()) - - assert_equal(v:t_class, type(TextPosition)) - assert_equal(v:t_object, type(pos)) - assert_equal('class', typename(TextPosition)) - assert_equal('object', typename(pos)) + vim9script + + class TextPosition + this.lnum: number + this.col: number + + # make a nicely formatted string + def ToString(): string + return $'({this.lnum}, {this.col})' + enddef + endclass + + # use the automatically generated new() method + var pos = TextPosition.new(2, 12) + assert_equal(2, pos.lnum) + assert_equal(12, pos.col) + + # call an object method + assert_equal('(2, 12)', pos.ToString()) + + assert_equal(v:t_class, type(TextPosition)) + assert_equal(v:t_object, type(pos)) + assert_equal('class', typename(TextPosition)) + assert_equal('object', typename(pos)) END v9.CheckSourceSuccess(lines) @@ -262,7 +262,7 @@ def Test_class_basic() var a = A.new() var v = a. Foo() END - v9.CheckSourceFailure(lines, 'E1202:') + v9.CheckSourceFailure(lines, "E1202: No white space allowed after '.'", 8) # Using an object without specifying a method or a member variable lines =<< trim END @@ -275,7 +275,7 @@ def Test_class_basic() var a = A.new() var v = a. END - v9.CheckSourceFailure(lines, 'E15:') + v9.CheckSourceFailure(lines, 'E15: Invalid expression: "a."', 8) # Error when parsing the arguments of an object method. lines =<< trim END @@ -287,7 +287,7 @@ def Test_class_basic() var a = A.new() var v = a.Foo(,) END - v9.CheckSourceFailure(lines, 'E15:') + v9.CheckSourceFailure(lines, 'E15: Invalid expression: "a.Foo(,)"', 7) # Use a multi-line initialization for a member variable lines =<< trim END @@ -368,19 +368,19 @@ enddef def Test_class_defined_twice() # class defined twice should fail var lines =<< trim END - vim9script - class There - endclass - class There - endclass - END - v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "There"') + vim9script + class There + endclass + class There + endclass + END + v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "There"', 4) # one class, reload same script twice is OK lines =<< trim END - vim9script - class There - endclass + vim9script + class There + endclass END writefile(lines, 'XclassTwice.vim', 'D') source XclassTwice.vim @@ -390,119 +390,119 @@ enddef def Test_returning_null_object() # this was causing an internal error var lines =<< trim END - vim9script - - class BufferList - def Current(): any - return null_object - enddef - endclass - - var buffers = BufferList.new() - echo buffers.Current() + vim9script + + class BufferList + def Current(): any + return null_object + enddef + endclass + + var buffers = BufferList.new() + echo buffers.Current() END v9.CheckSourceSuccess(lines) enddef def Test_using_null_class() var lines =<< trim END - @_ = null_class.member - END - v9.CheckDefExecAndScriptFailure(lines, ['E715:', 'E1363:']) + @_ = null_class.member + END + v9.CheckDefExecAndScriptFailure(lines, ['E715: Dictionary required', 'E1363: Incomplete type']) enddef def Test_class_interface_wrong_end() var lines =<< trim END - vim9script - abstract class SomeName - this.member = 'text' - endinterface - END - v9.CheckSourceFailure(lines, 'E476: Invalid command: endinterface, expected endclass') - - lines =<< trim END - vim9script - export interface AnotherName - this.member: string - endclass - END - v9.CheckSourceFailure(lines, 'E476: Invalid command: endclass, expected endinterface') + vim9script + abstract class SomeName + this.member = 'text' + endinterface + END + v9.CheckSourceFailure(lines, 'E476: Invalid command: endinterface, expected endclass', 4) + + lines =<< trim END + vim9script + export interface AnotherName + this.member: string + endclass + END + v9.CheckSourceFailure(lines, 'E476: Invalid command: endclass, expected endinterface', 4) enddef def Test_object_not_set() # Use an uninitialized object in script context var lines =<< trim END - vim9script - - class State - this.value = 'xyz' - endclass - - var state: State - var db = {'xyz': 789} - echo db[state.value] - END - v9.CheckSourceFailure(lines, 'E1360:') + vim9script + + class State + this.value = 'xyz' + endclass + + var state: State + var db = {'xyz': 789} + echo db[state.value] + END + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 9) # Use an uninitialized object from a def function lines =<< trim END - vim9script - - class Class - this.id: string - def Method1() - echo 'Method1' .. this.id - enddef - endclass - - var obj: Class - def Func() - obj.Method1() - enddef - Func() - END - v9.CheckSourceFailure(lines, 'E1360:') + vim9script + + class Class + this.id: string + def Method1() + echo 'Method1' .. this.id + enddef + endclass + + var obj: Class + def Func() + obj.Method1() + enddef + Func() + END + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 1) # Pass an uninitialized object variable to a "new" function and try to call an # object method. lines =<< trim END - vim9script - - class Background - this.background = 'dark' - endclass - - class Colorscheme - this._bg: Background - - def GetBackground(): string - return this._bg.background - enddef - endclass - - var bg: Background # UNINITIALIZED - echo Colorscheme.new(bg).GetBackground() - END - v9.CheckSourceFailure(lines, 'E1360:') + vim9script + + class Background + this.background = 'dark' + endclass + + class Colorscheme + this._bg: Background + + def GetBackground(): string + return this._bg.background + enddef + endclass + + var bg: Background # UNINITIALIZED + echo Colorscheme.new(bg).GetBackground() + END + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 1) # TODO: this should not give an error but be handled at runtime lines =<< trim END - vim9script - - class Class - this.id: string - def Method1() - echo 'Method1' .. this.id - enddef - endclass - - var obj = null_object - def Func() - obj.Method1() - enddef - Func() - END - v9.CheckSourceFailure(lines, 'E1363:') + vim9script + + class Class + this.id: string + def Method1() + echo 'Method1' .. this.id + enddef + endclass + + var obj = null_object + def Func() + obj.Method1() + enddef + Func() + END + v9.CheckSourceFailure(lines, 'E1363: Incomplete type', 1) enddef " Null object assignment and comparison @@ -549,60 +549,60 @@ enddef " Test for object member initialization and disassembly def Test_class_member_initializer() var lines =<< trim END - vim9script - - class TextPosition - this.lnum: number = 1 - this.col: number = 1 - - # constructor with only the line number - def new(lnum: number) - this.lnum = lnum - enddef - endclass - - var pos = TextPosition.new(3) - assert_equal(3, pos.lnum) - assert_equal(1, pos.col) - - var instr = execute('disassemble TextPosition.new') - assert_match('new\_s*' .. - '0 NEW TextPosition size \d\+\_s*' .. - '\d PUSHNR 1\_s*' .. - '\d STORE_THIS 0\_s*' .. - '\d PUSHNR 1\_s*' .. - '\d STORE_THIS 1\_s*' .. - 'this.lnum = lnum\_s*' .. - '\d LOAD arg\[-1]\_s*' .. - '\d PUSHNR 0\_s*' .. - '\d LOAD $0\_s*' .. - '\d\+ STOREINDEX object\_s*' .. - '\d\+ RETURN object.*', - instr) + vim9script + + class TextPosition + this.lnum: number = 1 + this.col: number = 1 + + # constructor with only the line number + def new(lnum: number) + this.lnum = lnum + enddef + endclass + + var pos = TextPosition.new(3) + assert_equal(3, pos.lnum) + assert_equal(1, pos.col) + + var instr = execute('disassemble TextPosition.new') + assert_match('new\_s*' .. + '0 NEW TextPosition size \d\+\_s*' .. + '\d PUSHNR 1\_s*' .. + '\d STORE_THIS 0\_s*' .. + '\d PUSHNR 1\_s*' .. + '\d STORE_THIS 1\_s*' .. + 'this.lnum = lnum\_s*' .. + '\d LOAD arg\[-1]\_s*' .. + '\d PUSHNR 0\_s*' .. + '\d LOAD $0\_s*' .. + '\d\+ STOREINDEX object\_s*' .. + '\d\+ RETURN object.*', + instr) END v9.CheckSourceSuccess(lines) enddef def Test_member_any_used_as_object() var lines =<< trim END - vim9script - - class Inner - this.value: number = 0 - endclass - - class Outer - this.inner: any - endclass - - def F(outer: Outer) - outer.inner.value = 1 - enddef - - var inner_obj = Inner.new(0) - var outer_obj = Outer.new(inner_obj) - F(outer_obj) - assert_equal(1, inner_obj.value) + vim9script + + class Inner + this.value: number = 0 + endclass + + class Outer + this.inner: any + endclass + + def F(outer: Outer) + outer.inner.value = 1 + enddef + + var inner_obj = Inner.new(0) + var outer_obj = Outer.new(inner_obj) + F(outer_obj) + assert_equal(1, inner_obj.value) END v9.CheckSourceSuccess(lines) @@ -626,7 +626,7 @@ def Test_member_any_used_as_object() var outer_obj = Outer.new(inner_obj) F(outer_obj) END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _value') + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _value', 1) # Try modifying a non-existing variable using an "any" object lines =<< trim END @@ -648,7 +648,7 @@ def Test_member_any_used_as_object() var outer_obj = Outer.new(inner_obj) F(outer_obj) END - v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Inner": someval') + v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "Inner": someval', 1) enddef " Nested assignment to a object variable which is of another class type @@ -709,7 +709,7 @@ def Test_assignment_nested_type() Test_assign_to_nested_typed_member() END - v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "Inner" is not writable') + v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "Inner" is not writable', 1) # Assignment where target item is read only script level lines =<< trim END @@ -732,307 +732,296 @@ def Test_assignment_nested_type() script_outer.inner.value = 1 assert_equal(1, script_inner.value) END - v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "Inner" is not writable') + v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "Inner" is not writable', 17) enddef def Test_assignment_with_operator() # Use "+=" to assign to a object variable var lines =<< trim END - vim9script - - class Foo - public this.x: number - - def Add(n: number) - this.x += n - enddef - endclass - - var f = Foo.new(3) - f.Add(17) - assert_equal(20, f.x) - - def AddToFoo(obj: Foo) - obj.x += 3 - enddef - - AddToFoo(f) - assert_equal(23, f.x) + vim9script + + class Foo + public this.x: number + + def Add(n: number) + this.x += n + enddef + endclass + + var f = Foo.new(3) + f.Add(17) + assert_equal(20, f.x) + + def AddToFoo(obj: Foo) + obj.x += 3 + enddef + + AddToFoo(f) + assert_equal(23, f.x) END v9.CheckSourceSuccess(lines) enddef def Test_list_of_objects() var lines =<< trim END - vim9script - - class Foo - def Add() - enddef - endclass - - def ProcessList(fooList: list) - for foo in fooList - foo.Add() - endfor - enddef - - var l: list = [Foo.new()] - ProcessList(l) + vim9script + + class Foo + def Add() + enddef + endclass + + def ProcessList(fooList: list) + for foo in fooList + foo.Add() + endfor + enddef + + var l: list = [Foo.new()] + ProcessList(l) END v9.CheckSourceSuccess(lines) enddef def Test_expr_after_using_object() var lines =<< trim END - vim9script - - class Something - this.label: string = '' - endclass - - def Foo(): Something - var v = Something.new() - echo 'in Foo(): ' .. typename(v) - return v - enddef - - Foo() + vim9script + + class Something + this.label: string = '' + endclass + + def Foo(): Something + var v = Something.new() + echo 'in Foo(): ' .. typename(v) + return v + enddef + + Foo() END v9.CheckSourceSuccess(lines) enddef def Test_class_default_new() var lines =<< trim END - vim9script - - class TextPosition - this.lnum: number = 1 - this.col: number = 1 - endclass - - var pos = TextPosition.new() - assert_equal(1, pos.lnum) - assert_equal(1, pos.col) - - pos = TextPosition.new(v:none, v:none) - assert_equal(1, pos.lnum) - assert_equal(1, pos.col) - - pos = TextPosition.new(3, 22) - assert_equal(3, pos.lnum) - assert_equal(22, pos.col) - - pos = TextPosition.new(v:none, 33) - assert_equal(1, pos.lnum) - assert_equal(33, pos.col) + vim9script + + class TextPosition + this.lnum: number = 1 + this.col: number = 1 + endclass + + var pos = TextPosition.new() + assert_equal(1, pos.lnum) + assert_equal(1, pos.col) + + pos = TextPosition.new(v:none, v:none) + assert_equal(1, pos.lnum) + assert_equal(1, pos.col) + + pos = TextPosition.new(3, 22) + assert_equal(3, pos.lnum) + assert_equal(22, pos.col) + + pos = TextPosition.new(v:none, 33) + assert_equal(1, pos.lnum) + assert_equal(33, pos.col) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class Person - this.name: string - this.age: number = 42 - this.education: string = "unknown" - - def new(this.name, this.age = v:none, this.education = v:none) - enddef - endclass - - var piet = Person.new("Piet") - assert_equal("Piet", piet.name) - assert_equal(42, piet.age) - assert_equal("unknown", piet.education) - - var chris = Person.new("Chris", 4, "none") - assert_equal("Chris", chris.name) - assert_equal(4, chris.age) - assert_equal("none", chris.education) + vim9script + class Person + this.name: string + this.age: number = 42 + this.education: string = "unknown" + + def new(this.name, this.age = v:none, this.education = v:none) + enddef + endclass + + var piet = Person.new("Piet") + assert_equal("Piet", piet.name) + assert_equal(42, piet.age) + assert_equal("unknown", piet.education) + + var chris = Person.new("Chris", 4, "none") + assert_equal("Chris", chris.name) + assert_equal(4, chris.age) + assert_equal("none", chris.education) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class Person - this.name: string - this.age: number = 42 - this.education: string = "unknown" - - def new(this.name, this.age = v:none, this.education = v:none) - enddef - endclass - - var missing = Person.new() - END - v9.CheckSourceFailure(lines, 'E119:') + vim9script + class Person + this.name: string + this.age: number = 42 + this.education: string = "unknown" + + def new(this.name, this.age = v:none, this.education = v:none) + enddef + endclass + + var missing = Person.new() + END + v9.CheckSourceFailure(lines, 'E119: Not enough arguments for function: new', 11) # Using a specific value to initialize an instance variable in the new() # method. lines =<< trim END - vim9script - class A - this.val: string - def new(this.val = 'a') - enddef - endclass - END - v9.CheckSourceFailure(lines, "E1328: Constructor default value must be v:none: = 'a'") + vim9script + class A + this.val: string + def new(this.val = 'a') + enddef + endclass + END + v9.CheckSourceFailure(lines, "E1328: Constructor default value must be v:none: = 'a'", 4) enddef def Test_class_new_with_object_member() var lines =<< trim END - vim9script - - class C - this.str: string - this.num: number - def new(this.str, this.num) - enddef - def newVals(this.str, this.num) - enddef - endclass - - def Check() - try - var c = C.new('cats', 2) - assert_equal('cats', c.str) - assert_equal(2, c.num) - - c = C.newVals('dogs', 4) - assert_equal('dogs', c.str) - assert_equal(4, c.num) - catch - assert_report($'Unexpected exception was caught: {v:exception}') - endtry - enddef - - Check() + vim9script + + class C + this.str: string + this.num: number + def new(this.str, this.num) + enddef + def newVals(this.str, this.num) + enddef + endclass + + def Check() + try + var c = C.new('cats', 2) + assert_equal('cats', c.str) + assert_equal(2, c.num) + + c = C.newVals('dogs', 4) + assert_equal('dogs', c.str) + assert_equal(4, c.num) + catch + assert_report($'Unexpected exception was caught: {v:exception}') + endtry + enddef + + Check() END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - class C - this.str: string - this.num: number - def new(this.str, this.num) - enddef - endclass - - def Check() - try - var c = C.new(1, 2) - catch - assert_report($'Unexpected exception was caught: {v:exception}') - endtry - enddef - - Check() - END - v9.CheckSourceFailure(lines, 'E1013:') - - lines =<< trim END - vim9script - - class C - this.str: string - this.num: number - def newVals(this.str, this.num) - enddef - endclass - - def Check() - try - var c = C.newVals('dogs', 'apes') - catch - assert_report($'Unexpected exception was caught: {v:exception}') - endtry - enddef - - Check() - END - v9.CheckSourceFailure(lines, 'E1013:') - - lines =<< trim END vim9script class C this.str: string - def MethodA(this.str) - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1390: Cannot use an object variable "this.str" except with the "new" method') - - lines =<< trim END - vim9script - - class C - this.str: string - def new(str: any) - enddef - endclass - - def Check() - try - var c = C.new(1) - catch - assert_report($'Unexpected exception was caught: {v:exception}') - endtry - enddef - - Check() + this.num: number + def new(this.str, this.num) + enddef + endclass + + def Check() + try + var c = C.new(1, 2) + catch + assert_report($'Unexpected exception was caught: {v:exception}') + endtry + enddef + + Check() + END + v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number', 2) + + lines =<< trim END + vim9script + + class C + this.str: string + this.num: number + def newVals(this.str, this.num) + enddef + endclass + + def Check() + try + var c = C.newVals('dogs', 'apes') + catch + assert_report($'Unexpected exception was caught: {v:exception}') + endtry + enddef + + Check() + END + v9.CheckSourceFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string', 2) + + lines =<< trim END + vim9script + + class C + this.str: string + def new(str: any) + enddef + endclass + + def Check() + try + var c = C.new(1) + catch + assert_report($'Unexpected exception was caught: {v:exception}') + endtry + enddef + + Check() END v9.CheckSourceSuccess(lines) enddef def Test_class_object_member_inits() var lines =<< trim END - vim9script - class TextPosition - this.lnum: number - this.col = 1 - this.addcol: number = 2 - endclass - - var pos = TextPosition.new() - assert_equal(0, pos.lnum) - assert_equal(1, pos.col) - assert_equal(2, pos.addcol) + vim9script + class TextPosition + this.lnum: number + this.col = 1 + this.addcol: number = 2 + endclass + + var pos = TextPosition.new() + assert_equal(0, pos.lnum) + assert_equal(1, pos.col) + assert_equal(2, pos.addcol) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class TextPosition - this.lnum - this.col = 1 - endclass - END - v9.CheckSourceFailure(lines, 'E1022:') + vim9script + class TextPosition + this.lnum + this.col = 1 + endclass + END + v9.CheckSourceFailure(lines, 'E1022: Type or initialization required', 3) # If the type is not specified for a member, then it should be set during # object creation and not when defining the class. lines =<< trim END - vim9script - - var init_count = 0 - def Init(): string - init_count += 1 - return 'foo' - enddef - - class A - this.str1 = Init() - this.str2: string = Init() - this.col = 1 - endclass - - assert_equal(init_count, 0) - var a = A.new() - assert_equal(init_count, 2) + vim9script + + var init_count = 0 + def Init(): string + init_count += 1 + return 'foo' + enddef + + class A + this.str1 = Init() + this.str2: string = Init() + this.col = 1 + endclass + + assert_equal(init_count, 0) + var a = A.new() + assert_equal(init_count, 2) END v9.CheckSourceSuccess(lines) @@ -1044,7 +1033,7 @@ def Test_class_object_member_inits() endclass var a = A.new() END - v9.CheckSourceFailure(lines, 'E1001:') + v9.CheckSourceFailure(lines, 'E1001: Variable not found: init_val', 1) # Test for initializing an object member with an special type lines =<< trim END @@ -1053,35 +1042,35 @@ def Test_class_object_member_inits() this.value: void endclass END - v9.CheckSourceFailure(lines, 'E1330: Invalid type for object variable: void') + v9.CheckSourceFailure(lines, 'E1330: Invalid type for object variable: void', 3) enddef " Test for instance variable access def Test_instance_variable_access() var lines =<< trim END - vim9script - class Triple - this._one = 1 - this.two = 2 - public this.three = 3 - - def GetOne(): number - return this._one - enddef - endclass - - var trip = Triple.new() - assert_equal(1, trip.GetOne()) - assert_equal(2, trip.two) - assert_equal(3, trip.three) - assert_fails('echo trip._one', 'E1333') - - assert_fails('trip._one = 11', 'E1333') - assert_fails('trip.two = 22', 'E1335') - trip.three = 33 - assert_equal(33, trip.three) - - assert_fails('trip.four = 4', 'E1326') + vim9script + class Triple + this._one = 1 + this.two = 2 + public this.three = 3 + + def GetOne(): number + return this._one + enddef + endclass + + var trip = Triple.new() + assert_equal(1, trip.GetOne()) + assert_equal(2, trip.two) + assert_equal(3, trip.three) + assert_fails('echo trip._one', 'E1333: Cannot access private variable: _one') + + assert_fails('trip._one = 11', 'E1333: Cannot access private variable: _one') + assert_fails('trip.two = 22', 'E1335: Variable "two" in class "Triple" is not writable') + trip.three = 33 + assert_equal(33, trip.three) + + assert_fails('trip.four = 4', 'E1326: Variable not found on object "Triple": four') END v9.CheckSourceSuccess(lines) @@ -1092,83 +1081,83 @@ def Test_instance_variable_access() public this._val = 10 endclass END - v9.CheckSourceFailure(lines, 'E1332:') - - lines =<< trim END - vim9script - - class MyCar - this.make: string - this.age = 5 - - def new(make_arg: string) - this.make = make_arg - enddef - - def GetMake(): string - return $"make = {this.make}" - enddef - def GetAge(): number - return this.age - enddef - endclass - - var c = MyCar.new("abc") - assert_equal('make = abc', c.GetMake()) - - c = MyCar.new("def") - assert_equal('make = def', c.GetMake()) - - var c2 = MyCar.new("123") - assert_equal('make = 123', c2.GetMake()) - - def CheckCar() - assert_equal("make = def", c.GetMake()) - assert_equal(5, c.GetAge()) - enddef - CheckCar() + v9.CheckSourceFailure(lines, 'E1332: Public variable name cannot start with underscore: public this._val = 10', 3) + + lines =<< trim END + vim9script + + class MyCar + this.make: string + this.age = 5 + + def new(make_arg: string) + this.make = make_arg + enddef + + def GetMake(): string + return $"make = {this.make}" + enddef + def GetAge(): number + return this.age + enddef + endclass + + var c = MyCar.new("abc") + assert_equal('make = abc', c.GetMake()) + + c = MyCar.new("def") + assert_equal('make = def', c.GetMake()) + + var c2 = MyCar.new("123") + assert_equal('make = 123', c2.GetMake()) + + def CheckCar() + assert_equal("make = def", c.GetMake()) + assert_equal(5, c.GetAge()) + enddef + CheckCar() END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - class MyCar - this.make: string - - def new(make_arg: string) - this.make = make_arg - enddef - endclass - - var c = MyCar.new("abc") - var c = MyCar.new("def") - END - v9.CheckSourceFailure(lines, 'E1041:') - - lines =<< trim END - vim9script - - class Foo - this.x: list = [] - - def Add(n: number): any - this.x->add(n) - return this - enddef - endclass - - echo Foo.new().Add(1).Add(2).x - echo Foo.new().Add(1).Add(2) - .x - echo Foo.new().Add(1) - .Add(2).x - echo Foo.new() - .Add(1).Add(2).x - echo Foo.new() - .Add(1) - .Add(2) - .x + vim9script + + class MyCar + this.make: string + + def new(make_arg: string) + this.make = make_arg + enddef + endclass + + var c = MyCar.new("abc") + var c = MyCar.new("def") + END + v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "c"', 12) + + lines =<< trim END + vim9script + + class Foo + this.x: list = [] + + def Add(n: number): any + this.x->add(n) + return this + enddef + endclass + + echo Foo.new().Add(1).Add(2).x + echo Foo.new().Add(1).Add(2) + .x + echo Foo.new().Add(1) + .Add(2).x + echo Foo.new() + .Add(1).Add(2).x + echo Foo.new() + .Add(1) + .Add(2) + .x END v9.CheckSourceSuccess(lines) @@ -1179,7 +1168,7 @@ def Test_instance_variable_access() pub this.val = 1 endclass END - v9.CheckSourceFailure(lines, 'E1065:') + v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: pub this.val = 1', 3) # Test for "public" keyword must be followed by "this" or "static". lines =<< trim END @@ -1188,7 +1177,7 @@ def Test_instance_variable_access() public val = 1 endclass END - v9.CheckSourceFailure(lines, 'E1331:') + v9.CheckSourceFailure(lines, 'E1331: Public must be followed by "this" or "static"', 3) # Modify a instance variable using the class name in the script context lines =<< trim END @@ -1198,7 +1187,7 @@ def Test_instance_variable_access() endclass A.val = 1 END - v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object', 5) # Read a instance variable using the class name in the script context lines =<< trim END @@ -1208,7 +1197,7 @@ def Test_instance_variable_access() endclass var i = A.val END - v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object', 5) # Modify a instance variable using the class name in a def function lines =<< trim END @@ -1221,7 +1210,7 @@ def Test_instance_variable_access() enddef T() END - v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object', 1) # Read a instance variable using the class name in a def function lines =<< trim END @@ -1234,31 +1223,31 @@ def Test_instance_variable_access() enddef T() END - v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1376: Object variable "val" accessible only using class "A" object', 1) # Access from child class extending a class: lines =<< trim END - vim9script - class A - this.ro_obj_var = 10 - public this.rw_obj_var = 20 - this._priv_obj_var = 30 - endclass - - class B extends A - def Foo() - var x: number - x = this.ro_obj_var - this.ro_obj_var = 0 - x = this.rw_obj_var - this.rw_obj_var = 0 - x = this._priv_obj_var - this._priv_obj_var = 0 - enddef - endclass - - var b = B.new() - b.Foo() + vim9script + class A + this.ro_obj_var = 10 + public this.rw_obj_var = 20 + this._priv_obj_var = 30 + endclass + + class B extends A + def Foo() + var x: number + x = this.ro_obj_var + this.ro_obj_var = 0 + x = this.rw_obj_var + this.rw_obj_var = 0 + x = this._priv_obj_var + this._priv_obj_var = 0 + enddef + endclass + + var b = B.new() + b.Foo() END v9.CheckSourceSuccess(lines) enddef @@ -1272,7 +1261,7 @@ def Test_class_variable_access() stat this.val = 1 endclass END - v9.CheckSourceFailure(lines, 'E1065:') + v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: stat this.val = 1', 3) # Test for "static" cannot be followed by "this". lines =<< trim END @@ -1281,7 +1270,7 @@ def Test_class_variable_access() static this.val = 1 endclass END - v9.CheckSourceFailure(lines, 'E1368: Static cannot be followed by "this" in a variable name') + v9.CheckSourceFailure(lines, 'E1368: Static cannot be followed by "this" in a variable name', 3) # Test for "static" cannot be followed by "public". lines =<< trim END @@ -1290,122 +1279,122 @@ def Test_class_variable_access() static public val = 1 endclass END - v9.CheckSourceFailure(lines, 'E1022: Type or initialization required') + v9.CheckSourceFailure(lines, 'E1022: Type or initialization required', 3) # A readonly class variable cannot be modified from a child class lines =<< trim END - vim9script - class A - static ro_class_var = 40 - endclass - - class B extends A - def Foo() - A.ro_class_var = 50 - enddef - endclass - - var b = B.new() - b.Foo() - END - v9.CheckSourceFailure(lines, 'E1335: Variable "ro_class_var" in class "A" is not writable') + vim9script + class A + static ro_class_var = 40 + endclass + + class B extends A + def Foo() + A.ro_class_var = 50 + enddef + endclass + + var b = B.new() + b.Foo() + END + v9.CheckSourceFailure(lines, 'E1335: Variable "ro_class_var" in class "A" is not writable', 1) # A private class variable cannot be accessed from a child class lines =<< trim END - vim9script - class A - static _priv_class_var = 60 - endclass - - class B extends A - def Foo() - var i = A._priv_class_var - enddef - endclass - - var b = B.new() - b.Foo() - END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var') + vim9script + class A + static _priv_class_var = 60 + endclass + + class B extends A + def Foo() + var i = A._priv_class_var + enddef + endclass + + var b = B.new() + b.Foo() + END + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var', 1) # A private class variable cannot be modified from a child class lines =<< trim END - vim9script - class A - static _priv_class_var = 60 - endclass - - class B extends A - def Foo() - A._priv_class_var = 0 - enddef - endclass - - var b = B.new() - b.Foo() - END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var') + vim9script + class A + static _priv_class_var = 60 + endclass + + class B extends A + def Foo() + A._priv_class_var = 0 + enddef + endclass + + var b = B.new() + b.Foo() + END + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var', 1) # Access from child class extending a class and from script context lines =<< trim END - vim9script - class A - static ro_class_var = 10 - public static rw_class_var = 20 - static _priv_class_var = 30 - endclass - - class B extends A - def Foo() - var x: number - x = A.ro_class_var - assert_equal(10, x) - x = A.rw_class_var - assert_equal(25, x) - A.rw_class_var = 20 - assert_equal(20, A.rw_class_var) - enddef - endclass - - assert_equal(10, A.ro_class_var) - assert_equal(20, A.rw_class_var) - A.rw_class_var = 25 - assert_equal(25, A.rw_class_var) - var b = B.new() - b.Foo() + vim9script + class A + static ro_class_var = 10 + public static rw_class_var = 20 + static _priv_class_var = 30 + endclass + + class B extends A + def Foo() + var x: number + x = A.ro_class_var + assert_equal(10, x) + x = A.rw_class_var + assert_equal(25, x) + A.rw_class_var = 20 + assert_equal(20, A.rw_class_var) + enddef + endclass + + assert_equal(10, A.ro_class_var) + assert_equal(20, A.rw_class_var) + A.rw_class_var = 25 + assert_equal(25, A.rw_class_var) + var b = B.new() + b.Foo() END v9.CheckSourceSuccess(lines) enddef def Test_class_object_compare() var class_lines =<< trim END - vim9script - class Item - this.nr = 0 - this.name = 'xx' - endclass + vim9script + class Item + this.nr = 0 + this.name = 'xx' + endclass END # used at the script level and in a compiled function var test_lines =<< trim END - var i1 = Item.new() - assert_equal(i1, i1) - assert_true(i1 is i1) - var i2 = Item.new() - assert_equal(i1, i2) - assert_false(i1 is i2) - var i3 = Item.new(0, 'xx') - assert_equal(i1, i3) - - var io1 = Item.new(1, 'xx') - assert_notequal(i1, io1) - var io2 = Item.new(0, 'yy') - assert_notequal(i1, io2) + var i1 = Item.new() + assert_equal(i1, i1) + assert_true(i1 is i1) + var i2 = Item.new() + assert_equal(i1, i2) + assert_false(i1 is i2) + var i3 = Item.new(0, 'xx') + assert_equal(i1, i3) + + var io1 = Item.new(1, 'xx') + assert_notequal(i1, io1) + var io2 = Item.new(0, 'yy') + assert_notequal(i1, io2) END v9.CheckSourceSuccess(class_lines + test_lines) v9.CheckSourceSuccess( - class_lines + ['def Test()'] + test_lines + ['enddef', 'Test()']) + class_lines + ['def Test()'] + test_lines + ['enddef', 'Test()']) for op in ['>', '>=', '<', '<=', '=~', '!~'] var op_lines = [ @@ -1413,7 +1402,7 @@ def Test_class_object_compare() 'var i2 = Item.new()', 'echo i1 ' .. op .. ' i2', ] - v9.CheckSourceFailure(class_lines + op_lines, 'E1153: Invalid operation for object') + v9.CheckSourceFailure(class_lines + op_lines, 'E1153: Invalid operation for object', 8) v9.CheckSourceFailure(class_lines + ['def Test()'] + op_lines + ['enddef', 'Test()'], 'E1153: Invalid operation for object') endfor @@ -1421,76 +1410,76 @@ enddef def Test_object_type() var lines =<< trim END - vim9script - - class One - this.one = 1 - endclass - class Two - this.two = 2 - endclass - class TwoMore extends Two - this.more = 9 - endclass - - var o: One = One.new() - var t: Two = Two.new() - var m: TwoMore = TwoMore.new() - var tm: Two = TwoMore.new() - - t = m + vim9script + + class One + this.one = 1 + endclass + class Two + this.two = 2 + endclass + class TwoMore extends Two + this.more = 9 + endclass + + var o: One = One.new() + var t: Two = Two.new() + var m: TwoMore = TwoMore.new() + var tm: Two = TwoMore.new() + + t = m END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - class One - this.one = 1 - endclass - class Two - this.two = 2 - endclass - - var o: One = Two.new() - END - v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got object') - - lines =<< trim END - vim9script - - interface One - def GetMember(): number - endinterface - class Two implements One - this.one = 1 - def GetMember(): number - return this.one - enddef - endclass - - var o: One = Two.new(5) - assert_equal(5, o.GetMember()) + vim9script + + class One + this.one = 1 + endclass + class Two + this.two = 2 + endclass + + var o: One = Two.new() + END + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got object', 10) + + lines =<< trim END + vim9script + + interface One + def GetMember(): number + endinterface + class Two implements One + this.one = 1 + def GetMember(): number + return this.one + enddef + endclass + + var o: One = Two.new(5) + assert_equal(5, o.GetMember()) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - class Num - this.n: number = 0 - endclass - - def Ref(name: string): func(Num): Num - return (arg: Num): Num => { - return eval(name)(arg) - } - enddef - - const Fn = Ref('Double') - var Double = (m: Num): Num => Num.new(m.n * 2) - - echo Fn(Num.new(4)) + vim9script + + class Num + this.n: number = 0 + endclass + + def Ref(name: string): func(Num): Num + return (arg: Num): Num => { + return eval(name)(arg) + } + enddef + + const Fn = Ref('Double') + var Double = (m: Num): Num => Num.new(m.n * 2) + + echo Fn(Num.new(4)) END v9.CheckSourceSuccess(lines) enddef @@ -1498,151 +1487,151 @@ enddef def Test_class_member() # check access rules var lines =<< trim END - vim9script - class TextPos - this.lnum = 1 - this.col = 1 - static counter = 0 - static _secret = 7 - public static anybody = 42 - - static def AddToCounter(nr: number) - counter += nr - enddef - endclass - - assert_equal(0, TextPos.counter) - TextPos.AddToCounter(3) - assert_equal(3, TextPos.counter) - assert_fails('echo TextPos.noSuchMember', 'E1337:') - - def GetCounter(): number - return TextPos.counter - enddef - assert_equal(3, GetCounter()) - - assert_fails('TextPos.noSuchMember = 2', 'E1337:') - assert_fails('TextPos.counter = 5', 'E1335:') - assert_fails('TextPos.counter += 5', 'E1335:') - - assert_fails('echo TextPos._secret', 'E1333:') - assert_fails('TextPos._secret = 8', 'E1333:') - - assert_equal(42, TextPos.anybody) - TextPos.anybody = 12 - assert_equal(12, TextPos.anybody) - TextPos.anybody += 5 - assert_equal(17, TextPos.anybody) + vim9script + class TextPos + this.lnum = 1 + this.col = 1 + static counter = 0 + static _secret = 7 + public static anybody = 42 + + static def AddToCounter(nr: number) + counter += nr + enddef + endclass + + assert_equal(0, TextPos.counter) + TextPos.AddToCounter(3) + assert_equal(3, TextPos.counter) + assert_fails('echo TextPos.noSuchMember', 'E1337: Class variable "noSuchMember" not found in class "TextPos"') + + def GetCounter(): number + return TextPos.counter + enddef + assert_equal(3, GetCounter()) + + assert_fails('TextPos.noSuchMember = 2', 'E1337: Class variable "noSuchMember" not found in class "TextPos"') + assert_fails('TextPos.counter = 5', 'E1335: Variable "counter" in class "TextPos" is not writable') + assert_fails('TextPos.counter += 5', 'E1335: Variable "counter" in class "TextPos" is not writable') + + assert_fails('echo TextPos._secret', 'E1333: Cannot access private variable: _secret') + assert_fails('TextPos._secret = 8', 'E1333: Cannot access private variable: _secret') + + assert_equal(42, TextPos.anybody) + TextPos.anybody = 12 + assert_equal(12, TextPos.anybody) + TextPos.anybody += 5 + assert_equal(17, TextPos.anybody) END v9.CheckSourceSuccess(lines) # example in the help lines =<< trim END - vim9script - class OtherThing - this.size: number - static totalSize: number - - def new(this.size) - totalSize += this.size - enddef - endclass - assert_equal(0, OtherThing.totalSize) - var to3 = OtherThing.new(3) - assert_equal(3, OtherThing.totalSize) - var to7 = OtherThing.new(7) - assert_equal(10, OtherThing.totalSize) + vim9script + class OtherThing + this.size: number + static totalSize: number + + def new(this.size) + totalSize += this.size + enddef + endclass + assert_equal(0, OtherThing.totalSize) + var to3 = OtherThing.new(3) + assert_equal(3, OtherThing.totalSize) + var to7 = OtherThing.new(7) + assert_equal(10, OtherThing.totalSize) END v9.CheckSourceSuccess(lines) # using static class member twice lines =<< trim END - vim9script - - class HTML - static author: string = 'John Doe' - - static def MacroSubstitute(s: string): string - return substitute(s, '{{author}}', author, 'gi') - enddef - endclass - - assert_equal('some text', HTML.MacroSubstitute('some text')) - assert_equal('some text', HTML.MacroSubstitute('some text')) + vim9script + + class HTML + static author: string = 'John Doe' + + static def MacroSubstitute(s: string): string + return substitute(s, '{{author}}', author, 'gi') + enddef + endclass + + assert_equal('some text', HTML.MacroSubstitute('some text')) + assert_equal('some text', HTML.MacroSubstitute('some text')) END v9.CheckSourceSuccess(lines) # access private member in lambda lines =<< trim END - vim9script - - class Foo - this._x: number = 0 - - def Add(n: number): number - const F = (): number => this._x + n - return F() - enddef - endclass - - var foo = Foo.new() - assert_equal(5, foo.Add(5)) + vim9script + + class Foo + this._x: number = 0 + + def Add(n: number): number + const F = (): number => this._x + n + return F() + enddef + endclass + + var foo = Foo.new() + assert_equal(5, foo.Add(5)) END v9.CheckSourceSuccess(lines) # access private member in lambda body lines =<< trim END - vim9script - - class Foo - this._x: number = 6 - - def Add(n: number): number - var Lam = () => { - this._x = this._x + n - } - Lam() - return this._x - enddef - endclass - - var foo = Foo.new() - assert_equal(13, foo.Add(7)) + vim9script + + class Foo + this._x: number = 6 + + def Add(n: number): number + var Lam = () => { + this._x = this._x + n + } + Lam() + return this._x + enddef + endclass + + var foo = Foo.new() + assert_equal(13, foo.Add(7)) END v9.CheckSourceSuccess(lines) # check shadowing lines =<< trim END - vim9script - - class Some - static count = 0 - def Method(count: number) - echo count - enddef - endclass - - var s = Some.new() - s.Method(7) - END - v9.CheckSourceFailure(lines, 'E1340: Argument already declared in the class: count') + vim9script + + class Some + static count = 0 + def Method(count: number) + echo count + enddef + endclass + + var s = Some.new() + s.Method(7) + END + v9.CheckSourceFailure(lines, 'E1340: Argument already declared in the class: count', 5) # Use a local variable in a method with the same name as a class variable lines =<< trim END - vim9script - - class Some - static count = 0 - def Method(arg: number) - var count = 3 - echo arg count - enddef - endclass - - var s = Some.new() - s.Method(7) - END - v9.CheckSourceFailure(lines, 'E1341: Variable already declared in the class: count') + vim9script + + class Some + static count = 0 + def Method(arg: number) + var count = 3 + echo arg count + enddef + endclass + + var s = Some.new() + s.Method(7) + END + v9.CheckSourceFailure(lines, 'E1341: Variable already declared in the class: count', 1) # Test for using an invalid type for a member variable lines =<< trim END @@ -1651,62 +1640,62 @@ def Test_class_member() this.val: xxx endclass END - v9.CheckSourceFailure(lines, 'E1010:') + v9.CheckSourceFailure(lines, 'E1010: Type not recognized: xxx', 3) # Test for setting a member on a null object lines =<< trim END vim9script class A - public this.val: string + public this.val: string endclass def F() - var obj: A - obj.val = "" + var obj: A + obj.val = "" enddef F() END - v9.CheckSourceFailure(lines, 'E1360: Using a null object') + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 2) # Test for accessing a member on a null object lines =<< trim END vim9script class A - this.val: string + this.val: string endclass def F() - var obj: A - echo obj.val + var obj: A + echo obj.val enddef F() END - v9.CheckSourceFailure(lines, 'E1360: Using a null object') + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 2) # Test for setting a member on a null object, at script level lines =<< trim END vim9script class A - public this.val: string + public this.val: string endclass var obj: A obj.val = "" END # FIXME(in source): this should give E1360 as well! - v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got string') + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got string', 7) # Test for accessing a member on a null object, at script level lines =<< trim END vim9script class A - this.val: string + this.val: string endclass var obj: A echo obj.val END - v9.CheckSourceFailure(lines, 'E1360: Using a null object') + v9.CheckSourceFailure(lines, 'E1360: Using a null object', 7) # Test for no space before or after the '=' when initializing a member # variable @@ -1716,14 +1705,14 @@ def Test_class_member() this.val: number= 10 endclass END - v9.CheckSourceFailure(lines, 'E1004:') + v9.CheckSourceFailure(lines, "E1004: White space required before and after '='", 3) lines =<< trim END vim9script class A this.val: number =10 endclass END - v9.CheckSourceFailure(lines, 'E1004:') + v9.CheckSourceFailure(lines, "E1004: White space required before and after '='", 3) # Access a non-existing member lines =<< trim END @@ -1733,49 +1722,49 @@ def Test_class_member() var a = A.new() var v = a.bar END - v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": bar') + v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": bar', 5) enddef func Test_class_garbagecollect() let lines =<< trim END - vim9script - - class Point - this.p = [2, 3] - static pl = ['a', 'b'] - static pd = {a: 'a', b: 'b'} - endclass - - echo Point.pl Point.pd - call test_garbagecollect_now() - echo Point.pl Point.pd + vim9script + + class Point + this.p = [2, 3] + static pl = ['a', 'b'] + static pd = {a: 'a', b: 'b'} + endclass + + echo Point.pl Point.pd + call test_garbagecollect_now() + echo Point.pl Point.pd END call v9.CheckSourceSuccess(lines) let lines =<< trim END - vim9script - - interface View - endinterface - - class Widget - this.view: View - endclass - - class MyView implements View - this.widget: Widget - - def new() - # this will result in a circular reference to this object - this.widget = Widget.new(this) - enddef - endclass - - var view = MyView.new() - - # overwrite "view", will be garbage-collected next - view = MyView.new() - test_garbagecollect_now() + vim9script + + interface View + endinterface + + class Widget + this.view: View + endclass + + class MyView implements View + this.widget: Widget + + def new() + # this will result in a circular reference to this object + this.widget = Widget.new(this) + enddef + endclass + + var view = MyView.new() + + # overwrite "view", will be garbage-collected next + view = MyView.new() + test_garbagecollect_now() END call v9.CheckSourceSuccess(lines) endfunc @@ -1827,26 +1816,26 @@ endfunc def Test_class_method() var lines =<< trim END - vim9script - class Value - this.value = 0 - static objects = 0 - - def new(v: number) - this.value = v - ++objects - enddef - - static def GetCount(): number - return objects - enddef - endclass - - assert_equal(0, Value.GetCount()) - var v1 = Value.new(2) - assert_equal(1, Value.GetCount()) - var v2 = Value.new(7) - assert_equal(2, Value.GetCount()) + vim9script + class Value + this.value = 0 + static objects = 0 + + def new(v: number) + this.value = v + ++objects + enddef + + static def GetCount(): number + return objects + enddef + endclass + + assert_equal(0, Value.GetCount()) + var v1 = Value.new(2) + assert_equal(1, Value.GetCount()) + var v2 = Value.new(7) + assert_equal(2, Value.GetCount()) END v9.CheckSourceSuccess(lines) @@ -1860,7 +1849,7 @@ def Test_class_method() aaa endclass END - v9.CheckSourceFailure(lines, 'E1318:') + v9.CheckSourceFailure(lines, 'E1318: Not a valid command in a class: aaa', 5) # Test for calling a class method from another class method without the class # name prefix. @@ -1888,49 +1877,49 @@ enddef def Test_class_defcompile() var lines =<< trim END - vim9script - - class C - def Fo(i: number): string - return i - enddef - endclass - - defcompile C.Fo - END - v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected string but got number') - - lines =<< trim END - vim9script - - class C - static def Fc(): number - return 'x' - enddef - endclass - - defcompile C.Fc - END - v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got string') - - lines =<< trim END - vim9script - - class C - static def new() - enddef - endclass - - defcompile C.new - END - v9.CheckSourceFailure(lines, 'E1370: Cannot define a "new" method as static') + vim9script + + class C + def Fo(i: number): string + return i + enddef + endclass + + defcompile C.Fo + END + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected string but got number', 1) + + lines =<< trim END + vim9script + + class C + static def Fc(): number + return 'x' + enddef + endclass + + defcompile C.Fc + END + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) + + lines =<< trim END + vim9script + + class C + static def new() + enddef + endclass + + defcompile C.new + END + v9.CheckSourceFailure(lines, 'E1370: Cannot define a "new" method as static', 5) # Trying to compile a function using a non-existing class variable lines =<< trim END vim9script defcompile x.Foo() END - v9.CheckSourceFailure(lines, 'E475:') + v9.CheckSourceFailure(lines, 'E475: Invalid argument: x.Foo()', 2) # Trying to compile a function using a variable which is not a class lines =<< trim END @@ -1938,7 +1927,7 @@ def Test_class_defcompile() var x: number defcompile x.Foo() END - v9.CheckSourceFailure(lines, 'E475:') + v9.CheckSourceFailure(lines, 'E475: Invalid argument: x.Foo()', 3) # Trying to compile a function without specifying the name lines =<< trim END @@ -1947,7 +1936,7 @@ def Test_class_defcompile() endclass defcompile A. END - v9.CheckSourceFailure(lines, 'E475:') + v9.CheckSourceFailure(lines, 'E475: Invalid argument: A.', 4) # Trying to compile a non-existing class object member function lines =<< trim END @@ -1957,115 +1946,115 @@ def Test_class_defcompile() var a = A.new() defcompile a.Foo() END - v9.CheckSourceFailureList(lines, ['E1326:', 'E475:']) + v9.CheckSourceFailureList(lines, ['E1326: Variable not found on object "A": Foo', 'E475: Invalid argument: a.Foo()']) enddef def Test_class_object_to_string() var lines =<< trim END - vim9script - class TextPosition - this.lnum = 1 - this.col = 22 - endclass - - assert_equal("class TextPosition", string(TextPosition)) - - var pos = TextPosition.new() - assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos)) + vim9script + class TextPosition + this.lnum = 1 + this.col = 22 + endclass + + assert_equal("class TextPosition", string(TextPosition)) + + var pos = TextPosition.new() + assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos)) END v9.CheckSourceSuccess(lines) enddef def Test_interface_basics() var lines =<< trim END - vim9script - interface Something - this.ro_var: list - def GetCount(): number - endinterface + vim9script + interface Something + this.ro_var: list + def GetCount(): number + endinterface END v9.CheckSourceSuccess(lines) lines =<< trim END - interface SomethingWrong - static count = 7 - endinterface - END - v9.CheckSourceFailure(lines, 'E1342:') - - lines =<< trim END - vim9script - - interface Some - this.value: number - def Method(value: number) - endinterface + interface SomethingWrong + static count = 7 + endinterface + END + v9.CheckSourceFailure(lines, 'E1342: Interface can only be defined in Vim9 script', 1) + + lines =<< trim END + vim9script + + interface Some + this.value: number + def Method(value: number) + endinterface END # The argument name and the object member name are the same, but this is not a # problem because object members are always accessed with the "this." prefix. v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - interface somethingWrong - static count = 7 - endinterface - END - v9.CheckSourceFailure(lines, 'E1343: Interface name must start with an uppercase letter: somethingWrong') - - lines =<< trim END - vim9script - interface SomethingWrong - this.value: string - this.count = 7 - def GetCount(): number - endinterface - END - v9.CheckSourceFailure(lines, 'E1344:') - - lines =<< trim END - vim9script - interface SomethingWrong - this.value: string - this.count: number - def GetCount(): number - return 5 - enddef - endinterface - END - v9.CheckSourceFailure(lines, 'E1345: Not a valid command in an interface: return 5') - - lines =<< trim END - vim9script - export interface EnterExit - def Enter(): void - def Exit(): void - endinterface + vim9script + interface somethingWrong + static count = 7 + endinterface + END + v9.CheckSourceFailure(lines, 'E1343: Interface name must start with an uppercase letter: somethingWrong', 2) + + lines =<< trim END + vim9script + interface SomethingWrong + this.value: string + this.count = 7 + def GetCount(): number + endinterface + END + v9.CheckSourceFailure(lines, 'E1344: Cannot initialize a variable in an interface', 4) + + lines =<< trim END + vim9script + interface SomethingWrong + this.value: string + this.count: number + def GetCount(): number + return 5 + enddef + endinterface + END + v9.CheckSourceFailure(lines, 'E1345: Not a valid command in an interface: return 5', 6) + + lines =<< trim END + vim9script + export interface EnterExit + def Enter(): void + def Exit(): void + endinterface END writefile(lines, 'XdefIntf.vim', 'D') lines =<< trim END - vim9script - import './XdefIntf.vim' as defIntf - export def With(ee: defIntf.EnterExit, F: func) - ee.Enter() - try - F() - finally - ee.Exit() - endtry - enddef + vim9script + import './XdefIntf.vim' as defIntf + export def With(ee: defIntf.EnterExit, F: func) + ee.Enter() + try + F() + finally + ee.Exit() + endtry + enddef END v9.CheckScriptSuccess(lines) var imported =<< trim END - vim9script - export abstract class EnterExit - def Enter(): void - enddef - def Exit(): void - enddef - endclass + vim9script + export abstract class EnterExit + def Enter(): void + enddef + def Exit(): void + enddef + endclass END writefile(imported, 'XdefIntf2.vim', 'D') @@ -2075,97 +2064,97 @@ enddef def Test_class_implements_interface() var lines =<< trim END - vim9script - - interface Some - this.count: number - def Method(nr: number) - endinterface - - class SomeImpl implements Some - this.count: number - def Method(nr: number) - echo nr - enddef - endclass - - interface Another - this.member: string - endinterface - - class AnotherImpl implements Some, Another - this.member = 'abc' - this.count = 20 - def Method(nr: number) - echo nr - enddef - endclass + vim9script + + interface Some + this.count: number + def Method(nr: number) + endinterface + + class SomeImpl implements Some + this.count: number + def Method(nr: number) + echo nr + enddef + endclass + + interface Another + this.member: string + endinterface + + class AnotherImpl implements Some, Another + this.member = 'abc' + this.count = 20 + def Method(nr: number) + echo nr + enddef + endclass END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - interface Some - this.count: number - endinterface - - class SomeImpl implements Some implements Some - this.count: number - endclass - END - v9.CheckSourceFailure(lines, 'E1350:') - - lines =<< trim END - vim9script - - interface Some - this.count: number - endinterface - - class SomeImpl implements Some, Some - this.count: number - endclass - END - v9.CheckSourceFailure(lines, 'E1351: Duplicate interface after "implements": Some') - - lines =<< trim END - vim9script - - interface Some - this.counter: number - def Method(nr: number) - endinterface - - class SomeImpl implements Some - this.count: number - def Method(nr: number) - echo nr - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1348: Variable "counter" of interface "Some" is not implemented') - - lines =<< trim END - vim9script - - interface Some - this.count: number - def Methods(nr: number) - endinterface - - class SomeImpl implements Some - this.count: number - def Method(nr: number) - echo nr - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1349: Method "Methods" of interface "Some" is not implemented') + vim9script + + interface Some + this.count: number + endinterface + + class SomeImpl implements Some implements Some + this.count: number + endclass + END + v9.CheckSourceFailure(lines, 'E1350: Duplicate "implements"', 7) + + lines =<< trim END + vim9script + + interface Some + this.count: number + endinterface + + class SomeImpl implements Some, Some + this.count: number + endclass + END + v9.CheckSourceFailure(lines, 'E1351: Duplicate interface after "implements": Some', 7) + + lines =<< trim END + vim9script + + interface Some + this.counter: number + def Method(nr: number) + endinterface + + class SomeImpl implements Some + this.count: number + def Method(nr: number) + echo nr + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1348: Variable "counter" of interface "Some" is not implemented', 13) + + lines =<< trim END + vim9script + + interface Some + this.count: number + def Methods(nr: number) + endinterface + + class SomeImpl implements Some + this.count: number + def Method(nr: number) + echo nr + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1349: Method "Methods" of interface "Some" is not implemented', 13) # Check different order of members in class and interface works. lines =<< trim END - vim9script + vim9script interface Result this.label: string @@ -2179,14 +2168,14 @@ def Test_class_implements_interface() this.label: string = 'label' endclass - def Test() - var result: Result = Failure.new() + def Test() + var result: Result = Failure.new() assert_equal('label', result.label) assert_equal(42, result.errpos) enddef - Test() + Test() END v9.CheckSourceSuccess(lines) @@ -2198,7 +2187,7 @@ def Test_class_implements_interface() class B extends A" endclass END - v9.CheckSourceFailure(lines, 'E1315:') + v9.CheckSourceFailure(lines, 'E1315: White space required after name: A"', 4) # Trailing characters after a class name lines =<< trim END @@ -2206,7 +2195,7 @@ def Test_class_implements_interface() class A bbb endclass END - v9.CheckSourceFailure(lines, 'E488:') + v9.CheckSourceFailure(lines, 'E488: Trailing characters: bbb', 2) # using "implements" with a non-existing class lines =<< trim END @@ -2214,7 +2203,7 @@ def Test_class_implements_interface() class A implements B endclass END - v9.CheckSourceFailure(lines, 'E1346:') + v9.CheckSourceFailure(lines, 'E1346: Interface name not found: B', 3) # using "implements" with a regular class lines =<< trim END @@ -2224,7 +2213,7 @@ def Test_class_implements_interface() class B implements A endclass END - v9.CheckSourceFailure(lines, 'E1347:') + v9.CheckSourceFailure(lines, 'E1347: Not a valid interface: A', 5) # using "implements" with a variable lines =<< trim END @@ -2233,7 +2222,7 @@ def Test_class_implements_interface() class A implements T endclass END - v9.CheckSourceFailure(lines, 'E1347:') + v9.CheckSourceFailure(lines, 'E1347: Not a valid interface: T', 4) # implements should be followed by a white space lines =<< trim END @@ -2243,86 +2232,86 @@ def Test_class_implements_interface() class B implements A; endclass END - v9.CheckSourceFailure(lines, 'E1315:') - - lines =<< trim END - vim9script - - interface One - def IsEven(nr: number): bool - endinterface - class Two implements One - def IsEven(nr: number): string - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number): string') - - lines =<< trim END - vim9script - - interface One - def IsEven(nr: number): bool - endinterface - class Two implements One - def IsEven(nr: bool): bool - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(bool): bool') - - lines =<< trim END - vim9script - - interface One - def IsEven(nr: number): bool - endinterface - class Two implements One - def IsEven(nr: number, ...extra: list): bool - enddef - endclass - END - v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number, ...list): bool') + v9.CheckSourceFailure(lines, 'E1315: White space required after name: A;', 4) + + lines =<< trim END + vim9script + + interface One + def IsEven(nr: number): bool + endinterface + class Two implements One + def IsEven(nr: number): string + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number): string', 9) + + lines =<< trim END + vim9script + + interface One + def IsEven(nr: number): bool + endinterface + class Two implements One + def IsEven(nr: bool): bool + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(bool): bool', 9) + + lines =<< trim END + vim9script + + interface One + def IsEven(nr: number): bool + endinterface + class Two implements One + def IsEven(nr: number, ...extra: list): bool + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number, ...list): bool', 9) # access superclass interface members from subclass, mix variable order lines =<< trim END vim9script interface I1 - this.mvar1: number - this.mvar2: number + this.mvar1: number + this.mvar2: number endinterface # NOTE: the order is swapped class A implements I1 - this.mvar2: number - this.mvar1: number - public static svar2: number - public static svar1: number - def new() - svar1 = 11 - svar2 = 12 - this.mvar1 = 111 - this.mvar2 = 112 - enddef + this.mvar2: number + this.mvar1: number + public static svar2: number + public static svar1: number + def new() + svar1 = 11 + svar2 = 12 + this.mvar1 = 111 + this.mvar2 = 112 + enddef endclass class B extends A - def new() - this.mvar1 = 121 - this.mvar2 = 122 - enddef + def new() + this.mvar1 = 121 + this.mvar2 = 122 + enddef endclass class C extends B - def new() - this.mvar1 = 131 - this.mvar2 = 132 - enddef + def new() + this.mvar1 = 131 + this.mvar2 = 132 + enddef endclass def F2(i: I1): list - return [ i.mvar1, i.mvar2 ] + return [ i.mvar1, i.mvar2 ] enddef var oa = A.new() @@ -2341,60 +2330,60 @@ def Test_class_implements_interface() vim9script interface I1 - this.mvar1: number - this.mvar2: number + this.mvar1: number + this.mvar2: number endinterface interface I2 - this.mvar3: number - this.mvar4: number + this.mvar3: number + this.mvar4: number endinterface class A implements I1 - public static svar1: number - public static svar2: number - this.mvar1: number - this.mvar2: number - def new() - svar1 = 11 - svar2 = 12 - this.mvar1 = 111 - this.mvar2 = 112 - enddef + public static svar1: number + public static svar2: number + this.mvar1: number + this.mvar2: number + def new() + svar1 = 11 + svar2 = 12 + this.mvar1 = 111 + this.mvar2 = 112 + enddef endclass class B extends A implements I2 - static svar3: number - static svar4: number - this.mvar3: number - this.mvar4: number - def new() - svar3 = 23 - svar4 = 24 - this.mvar1 = 121 - this.mvar2 = 122 - this.mvar3 = 123 - this.mvar4 = 124 - enddef + static svar3: number + static svar4: number + this.mvar3: number + this.mvar4: number + def new() + svar3 = 23 + svar4 = 24 + this.mvar1 = 121 + this.mvar2 = 122 + this.mvar3 = 123 + this.mvar4 = 124 + enddef endclass class C extends B - public static svar5: number - def new() - svar5 = 1001 - this.mvar1 = 131 - this.mvar2 = 132 - this.mvar3 = 133 - this.mvar4 = 134 - enddef + public static svar5: number + def new() + svar5 = 1001 + this.mvar1 = 131 + this.mvar2 = 132 + this.mvar3 = 133 + this.mvar4 = 134 + enddef endclass def F2(i: I1): list - return [ i.mvar1, i.mvar2 ] + return [ i.mvar1, i.mvar2 ] enddef def F4(i: I2): list - return [ i.mvar3, i.mvar4 ] + return [ i.mvar3, i.mvar4 ] enddef var oa = A.new() @@ -2542,269 +2531,269 @@ def Test_call_interface_method() # No class that implements the interface. lines =<< trim END - vim9script - - interface IWithEE - def Enter(): any - def Exit(): void - endinterface - - def With1(ee: IWithEE, F: func) - var r = ee.Enter() - enddef - - defcompile + vim9script + + interface IWithEE + def Enter(): any + def Exit(): void + endinterface + + def With1(ee: IWithEE, F: func) + var r = ee.Enter() + enddef + + defcompile END v9.CheckSourceSuccess(lines) enddef def Test_class_used_as_type() var lines =<< trim END - vim9script - - class Point - this.x = 0 - this.y = 0 - endclass - - var p: Point - p = Point.new(2, 33) - assert_equal(2, p.x) - assert_equal(33, p.y) + vim9script + + class Point + this.x = 0 + this.y = 0 + endclass + + var p: Point + p = Point.new(2, 33) + assert_equal(2, p.x) + assert_equal(33, p.y) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - interface HasX - this.x: number - endinterface - - class Point implements HasX - this.x = 0 - this.y = 0 - endclass - - var p: Point - p = Point.new(2, 33) - var hx = p - assert_equal(2, hx.x) + vim9script + + interface HasX + this.x: number + endinterface + + class Point implements HasX + this.x = 0 + this.y = 0 + endclass + + var p: Point + p = Point.new(2, 33) + var hx = p + assert_equal(2, hx.x) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - - class Point - this.x = 0 - this.y = 0 - endclass - - var p: Point - p = 'text' - END - v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got string') + vim9script + + class Point + this.x = 0 + this.y = 0 + endclass + + var p: Point + p = 'text' + END + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object but got string', 9) enddef def Test_class_extends() var lines =<< trim END - vim9script - class Base - this.one = 1 - def GetOne(): number - return this.one - enddef - endclass - class Child extends Base - this.two = 2 - def GetTotal(): number - return this.one + this.two - enddef - endclass - var o = Child.new() - assert_equal(1, o.one) - assert_equal(2, o.two) - assert_equal(1, o.GetOne()) - assert_equal(3, o.GetTotal()) + vim9script + class Base + this.one = 1 + def GetOne(): number + return this.one + enddef + endclass + class Child extends Base + this.two = 2 + def GetTotal(): number + return this.one + this.two + enddef + endclass + var o = Child.new() + assert_equal(1, o.one) + assert_equal(2, o.two) + assert_equal(1, o.GetOne()) + assert_equal(3, o.GetTotal()) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class Base - this.one = 1 - endclass - class Child extends Base - this.two = 2 - endclass - var o = Child.new(3, 44) - assert_equal(3, o.one) - assert_equal(44, o.two) + vim9script + class Base + this.one = 1 + endclass + class Child extends Base + this.two = 2 + endclass + var o = Child.new(3, 44) + assert_equal(3, o.one) + assert_equal(44, o.two) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class Base - this.one = 1 - endclass - class Child extends Base extends Base - this.two = 2 - endclass - END - v9.CheckSourceFailure(lines, 'E1352: Duplicate "extends"') - - lines =<< trim END - vim9script - class Child extends BaseClass - this.two = 2 - endclass - END - v9.CheckSourceFailure(lines, 'E1353: Class name not found: BaseClass') - - lines =<< trim END - vim9script - var SomeVar = 99 - class Child extends SomeVar - this.two = 2 - endclass - END - v9.CheckSourceFailure(lines, 'E1354: Cannot extend SomeVar') - - lines =<< trim END - vim9script - class Base - this.name: string - def ToString(): string - return this.name - enddef - endclass - - class Child extends Base - this.age: number - def ToString(): string - return super.ToString() .. ': ' .. this.age - enddef - endclass - - var o = Child.new('John', 42) - assert_equal('John: 42', o.ToString()) + vim9script + class Base + this.one = 1 + endclass + class Child extends Base extends Base + this.two = 2 + endclass + END + v9.CheckSourceFailure(lines, 'E1352: Duplicate "extends"', 5) + + lines =<< trim END + vim9script + class Child extends BaseClass + this.two = 2 + endclass + END + v9.CheckSourceFailure(lines, 'E1353: Class name not found: BaseClass', 4) + + lines =<< trim END + vim9script + var SomeVar = 99 + class Child extends SomeVar + this.two = 2 + endclass + END + v9.CheckSourceFailure(lines, 'E1354: Cannot extend SomeVar', 5) + + lines =<< trim END + vim9script + class Base + this.name: string + def ToString(): string + return this.name + enddef + endclass + + class Child extends Base + this.age: number + def ToString(): string + return super.ToString() .. ': ' .. this.age + enddef + endclass + + var o = Child.new('John', 42) + assert_equal('John: 42', o.ToString()) END v9.CheckSourceSuccess(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.CheckSourceFailure(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.CheckSourceFailure(lines, 'E1356:') - - lines =<< trim END - vim9script - class Base - this.name: string - def ToString(): string - return this.name - enddef - endclass - - var age = 42 + vim9script + class Child + this.age: number + def ToString(): number + return this.age + enddef + def ToString(): string + return this.age + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: ToString', 9) + + 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.CheckSourceFailure(lines, 'E1356: "super" must be followed by a dot', 1) + + lines =<< trim END + vim9script + class Base + this.name: string def ToString(): string - return super.ToString() .. ': ' .. age - enddef - echo ToString() - END - v9.CheckSourceFailure(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.CheckSourceFailure(lines, 'E1358:') - - lines =<< trim END - vim9script - class Base - this.name: string - static def ToString(): string - return 'Base class' - enddef - endclass - - class Child extends Base - this.age: number - def ToString(): string - return Base.ToString() .. ': ' .. this.age - enddef - endclass - - var o = Child.new('John', 42) - assert_equal('Base class: 42', o.ToString()) + return this.name + enddef + endclass + + var age = 42 + def ToString(): string + return super.ToString() .. ': ' .. age + enddef + echo ToString() + END + v9.CheckSourceFailure(lines, 'E1357: Using "super" not in a class method', 1) + + 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.CheckSourceFailure(lines, 'E1358: Using "super" not in a child class', 1) + + lines =<< trim END + vim9script + class Base + this.name: string + static def ToString(): string + return 'Base class' + enddef + endclass + + class Child extends Base + this.age: number + def ToString(): string + return Base.ToString() .. ': ' .. this.age + enddef + endclass + + var o = Child.new('John', 42) + assert_equal('Base class: 42', o.ToString()) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - class Base - this.value = 1 - def new(init: number) - this.value = number + 1 - enddef - endclass - class Child extends Base - def new() - this.new(3) - enddef - endclass - var c = Child.new() - END - v9.CheckSourceFailure(lines, 'E1385: Class method "new" accessible only using class "Child"') + vim9script + class Base + this.value = 1 + def new(init: number) + this.value = number + 1 + enddef + endclass + class Child extends Base + def new() + this.new(3) + enddef + endclass + var c = Child.new() + END + v9.CheckSourceFailure(lines, 'E1385: Class method "new" accessible only using class "Child"', 1) # base class with more than one object member lines =<< trim END - vim9script - - class Result - this.success: bool - this.value: any = null - endclass - - class Success extends Result - def new(this.value = v:none) - this.success = true - enddef - endclass - - var v = Success.new('asdf') - assert_equal("object of Success {success: true, value: 'asdf'}", string(v)) + vim9script + + class Result + this.success: bool + this.value: any = null + endclass + + class Success extends Result + def new(this.value = v:none) + this.success = true + enddef + endclass + + var v = Success.new('asdf') + assert_equal("object of Success {success: true, value: 'asdf'}", string(v)) END v9.CheckSourceSuccess(lines) @@ -2816,7 +2805,7 @@ def Test_class_extends() class B extends A" endclass END - v9.CheckSourceFailure(lines, 'E1315:') + v9.CheckSourceFailure(lines, 'E1315: White space required after name: A"', 4) enddef def Test_using_base_class() @@ -2824,31 +2813,31 @@ def Test_using_base_class() vim9script class BaseEE - def Enter(): any - return null - enddef - def Exit(resource: any): void - enddef + def Enter(): any + return null + enddef + def Exit(resource: any): void + enddef endclass class ChildEE extends BaseEE - def Enter(): any - return 42 - enddef - - def Exit(resource: number): void - g:result ..= '/exit' - enddef + def Enter(): any + return 42 + enddef + + def Exit(resource: number): void + g:result ..= '/exit' + enddef endclass def With(ee: BaseEE) - var r = ee.Enter() - try - g:result ..= r - finally - g:result ..= '/finally' - ee.Exit(r) - endtry + var r = ee.Enter() + try + g:result ..= r + finally + g:result ..= '/finally' + ee.Exit(r) + endtry enddef g:result = '' @@ -2863,16 +2852,16 @@ def Test_using_base_class() vim9script class Base - this.success: bool = false - def Method(arg = 0) - this.success = true - enddef + this.success: bool = false + def Method(arg = 0) + this.success = true + enddef endclass class Child extends Base - def new() - super.Method() - enddef + def new() + super.Method() + enddef endclass var obj = Child.new() @@ -2883,63 +2872,63 @@ enddef def Test_class_import() var lines =<< trim END - vim9script - export class Animal - this.kind: string - this.name: string - endclass + vim9script + export class Animal + this.kind: string + this.name: string + endclass END writefile(lines, 'Xanimal.vim', 'D') lines =<< trim END - vim9script - import './Xanimal.vim' as animal - - var a: animal.Animal - a = animal.Animal.new('fish', 'Eric') - assert_equal('fish', a.kind) - assert_equal('Eric', a.name) - - var b: animal.Animal = animal.Animal.new('cat', 'Garfield') - assert_equal('cat', b.kind) - assert_equal('Garfield', b.name) + vim9script + import './Xanimal.vim' as animal + + var a: animal.Animal + a = animal.Animal.new('fish', 'Eric') + assert_equal('fish', a.kind) + assert_equal('Eric', a.name) + + var b: animal.Animal = animal.Animal.new('cat', 'Garfield') + assert_equal('cat', b.kind) + assert_equal('Garfield', b.name) END v9.CheckScriptSuccess(lines) enddef def Test_abstract_class() var lines =<< trim END - vim9script - abstract class Base - this.name: string - endclass - class Person extends Base - this.age: number - endclass - var p: Base = Person.new('Peter', 42) - assert_equal('Peter', p.name) - assert_equal(42, p.age) + vim9script + abstract class Base + this.name: string + endclass + class Person extends Base + this.age: number + endclass + var p: Base = Person.new('Peter', 42) + assert_equal('Peter', p.name) + assert_equal(42, p.age) END v9.CheckSourceSuccess(lines) lines =<< trim END - vim9script - abstract class Base - this.name: string - endclass - class Person extends Base - this.age: number - endclass - var p = Base.new('Peter') - END - v9.CheckSourceFailure(lines, 'E1325: Method not found on class "Base": new') - - lines =<< trim END - abstract class Base - this.name: string - endclass - END - v9.CheckSourceFailure(lines, 'E1316:') + vim9script + abstract class Base + this.name: string + endclass + class Person extends Base + this.age: number + endclass + var p = Base.new('Peter') + END + v9.CheckSourceFailure(lines, 'E1325: Method not found on class "Base": new', 8) + + lines =<< trim END + abstract class Base + this.name: string + endclass + END + v9.CheckSourceFailure(lines, 'E1316: Class can only be defined in Vim9 script', 1) # Abstract class cannot have a "new" function lines =<< trim END @@ -2949,112 +2938,112 @@ def Test_abstract_class() enddef endclass END - v9.CheckSourceFailure(lines, 'E1359:') + v9.CheckSourceFailure(lines, 'E1359: Cannot define a "new" method in an abstract class', 4) enddef def Test_closure_in_class() var lines =<< trim END - vim9script - - class Foo - this.y: list = ['B'] - - def new() - g:result = filter(['A', 'B'], (_, v) => index(this.y, v) == -1) - enddef - endclass - - Foo.new() - assert_equal(['A'], g:result) + vim9script + + class Foo + this.y: list = ['B'] + + def new() + g:result = filter(['A', 'B'], (_, v) => index(this.y, v) == -1) + enddef + endclass + + Foo.new() + assert_equal(['A'], g:result) END v9.CheckSourceSuccess(lines) enddef def Test_call_constructor_from_legacy() var lines =<< trim END - vim9script - - var newCalled = 'false' - - class A - def new() - newCalled = 'true' - enddef - endclass - - export def F(options = {}): any - return A - enddef - - g:p = F() - legacy call p.new() - assert_equal('true', newCalled) + vim9script + + var newCalled = 'false' + + class A + def new() + newCalled = 'true' + enddef + endclass + + export def F(options = {}): any + return A + enddef + + g:p = F() + legacy call p.new() + assert_equal('true', newCalled) END v9.CheckSourceSuccess(lines) enddef def Test_defer_with_object() var lines =<< trim END - vim9script - - class CWithEE - def Enter() - g:result ..= "entered/" - enddef - def Exit() - g:result ..= "exited" - enddef - endclass - - def With(ee: CWithEE, F: func) - ee.Enter() - defer ee.Exit() - F() - enddef - - g:result = '' - var obj = CWithEE.new() - obj->With(() => { - g:result ..= "called/" - }) - assert_equal('entered/called/exited', g:result) + vim9script + + class CWithEE + def Enter() + g:result ..= "entered/" + enddef + def Exit() + g:result ..= "exited" + enddef + endclass + + def With(ee: CWithEE, F: func) + ee.Enter() + defer ee.Exit() + F() + enddef + + g:result = '' + var obj = CWithEE.new() + obj->With(() => { + g:result ..= "called/" + }) + assert_equal('entered/called/exited', g:result) END v9.CheckSourceSuccess(lines) unlet g:result lines =<< trim END - vim9script - - class BaseWithEE - def Enter() - g:result ..= "entered-base/" - enddef - def Exit() - g:result ..= "exited-base" - enddef - endclass - - class CWithEE extends BaseWithEE - def Enter() - g:result ..= "entered-child/" - enddef - def Exit() - g:result ..= "exited-child" - enddef - endclass - - def With(ee: BaseWithEE, F: func) - ee.Enter() - defer ee.Exit() - F() - enddef - - g:result = '' - var obj = CWithEE.new() - obj->With(() => { - g:result ..= "called/" - }) - assert_equal('entered-child/called/exited-child', g:result) + vim9script + + class BaseWithEE + def Enter() + g:result ..= "entered-base/" + enddef + def Exit() + g:result ..= "exited-base" + enddef + endclass + + class CWithEE extends BaseWithEE + def Enter() + g:result ..= "entered-child/" + enddef + def Exit() + g:result ..= "exited-child" + enddef + endclass + + def With(ee: BaseWithEE, F: func) + ee.Enter() + defer ee.Exit() + F() + enddef + + g:result = '' + var obj = CWithEE.new() + obj->With(() => { + g:result ..= "called/" + }) + assert_equal('entered-child/called/exited-child', g:result) END v9.CheckSourceSuccess(lines) unlet g:result @@ -3346,9 +3335,9 @@ def Test_stack_expansion_with_methods() vim9script class C - def M1() - F0() - enddef + def M1() + F0() + enddef endclass def F0() @@ -3356,7 +3345,7 @@ def Test_stack_expansion_with_methods() enddef def F() - C.new().M1() + C.new().M1() enddef F() @@ -3442,7 +3431,7 @@ def Test_new_return_type() enddef endclass END - v9.CheckSourceFailure(lines, 'E1365:') + v9.CheckSourceFailure(lines, 'E1365: Cannot use a return type with the "new" method', 11) # new() uses 'Dict' return type and returns a Dict lines =<< trim END @@ -3460,7 +3449,7 @@ def Test_new_return_type() var c = C.new() assert_equal('object', typename(c)) END - v9.CheckSourceFailure(lines, 'E1365:') + v9.CheckSourceFailure(lines, 'E1365: Cannot use a return type with the "new" method', 9) enddef " Test for checking a member initialization type at run time. @@ -3471,22 +3460,22 @@ def Test_runtime_type_check_for_member_i var retnum: bool = false def F(): any - retnum = !retnum - if retnum - return 1 - else - return "hello" - endif + retnum = !retnum + if retnum + return 1 + else + return "hello" + endif enddef class C - this._foo: bool = F() + this._foo: bool = F() endclass var c1 = C.new() var c2 = C.new() END - v9.CheckSourceFailure(lines, 'E1012:') + v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected bool but got string', 0) enddef " Test for locking a variable referring to an object and reassigning to another @@ -3540,7 +3529,7 @@ def Test_private_object_method() var a = A.new() a._Foo() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 9) # Try calling a private method using an object (from a def function) lines =<< trim END @@ -3557,7 +3546,7 @@ def Test_private_object_method() enddef T() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 2) # Use a private method from another object method (in script context) lines =<< trim END @@ -3611,7 +3600,7 @@ def Test_private_object_method() var a = A.new() a.Bar() END - v9.CheckSourceFailure(lines, 'E117: Unknown function: _Foo') + v9.CheckSourceFailure(lines, 'E117: Unknown function: _Foo', 1) # Try calling a private method using the class name lines =<< trim END @@ -3624,7 +3613,7 @@ def Test_private_object_method() endclass A._Foo() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo', 8) # Define two private methods with the same name lines =<< trim END @@ -3638,7 +3627,7 @@ def Test_private_object_method() endclass var a = A.new() END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo', 7) # Define a private method and a object method with the same name lines =<< trim END @@ -3652,7 +3641,7 @@ def Test_private_object_method() endclass var a = A.new() END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo', 7) # Define an object method and a private method with the same name lines =<< trim END @@ -3666,7 +3655,7 @@ def Test_private_object_method() endclass var a = A.new() END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo', 7) # Call a public method and a private method from a private method lines =<< trim END @@ -3710,7 +3699,7 @@ def Test_private_object_method() var b = B.new() b.Foo() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 2) # Call a private object method from a child class object method lines =<< trim END @@ -3753,7 +3742,7 @@ def Test_private_object_method() var c = C.new() assert_equal(1234, c._Foo()) END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 16) # Using "_" prefix in a method name should fail outside of a class lines =<< trim END @@ -3763,7 +3752,7 @@ def Test_private_object_method() enddef var a = _Foo() END - v9.CheckSourceFailure(lines, 'E1267: Function name must start with a capital: _Foo(): number') + v9.CheckSourceFailure(lines, 'E1267: Function name must start with a capital: _Foo(): number', 2) enddef " Test for an private class method @@ -3779,7 +3768,7 @@ def Test_private_class_method() endclass A._Foo() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 8) # Try calling a class private method (from a def function) lines =<< trim END @@ -3795,7 +3784,7 @@ def Test_private_class_method() enddef T() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 1) # Try calling a class private method using an object (at the script level) lines =<< trim END @@ -3809,7 +3798,7 @@ def Test_private_class_method() var a = A.new() a._Foo() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo', 9) # Try calling a class private method using an object (from a def function) lines =<< trim END @@ -3826,7 +3815,7 @@ def Test_private_class_method() enddef T() END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo', 2) # Use a class private method from an object method lines =<< trim END @@ -3878,7 +3867,7 @@ def Test_private_class_method() endclass var a = A.new() END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo', 7) # Try calling a class private method from another class lines =<< trim END @@ -3897,7 +3886,7 @@ def Test_private_class_method() var b = B.new() assert_equal(1234, b.Foo()) END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 1) # Call a private class method from a child class object method lines =<< trim END @@ -3919,7 +3908,7 @@ def Test_private_class_method() var c = C.new() assert_equal(1234, c.Baz()) END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 1) # Call a private class method from a child class private class method lines =<< trim END @@ -3940,7 +3929,7 @@ def Test_private_class_method() endclass assert_equal(1234, C.Baz()) END - v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()') + v9.CheckSourceFailure(lines, 'E1366: Cannot access private method: _Foo()', 1) # Call a private class method from a child class object lines =<< trim END @@ -3961,7 +3950,7 @@ def Test_private_class_method() var c = C.new() assert_equal(1234, C._Foo()) END - v9.CheckSourceFailure(lines, 'E1325: Method not found on class "C": _Foo') + v9.CheckSourceFailure(lines, 'E1325: Method not found on class "C": _Foo', 16) enddef " Test for using the return value of a class/object method as a function @@ -4017,35 +4006,35 @@ def Test_static_inheritence() vim9script class A - static _svar: number - this._mvar: number - def new() - _svar = 1 - this._mvar = 101 - enddef - def AccessObject(): number - return this._mvar - enddef - def AccessStaticThroughObject(): number - return _svar - enddef + static _svar: number + this._mvar: number + def new() + _svar = 1 + this._mvar = 101 + enddef + def AccessObject(): number + return this._mvar + enddef + def AccessStaticThroughObject(): number + return _svar + enddef endclass class B extends A - def new() - this._mvar = 102 - enddef + def new() + this._mvar = 102 + enddef endclass class C extends B - def new() - this._mvar = 103 - enddef - - def AccessPrivateStaticThroughClassName(): number - assert_equal(1, A._svar) - return 444 - enddef + def new() + this._mvar = 103 + enddef + + def AccessPrivateStaticThroughClassName(): number + assert_equal(1, A._svar) + return 444 + enddef endclass var oa = A.new() @@ -4075,7 +4064,7 @@ def Test_dup_member_variable() this.val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val', 4) # Duplicate private member variable lines =<< trim END @@ -4085,7 +4074,7 @@ def Test_dup_member_variable() this._val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val', 4) # Duplicate public member variable lines =<< trim END @@ -4095,7 +4084,7 @@ def Test_dup_member_variable() public this.val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val', 4) # Duplicate private member variable lines =<< trim END @@ -4105,7 +4094,7 @@ def Test_dup_member_variable() this._val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val', 4) # Duplicate public and private member variable lines =<< trim END @@ -4115,7 +4104,7 @@ def Test_dup_member_variable() public this.val = 10 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val', 4) # Duplicate class member variable lines =<< trim END @@ -4125,7 +4114,7 @@ def Test_dup_member_variable() static _s: string = "def" endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s', 4) # Duplicate public and private class member variable lines =<< trim END @@ -4135,7 +4124,7 @@ def Test_dup_member_variable() static _s: string = "def" endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _s', 4) # Duplicate class and object member variable lines =<< trim END @@ -4164,7 +4153,7 @@ def Test_dup_member_variable() this.val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val', 9) # Duplicate object private member variable in a derived class lines =<< trim END @@ -4178,7 +4167,7 @@ def Test_dup_member_variable() this._val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val', 9) # Duplicate object private member variable in a derived class lines =<< trim END @@ -4192,7 +4181,7 @@ def Test_dup_member_variable() this._val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: _val', 9) # Duplicate object member variable in a derived class lines =<< trim END @@ -4206,7 +4195,7 @@ def Test_dup_member_variable() this.val = 20 endclass END - v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val') + v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: val', 9) # Two member variables with a common prefix lines =<< trim END @@ -4236,7 +4225,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val') + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val', 2) # access a non-existing private object member variable lines =<< trim END @@ -4250,7 +4239,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": _a') + v9.CheckSourceFailure(lines, 'E1326: Variable not found on object "A": _a', 2) # private static member variable lines =<< trim END @@ -4264,7 +4253,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"', 2) # private static member variable lines =<< trim END @@ -4278,7 +4267,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "_val" accessible only using class "A"', 2) # private static class variable lines =<< trim END @@ -4291,7 +4280,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val') + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val', 1) # private static class variable lines =<< trim END @@ -4304,7 +4293,7 @@ def Test_private_member_access_outside_c enddef T() END - v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val') + v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _val', 1) enddef " Test for changing the member access of an interface in a implementation class @@ -4318,7 +4307,7 @@ def Test_change_interface_member_access( public this.val = 10 endclass END - v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different') + v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different', 7) lines =<< trim END vim9script @@ -4329,7 +4318,7 @@ def Test_change_interface_member_access( public this.val = 10 endclass END - v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different') + v9.CheckSourceFailure(lines, 'E1367: Access level of variable "val" of interface "A" is different', 7) enddef " Test for trying to change a readonly member from a def function @@ -4345,7 +4334,7 @@ def Test_readonly_member_change_in_def_f enddef T() END - v9.CheckSourceFailure(lines, 'E1335: Variable "val" in class "A" is not writable') + v9.CheckSourceFailure(lines, 'E1335: Variable "val" in class "A" is not writable', 2) enddef " Test for reading and writing a class member from a def function @@ -4407,7 +4396,7 @@ def Test_class_variable_access_using_obj var a = A.new() echo a.svar2 END - v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"', 8) # Cannot write to a class variable using an object in script context lines =<< trim END @@ -4420,7 +4409,7 @@ def Test_class_variable_access_using_obj var a = A.new() a.svar2 = [2] END - v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"', 8) # Cannot read from a class variable using an object in def method context lines =<< trim END @@ -4436,7 +4425,7 @@ def Test_class_variable_access_using_obj enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"', 2) # Cannot write to a class variable using an object in def method context lines =<< trim END @@ -4452,7 +4441,7 @@ def Test_class_variable_access_using_obj enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "svar2" accessible only using class "A"', 2) enddef " Test for using a interface method using a child object @@ -4566,7 +4555,7 @@ def Test_abstract_method() class B extends A endclass END - v9.CheckSourceFailure(lines, 'E1373: Abstract method "Foo" is not implemented') + v9.CheckSourceFailure(lines, 'E1373: Abstract method "Foo" is not implemented', 6) # Use abstract method in a concrete class lines =<< trim END @@ -4577,7 +4566,7 @@ def Test_abstract_method() class B extends A endclass END - v9.CheckSourceFailure(lines, 'E1372: Abstract method "abstract def Foo()" cannot be defined in a concrete class') + v9.CheckSourceFailure(lines, 'E1372: Abstract method "abstract def Foo()" cannot be defined in a concrete class', 3) # Use abstract method in an interface lines =<< trim END @@ -4599,7 +4588,7 @@ def Test_abstract_method() abs def Foo() endclass END - v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: abs def Foo()') + v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: abs def Foo()', 3) # Use "abstract" with a member variable lines =<< trim END @@ -4608,7 +4597,7 @@ def Test_abstract_method() abstract this.val = 10 endclass END - v9.CheckSourceFailure(lines, 'E1371: Abstract must be followed by "def" or "static"') + v9.CheckSourceFailure(lines, 'E1371: Abstract must be followed by "def" or "static"', 3) # Use a static abstract method lines =<< trim END @@ -4637,7 +4626,7 @@ def Test_abstract_method() enddef endclass END - v9.CheckSourceFailure(lines, 'E1383: Method "Foo": type mismatch, expected func(string, number): list but got func(number, string): list') + v9.CheckSourceFailure(lines, 'E1383: Method "Foo": type mismatch, expected func(string, number): list but got func(number, string): list', 9) # Use an abstract class to invoke an abstract method # FIXME: This should fail @@ -4691,7 +4680,7 @@ def Test_class_method_call_from_subclass var b = B.new() b.Bar() END - v9.CheckSourceFailure(lines, 'E1384: Class method "Foo" accessible only inside class "A"') + v9.CheckSourceFailure(lines, 'E1384: Class method "Foo" accessible only inside class "A"', 1) enddef " Test for calling a class method using an object in a def function context and @@ -4735,7 +4724,7 @@ def Test_class_method_call_using_object( var a = A.new() assert_equal('foo', a.Foo()) END - v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"', 9) # def function context lines =<< trim END @@ -4752,7 +4741,7 @@ def Test_class_method_call_using_object( enddef T() END - v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1385: Class method "Foo" accessible only using class "A"', 2) enddef def Test_class_variable() @@ -4805,7 +4794,7 @@ def Test_class_variable() endclass B.ClassFunc() END - v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"') + v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"', 1) # Reading a parent class variable from a child class method lines =<< trim END @@ -4822,7 +4811,7 @@ def Test_class_variable() endclass B.ClassFunc() END - v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"') + v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"', 1) # Modifying a parent class variable from a child object method lines =<< trim END @@ -4840,7 +4829,7 @@ def Test_class_variable() var b = B.new() b.ObjFunc() END - v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"') + v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"', 1) # Reading a parent class variable from a child object method lines =<< trim END @@ -4858,7 +4847,7 @@ def Test_class_variable() var b = B.new() b.ObjFunc() END - v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"') + v9.CheckSourceFailure(lines, 'E1374: Class variable "val" accessible only inside class "A"', 1) # Modifying a class variable using an object at script level lines =<< trim END @@ -4870,7 +4859,7 @@ def Test_class_variable() var a = A.new() a.val = 20 END - v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"', 7) # Reading a class variable using an object at script level lines =<< trim END @@ -4882,7 +4871,7 @@ def Test_class_variable() var a = A.new() var i = a.val END - v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"', 7) # Modifying a class variable using an object at function level lines =<< trim END @@ -4898,7 +4887,7 @@ def Test_class_variable() enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"', 2) # Reading a class variable using an object at function level lines =<< trim END @@ -4913,7 +4902,7 @@ def Test_class_variable() enddef T() END - v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"') + v9.CheckSourceFailure(lines, 'E1375: Class variable "val" accessible only using class "A"', 2) enddef " Test for using a duplicate class method and class variable in a child class @@ -5012,7 +5001,7 @@ def Test_instance_method_call_using_clas endclass A.Foo() END - v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object', 7) # Invoke an object method using a class in def function context lines =<< trim END @@ -5027,7 +5016,7 @@ def Test_instance_method_call_using_clas enddef T() END - v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object') + v9.CheckSourceFailure(lines, 'E1386: Object method "Foo" accessible only using class "A" object', 1) enddef " Test for duplicate class method and instance method @@ -5042,7 +5031,7 @@ def Test_dup_classmethod_objmethod() enddef endclass END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo', 6) # Duplicate private instance method lines =<< trim END @@ -5054,7 +5043,7 @@ def Test_dup_classmethod_objmethod() enddef endclass END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo', 6) # Duplicate class method lines =<< trim END @@ -5066,7 +5055,7 @@ def Test_dup_classmethod_objmethod() enddef endclass END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: Foo', 6) # Duplicate private class method lines =<< trim END @@ -5078,7 +5067,7 @@ def Test_dup_classmethod_objmethod() enddef endclass END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo', 6) # Duplicate private class and object method lines =<< trim END @@ -5090,7 +5079,7 @@ def Test_dup_classmethod_objmethod() enddef endclass END - v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo') + v9.CheckSourceFailure(lines, 'E1355: Duplicate function: _Foo', 6) enddef " Test for an instance method access level comparison with parent instance @@ -5110,7 +5099,7 @@ def Test_instance_method_access_level() enddef endclass END - v9.CheckSourceFailure(lines, 'E1377: Access level of method "_Foo" is different in class "A"') + v9.CheckSourceFailure(lines, 'E1377: Access level of method "_Foo" is different in class "A"', 11) # Public method in subclass lines =<< trim END @@ -5126,7 +5115,7 @@ def Test_instance_method_access_level() enddef endclass END - v9.CheckSourceFailure(lines, 'E1377: Access level of method "Foo" is different in class "A"') + v9.CheckSourceFailure(lines, 'E1377: Access level of method "Foo" is different in class "A"', 11) enddef def Test_extend_empty_class() @@ -5164,7 +5153,7 @@ def Test_interface_with_unsupported_memb static num: number endinterface END - v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface') + v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface', 3) lines =<< trim END vim9script @@ -5172,7 +5161,7 @@ def Test_interface_with_unsupported_memb static _num: number endinterface END - v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface') + v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface', 3) lines =<< trim END vim9script @@ -5180,7 +5169,7 @@ def Test_interface_with_unsupported_memb public static num: number endinterface END - v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface') + v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface', 3) lines =<< trim END vim9script @@ -5188,7 +5177,7 @@ def Test_interface_with_unsupported_memb public static num: number endinterface END - v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface') + v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface', 3) lines =<< trim END vim9script @@ -5196,7 +5185,7 @@ def Test_interface_with_unsupported_memb static _num: number endinterface END - v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface') + v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface', 3) lines =<< trim END vim9script @@ -5204,7 +5193,7 @@ def Test_interface_with_unsupported_memb static def Foo(d: dict): list endinterface END - v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface') + v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface', 3) lines =<< trim END vim9script @@ -5212,7 +5201,7 @@ def Test_interface_with_unsupported_memb static def _Foo(d: dict): list endinterface END - v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface') + v9.CheckSourceFailure(lines, 'E1378: Static member not supported in an interface', 3) lines =<< trim END vim9script @@ -5220,7 +5209,7 @@ def Test_interface_with_unsupported_memb this._Foo: list endinterface END - v9.CheckSourceFailure(lines, 'E1379: Private variable not supported in an interface') + v9.CheckSourceFailure(lines, 'E1379: Private variable not supported in an interface', 3) lines =<< trim END vim9script @@ -5228,7 +5217,7 @@ def Test_interface_with_unsupported_memb def _Foo(d: dict): list endinterface END - v9.CheckSourceFailure(lines, 'E1380: Private method not supported in an interface') + v9.CheckSourceFailure(lines, 'E1380: Private method not supported in an interface', 3) enddef " Test for extending an interface @@ -5266,7 +5255,7 @@ def Test_extend_interface() this.var2 = {a: '1'} endclass END - v9.CheckSourceFailure(lines, 'E1349: Method "Foo" of interface "A" is not implemented') + v9.CheckSourceFailure(lines, 'E1349: Method "Foo" of interface "A" is not implemented', 10) lines =<< trim END vim9script @@ -5281,7 +5270,7 @@ def Test_extend_interface() enddef endclass END - v9.CheckSourceFailure(lines, 'E1348: Variable "var2" of interface "B" is not implemented') + v9.CheckSourceFailure(lines, 'E1348: Variable "var2" of interface "B" is not implemented', 11) # interface cannot extend a class lines =<< trim END @@ -5291,7 +5280,7 @@ def Test_extend_interface() interface B extends A endinterface END - v9.CheckSourceFailure(lines, 'E1354: Cannot extend A') + v9.CheckSourceFailure(lines, 'E1354: Cannot extend A', 5) # class cannot extend an interface lines =<< trim END @@ -5301,7 +5290,7 @@ def Test_extend_interface() class B extends A endclass END - v9.CheckSourceFailure(lines, 'E1354: Cannot extend A') + v9.CheckSourceFailure(lines, 'E1354: Cannot extend A', 5) # interface cannot implement another interface lines =<< trim END @@ -5311,7 +5300,7 @@ def Test_extend_interface() interface B implements A endinterface END - v9.CheckSourceFailure(lines, 'E1381: Interface cannot use "implements"') + v9.CheckSourceFailure(lines, 'E1381: Interface cannot use "implements"', 4) # interface cannot extend multiple interfaces lines =<< trim END @@ -5323,7 +5312,7 @@ def Test_extend_interface() interface C extends A, B endinterface END - v9.CheckSourceFailure(lines, 'E1315: White space required after name: A, B') + v9.CheckSourceFailure(lines, 'E1315: White space required after name: A, B', 6) # Variable type in an extended interface is of different type lines =<< trim END @@ -5339,7 +5328,7 @@ def Test_extend_interface() this.val2: number endinterface END - v9.CheckSourceFailure(lines, 'E1382: Variable "val1": type mismatch, expected number but got string') + v9.CheckSourceFailure(lines, 'E1382: Variable "val1": type mismatch, expected number but got string', 11) enddef " Test for a child class implementing an interface when some of the methods are @@ -5436,7 +5425,7 @@ def Test_child_class_implements_interfac enddef endclass END - v9.CheckSourceFailure(lines, 'E1349: Method "F3" of interface "Intf" is not implemented') + v9.CheckSourceFailure(lines, 'E1349: Method "F3" of interface "Intf" is not implemented', 26) # One of the interface methods is of different type lines =<< trim END @@ -5470,7 +5459,7 @@ def Test_child_class_implements_interfac enddef endclass END - v9.CheckSourceFailure(lines, 'E1383: Method "F3": type mismatch, expected func() but got func(): number') + v9.CheckSourceFailure(lines, 'E1383: Method "F3": type mismatch, expected func() but got func(): number', 29) # One of the interface variables is not present lines =<< trim END @@ -5496,7 +5485,7 @@ def Test_child_class_implements_interfac this.var1 = [{a: 10}] endclass END - v9.CheckSourceFailure(lines, 'E1348: Variable "var3" of interface "Intf" is not implemented') + v9.CheckSourceFailure(lines, 'E1348: Variable "var3" of interface "Intf" is not implemented', 21) # One of the interface variables is of different type lines =<< trim END @@ -5523,7 +5512,7 @@ def Test_child_class_implements_interfac this.var1 = [{a: 10}] endclass END - v9.CheckSourceFailure(lines, 'E1382: Variable "var3": type mismatch, expected list> but got list>') + v9.CheckSourceFailure(lines, 'E1382: Variable "var3": type mismatch, expected list> but got list>', 22) enddef " Test for extending an interface with duplicate variables and methods @@ -5594,7 +5583,7 @@ def Test_implements_using_var_type_any() endclass var b = B.new() END - v9.CheckSourceFailure(lines, 'E1382: Variable "val": type mismatch, expected list> but got dict') + v9.CheckSourceFailure(lines, 'E1382: Variable "val": type mismatch, expected list> but got dict', 1) enddef " Test for assigning to a member variable in a nested class @@ -5603,29 +5592,29 @@ def Test_nested_object_assignment() vim9script class A - this.value: number + this.value: number endclass class B - this.a: A = A.new() + this.a: A = A.new() endclass class C - this.b: B = B.new() + this.b: B = B.new() endclass class D - this.c: C = C.new() + this.c: C = C.new() endclass def T(da: D) - da.c.b.a.value = 10 + da.c.b.a.value = 10 enddef var d = D.new() T(d) END - v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "A" is not writable') + v9.CheckSourceFailure(lines, 'E1335: Variable "value" in class "A" is not writable', 1) enddef " Test for calling methods using a null object diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1951, +/**/ 1950, /**/ 1949, diff --git a/src/vim9class.c b/src/vim9class.c --- a/src/vim9class.c +++ b/src/vim9class.c @@ -1577,7 +1577,7 @@ early_ret: } if (!is_class) { - emsg(_(e_public_member_not_supported_in_interface)); + emsg(_(e_public_variable_not_supported_in_interface)); break; } has_public = TRUE;