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 <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
diff --git a/src/errors.h b/src/errors.h
index 975e033..ed4208d 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -2396,6 +2396,7 @@
#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 @@
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 @@
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 @@
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 @@
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
index 681f614..c643457 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -6,151 +6,151 @@
def Test_class_basic()
# Class supported only in "vim9script"
var lines =<< trim END
- class NotWorking
- endclass
+ class NotWorking
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1316:')
+ 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
+ vim9script
+ class notWorking
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1314:')
+ 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
+ vim9script
+ class Not@working
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1315:')
+ 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
+ vim9script
+ abstract noclass Something
+ endclass
END
- v9.CheckSourceFailure(lines, 'E475:')
+ 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
+ vim9script
+ abstract classy Something
+ endclass
END
- v9.CheckSourceFailure(lines, 'E475:')
+ v9.CheckSourceFailure(lines, 'E475: Invalid argument: classy Something', 2)
# The complete "endclass" should be specified.
lines =<< trim END
- vim9script
- class Something
- endcl
+ vim9script
+ class Something
+ endcl
END
- v9.CheckSourceFailure(lines, 'E1065:')
+ v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: endcl', 3)
# Additional words after "endclass"
lines =<< trim END
- vim9script
- class Something
- endclass school's out
+ vim9script
+ class Something
+ endclass school's out
END
- v9.CheckSourceFailure(lines, 'E488:')
+ v9.CheckSourceFailure(lines, "E488: Trailing characters: school's out", 3)
# Additional commands after "endclass"
lines =<< trim END
- vim9script
- class Something
- endclass | echo 'done'
+ vim9script
+ class Something
+ endclass | echo 'done'
END
- v9.CheckSourceFailure(lines, 'E488:')
+ v9.CheckSourceFailure(lines, "E488: Trailing characters: | echo 'done'", 3)
# Use "this" without any member variable name
lines =<< trim END
- vim9script
- class Something
- this
- endclass
+ vim9script
+ class Something
+ this
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1317:')
+ 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
+ vim9script
+ class Something
+ this.
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1317:')
+ v9.CheckSourceFailure(lines, 'E1317: Invalid object variable declaration: this.', 3)
# Space between "this" and ".<variable>"
lines =<< trim END
- vim9script
- class Something
- this .count
- endclass
+ vim9script
+ class Something
+ this .count
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1317:')
+ 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
+ vim9script
+ class Something
+ this. count
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1317:')
+ 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
+ vim9script
+ class Something
+ this.count: number
+ that.count
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1318: Not a valid command in a class: that.count')
+ 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
+ vim9script
+ class Something
+ this.count
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1022:')
+ 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()
+ 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')
+ 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
+ vim9script
+ class Something
+ this.count : number
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1059:')
+ 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
+ vim9script
+ class Something
+ this.count:number
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1069:')
+ v9.CheckSourceFailure(lines, "E1069: White space required after ':'", 3)
# Test for unsupported comment specifier
lines =<< trim END
@@ -160,7 +160,7 @@
#{
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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
+ vim9script
- class TextPosition
- this.lnum: number
- this.col: number
+ class TextPosition
+ this.lnum: number
+ this.col: number
- # make a nicely formatted string
- def ToString(): string
- return $'({this.lnum}, {this.col})'
- enddef
- endclass
+ # 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)
+ # 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())
+ # 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<TextPosition>', typename(TextPosition))
- assert_equal('object<TextPosition>', typename(pos))
+ assert_equal(v:t_class, type(TextPosition))
+ assert_equal(v:t_object, type(pos))
+ assert_equal('class<TextPosition>', typename(TextPosition))
+ assert_equal('object<TextPosition>', typename(pos))
END
v9.CheckSourceSuccess(lines)
@@ -262,7 +262,7 @@
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 @@
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 @@
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 @@
def Test_class_defined_twice()
# class defined twice should fail
var lines =<< trim END
- vim9script
- class There
- endclass
- class There
- endclass
+ vim9script
+ class There
+ endclass
+ class There
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "There"')
+ 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 @@
def Test_returning_null_object()
# this was causing an internal error
var lines =<< trim END
- vim9script
+ vim9script
- class BufferList
- def Current(): any
- return null_object
- enddef
- endclass
+ class BufferList
+ def Current(): any
+ return null_object
+ enddef
+ endclass
- var buffers = BufferList.new()
- echo buffers.Current()
+ var buffers = BufferList.new()
+ echo buffers.Current()
END
v9.CheckSourceSuccess(lines)
enddef
def Test_using_null_class()
var lines =<< trim END
- @_ = null_class.member
+ @_ = null_class.member
END
- v9.CheckDefExecAndScriptFailure(lines, ['E715:', 'E1363:'])
+ 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
+ vim9script
+ abstract class SomeName
+ this.member = 'text'
+ endinterface
END
- v9.CheckSourceFailure(lines, 'E476: Invalid command: endinterface, expected endclass')
+ v9.CheckSourceFailure(lines, 'E476: Invalid command: endinterface, expected endclass', 4)
lines =<< trim END
- vim9script
- export interface AnotherName
- this.member: string
- endclass
+ vim9script
+ export interface AnotherName
+ this.member: string
+ endclass
END
- v9.CheckSourceFailure(lines, 'E476: Invalid command: endclass, expected endinterface')
+ 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
+ vim9script
- class State
- this.value = 'xyz'
- endclass
+ class State
+ this.value = 'xyz'
+ endclass
- var state: State
- var db = {'xyz': 789}
- echo db[state.value]
+ var state: State
+ var db = {'xyz': 789}
+ echo db[state.value]
END
- v9.CheckSourceFailure(lines, 'E1360:')
+ v9.CheckSourceFailure(lines, 'E1360: Using a null object', 9)
# Use an uninitialized object from a def function
lines =<< trim END
- vim9script
+ vim9script
- class Class
- this.id: string
- def Method1()
- echo 'Method1' .. this.id
- enddef
- endclass
-
- var obj: Class
- def Func()
- obj.Method1()
+ class Class
+ this.id: string
+ def Method1()
+ echo 'Method1' .. this.id
enddef
- Func()
+ endclass
+
+ var obj: Class
+ def Func()
+ obj.Method1()
+ enddef
+ Func()
END
- v9.CheckSourceFailure(lines, 'E1360:')
+ 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
+ vim9script
- class Background
- this.background = 'dark'
- endclass
+ class Background
+ this.background = 'dark'
+ endclass
- class Colorscheme
- this._bg: Background
+ class Colorscheme
+ this._bg: Background
- def GetBackground(): string
- return this._bg.background
- enddef
- endclass
+ def GetBackground(): string
+ return this._bg.background
+ enddef
+ endclass
- var bg: Background # UNINITIALIZED
- echo Colorscheme.new(bg).GetBackground()
+ var bg: Background # UNINITIALIZED
+ echo Colorscheme.new(bg).GetBackground()
END
- v9.CheckSourceFailure(lines, 'E1360:')
+ 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
+ vim9script
- class Class
- this.id: string
- def Method1()
- echo 'Method1' .. this.id
- enddef
- endclass
-
- var obj = null_object
- def Func()
- obj.Method1()
+ class Class
+ this.id: string
+ def Method1()
+ echo 'Method1' .. this.id
enddef
- Func()
+ endclass
+
+ var obj = null_object
+ def Func()
+ obj.Method1()
+ enddef
+ Func()
END
- v9.CheckSourceFailure(lines, 'E1363:')
+ v9.CheckSourceFailure(lines, 'E1363: Incomplete type', 1)
enddef
" Null object assignment and comparison
@@ -549,60 +549,60 @@
" Test for object member initialization and disassembly
def Test_class_member_initializer()
var lines =<< trim END
- vim9script
+ vim9script
- class TextPosition
- this.lnum: number = 1
- this.col: number = 1
+ 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
+ # 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 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)
+ 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
+ vim9script
- class Inner
- this.value: number = 0
- endclass
+ class Inner
+ this.value: number = 0
+ endclass
- class Outer
- this.inner: any
- endclass
+ class Outer
+ this.inner: any
+ endclass
- def F(outer: Outer)
- outer.inner.value = 1
- enddef
+ 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)
+ 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 @@
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 @@
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 @@
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 @@
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
+ vim9script
- class Foo
- public this.x: number
+ 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
+ def Add(n: number)
+ this.x += n
enddef
+ endclass
- AddToFoo(f)
- assert_equal(23, f.x)
+ 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
+ vim9script
- class Foo
- def Add()
- enddef
- endclass
-
- def ProcessList(fooList: list<Foo>)
- for foo in fooList
- foo.Add()
- endfor
+ class Foo
+ def Add()
enddef
+ endclass
- var l: list<Foo> = [Foo.new()]
- ProcessList(l)
+ def ProcessList(fooList: list<Foo>)
+ for foo in fooList
+ foo.Add()
+ endfor
+ enddef
+
+ var l: list<Foo> = [Foo.new()]
+ ProcessList(l)
END
v9.CheckSourceSuccess(lines)
enddef
def Test_expr_after_using_object()
var lines =<< trim END
- vim9script
+ vim9script
- class Something
- this.label: string = ''
- endclass
+ class Something
+ this.label: string = ''
+ endclass
- def Foo(): Something
- var v = Something.new()
- echo 'in Foo(): ' .. typename(v)
- return v
- enddef
+ def Foo(): Something
+ var v = Something.new()
+ echo 'in Foo(): ' .. typename(v)
+ return v
+ enddef
- Foo()
+ Foo()
END
v9.CheckSourceSuccess(lines)
enddef
def Test_class_default_new()
var lines =<< trim END
- vim9script
+ vim9script
- class TextPosition
- this.lnum: number = 1
- this.col: number = 1
- endclass
+ 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)
+ 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(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(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)
+ 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"
+ 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
+ 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 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)
+ 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"
+ 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
+ def new(this.name, this.age = v:none, this.education = v:none)
+ enddef
+ endclass
- var missing = Person.new()
+ var missing = Person.new()
END
- v9.CheckSourceFailure(lines, 'E119:')
+ 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
+ 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'")
+ 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
+ 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
+ class C
+ this.str: string
+ this.num: number
+ def new(this.str, this.num)
enddef
+ def newVals(this.str, this.num)
+ enddef
+ endclass
- Check()
+ 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)
+ 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, 'E1390: Cannot use an object variable "this.str" except with the "new" method')
+ v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number', 2)
lines =<< trim END
- vim9script
+ 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
+ class C
+ this.str: string
+ this.num: number
+ def newVals(this.str, this.num)
enddef
+ endclass
- Check()
+ 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
+ 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)
+ 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
+ vim9script
+ class TextPosition
+ this.lnum
+ this.col = 1
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1022:')
+ 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
+ vim9script
- var init_count = 0
- def Init(): string
- init_count += 1
- return 'foo'
- enddef
+ 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
+ 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)
+ assert_equal(init_count, 0)
+ var a = A.new()
+ assert_equal(init_count, 2)
END
v9.CheckSourceSuccess(lines)
@@ -1044,7 +1033,7 @@
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 @@
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
+ vim9script
+ class Triple
+ this._one = 1
+ this.two = 2
+ public this.three = 3
- def GetOne(): number
- return this._one
- enddef
- endclass
+ 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')
+ 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')
- assert_fails('trip.two = 22', 'E1335')
- trip.three = 33
- assert_equal(33, trip.three)
+ 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')
+ assert_fails('trip.four = 4', 'E1326: Variable not found on object "Triple": four')
END
v9.CheckSourceSuccess(lines)
@@ -1092,83 +1081,83 @@
public this._val = 10
endclass
END
- v9.CheckSourceFailure(lines, 'E1332:')
+ v9.CheckSourceFailure(lines, 'E1332: Public variable name cannot start with underscore: public this._val = 10', 3)
lines =<< trim END
- vim9script
+ vim9script
- class MyCar
- this.make: string
- this.age = 5
+ 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())
+ def new(make_arg: string)
+ this.make = make_arg
enddef
- CheckCar()
+
+ 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
+ vim9script
- class MyCar
- this.make: string
+ class MyCar
+ this.make: string
- def new(make_arg: string)
- this.make = make_arg
- enddef
- endclass
+ def new(make_arg: string)
+ this.make = make_arg
+ enddef
+ endclass
- var c = MyCar.new("abc")
- var c = MyCar.new("def")
+ var c = MyCar.new("abc")
+ var c = MyCar.new("def")
END
- v9.CheckSourceFailure(lines, 'E1041:')
+ v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "c"', 12)
lines =<< trim END
- vim9script
+ vim9script
- class Foo
- this.x: list<number> = []
+ class Foo
+ this.x: list<number> = []
- def Add(n: number): any
- this.x->add(n)
- return this
- enddef
- endclass
+ 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
+ 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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
+ 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
+ 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()
+ var b = B.new()
+ b.Foo()
END
v9.CheckSourceSuccess(lines)
enddef
@@ -1272,7 +1261,7 @@
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 @@
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 @@
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
+ vim9script
+ class A
+ static ro_class_var = 40
+ endclass
- class B extends A
- def Foo()
- A.ro_class_var = 50
- enddef
- endclass
+ class B extends A
+ def Foo()
+ A.ro_class_var = 50
+ enddef
+ endclass
- var b = B.new()
- b.Foo()
+ var b = B.new()
+ b.Foo()
END
- v9.CheckSourceFailure(lines, 'E1335: Variable "ro_class_var" in class "A" is not writable')
+ 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
+ vim9script
+ class A
+ static _priv_class_var = 60
+ endclass
- class B extends A
- def Foo()
- var i = A._priv_class_var
- enddef
- endclass
+ class B extends A
+ def Foo()
+ var i = A._priv_class_var
+ enddef
+ endclass
- var b = B.new()
- b.Foo()
+ var b = B.new()
+ b.Foo()
END
- v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var')
+ 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
+ vim9script
+ class A
+ static _priv_class_var = 60
+ endclass
- class B extends A
- def Foo()
- A._priv_class_var = 0
- enddef
- endclass
+ class B extends A
+ def Foo()
+ A._priv_class_var = 0
+ enddef
+ endclass
- var b = B.new()
- b.Foo()
+ var b = B.new()
+ b.Foo()
END
- v9.CheckSourceFailure(lines, 'E1333: Cannot access private variable: _priv_class_var')
+ 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
+ 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
+ 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()
+ 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 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 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 @@
'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 @@
def Test_object_type()
var lines =<< trim END
- vim9script
+ vim9script
- class One
- this.one = 1
- endclass
- class Two
- this.two = 2
- endclass
- class TwoMore extends Two
- this.more = 9
- endclass
+ 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()
+ var o: One = One.new()
+ var t: Two = Two.new()
+ var m: TwoMore = TwoMore.new()
+ var tm: Two = TwoMore.new()
- t = m
+ t = m
END
v9.CheckSourceSuccess(lines)
lines =<< trim END
- vim9script
+ vim9script
- class One
- this.one = 1
- endclass
- class Two
- this.two = 2
- endclass
+ class One
+ this.one = 1
+ endclass
+ class Two
+ this.two = 2
+ endclass
- var o: One = Two.new()
+ var o: One = Two.new()
END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<One> but got object<Two>')
+ v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<One> but got object<Two>', 10)
lines =<< trim END
- vim9script
+ 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)
- }
+ interface One
+ def GetMember(): number
+ endinterface
+ class Two implements One
+ this.one = 1
+ def GetMember(): number
+ return this.one
enddef
+ endclass
- const Fn = Ref('Double')
- var Double = (m: Num): Num => Num.new(m.n * 2)
+ var o: One = Two.new(5)
+ assert_equal(5, o.GetMember())
+ END
+ v9.CheckSourceSuccess(lines)
- echo Fn(Num.new(4))
+ 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))
END
v9.CheckSourceSuccess(lines)
enddef
@@ -1498,151 +1487,151 @@
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
+ 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
+ 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:')
+ 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())
+ 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('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:')
- assert_fails('TextPos._secret = 8', 'E1333:')
+ 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)
+ 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
+ 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)
+ 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
+ vim9script
- class HTML
- static author: string = 'John Doe'
+ class HTML
+ static author: string = 'John Doe'
- static def MacroSubstitute(s: string): string
- return substitute(s, '{{author}}', author, 'gi')
- enddef
- endclass
+ 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'))
+ 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
+ vim9script
- class Foo
- this._x: number = 0
+ class Foo
+ this._x: number = 0
- def Add(n: number): number
- const F = (): number => this._x + n
- return F()
- enddef
- endclass
+ 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))
+ var foo = Foo.new()
+ assert_equal(5, foo.Add(5))
END
v9.CheckSourceSuccess(lines)
# access private member in lambda body
lines =<< trim END
- vim9script
+ vim9script
- class Foo
- this._x: number = 6
+ class Foo
+ this._x: number = 6
- def Add(n: number): number
- var Lam = () => {
- this._x = this._x + n
- }
- Lam()
- return this._x
- enddef
- endclass
+ 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))
+ var foo = Foo.new()
+ assert_equal(13, foo.Add(7))
END
v9.CheckSourceSuccess(lines)
# check shadowing
lines =<< trim END
- vim9script
+ vim9script
- class Some
- static count = 0
- def Method(count: number)
- echo count
- enddef
- endclass
+ class Some
+ static count = 0
+ def Method(count: number)
+ echo count
+ enddef
+ endclass
- var s = Some.new()
- s.Method(7)
+ var s = Some.new()
+ s.Method(7)
END
- v9.CheckSourceFailure(lines, 'E1340: Argument already declared in the class: count')
+ 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
+ vim9script
- class Some
- static count = 0
- def Method(arg: number)
- var count = 3
- echo arg count
- enddef
- endclass
+ class Some
+ static count = 0
+ def Method(arg: number)
+ var count = 3
+ echo arg count
+ enddef
+ endclass
- var s = Some.new()
- s.Method(7)
+ var s = Some.new()
+ s.Method(7)
END
- v9.CheckSourceFailure(lines, 'E1341: Variable already declared in the class: count')
+ 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 @@
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<A> but got string')
+ v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<A> 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 @@
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 @@
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
+ vim9script
- class Point
- this.p = [2, 3]
- static pl = ['a', 'b']
- static pd = {a: 'a', b: 'b'}
- endclass
+ 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
+ echo Point.pl Point.pd
+ call test_garbagecollect_now()
+ echo Point.pl Point.pd
END
call v9.CheckSourceSuccess(lines)
let lines =<< trim END
- vim9script
+ vim9script
- interface View
- endinterface
+ interface View
+ endinterface
- class Widget
- this.view: View
- endclass
+ class Widget
+ this.view: View
+ endclass
- class MyView implements View
- this.widget: Widget
+ 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
+ def new()
+ # this will result in a circular reference to this object
+ this.widget = Widget.new(this)
+ enddef
+ endclass
- var view = MyView.new()
+ var view = MyView.new()
- # overwrite "view", will be garbage-collected next
- view = MyView.new()
- test_garbagecollect_now()
+ # overwrite "view", will be garbage-collected next
+ view = MyView.new()
+ test_garbagecollect_now()
END
call v9.CheckSourceSuccess(lines)
endfunc
@@ -1827,26 +1816,26 @@
def Test_class_method()
var lines =<< trim END
- vim9script
- class Value
- this.value = 0
- static objects = 0
+ vim9script
+ class Value
+ this.value = 0
+ static objects = 0
- def new(v: number)
- this.value = v
- ++objects
- enddef
+ def new(v: number)
+ this.value = v
+ ++objects
+ enddef
- static def GetCount(): number
- return objects
- enddef
- endclass
+ 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())
+ 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 @@
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 @@
def Test_class_defcompile()
var lines =<< trim END
- vim9script
+ vim9script
- class C
- def Fo(i: number): string
- return i
- enddef
- endclass
+ class C
+ def Fo(i: number): string
+ return i
+ enddef
+ endclass
- defcompile C.Fo
+ defcompile C.Fo
END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected string but got number')
+ v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected string but got number', 1)
lines =<< trim END
- vim9script
+ vim9script
- class C
- static def Fc(): number
- return 'x'
- enddef
- endclass
+ class C
+ static def Fc(): number
+ return 'x'
+ enddef
+ endclass
- defcompile C.Fc
+ defcompile C.Fc
END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got string')
+ v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
lines =<< trim END
- vim9script
+ vim9script
- class C
- static def new()
- enddef
- endclass
+ class C
+ static def new()
+ enddef
+ endclass
- defcompile C.new
+ defcompile C.new
END
- v9.CheckSourceFailure(lines, 'E1370: Cannot define a "new" method as static')
+ 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 @@
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 @@
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 @@
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
+ vim9script
+ class TextPosition
+ this.lnum = 1
+ this.col = 22
+ endclass
- assert_equal("class TextPosition", string(TextPosition))
+ assert_equal("class TextPosition", string(TextPosition))
- var pos = TextPosition.new()
- assert_equal("object of TextPosition {lnum: 1, col: 22}", string(pos))
+ 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<number>
- def GetCount(): number
- endinterface
+ vim9script
+ interface Something
+ this.ro_var: list<number>
+ def GetCount(): number
+ endinterface
END
v9.CheckSourceSuccess(lines)
lines =<< trim END
- interface SomethingWrong
- static count = 7
- endinterface
+ interface SomethingWrong
+ static count = 7
+ endinterface
END
- v9.CheckSourceFailure(lines, 'E1342:')
+ v9.CheckSourceFailure(lines, 'E1342: Interface can only be defined in Vim9 script', 1)
lines =<< trim END
- vim9script
+ vim9script
- interface Some
- this.value: number
- def Method(value: number)
- endinterface
+ 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
+ vim9script
+ interface somethingWrong
+ static count = 7
+ endinterface
END
- v9.CheckSourceFailure(lines, 'E1343: Interface name must start with an uppercase letter: somethingWrong')
+ 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
+ vim9script
+ interface SomethingWrong
+ this.value: string
+ this.count = 7
+ def GetCount(): number
+ endinterface
END
- v9.CheckSourceFailure(lines, 'E1344:')
+ 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
+ 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')
+ 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
+ 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 @@
def Test_class_implements_interface()
var lines =<< trim END
- vim9script
+ vim9script
- interface Some
- this.count: number
- def Method(nr: number)
- endinterface
+ 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
+ class SomeImpl implements Some
+ this.count: number
+ def Method(nr: number)
+ echo nr
+ enddef
+ endclass
- interface Another
- this.member: string
- endinterface
+ 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
+ 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
+ vim9script
- interface Some
- this.count: number
- endinterface
+ interface Some
+ this.count: number
+ endinterface
- class SomeImpl implements Some implements Some
- this.count: number
- endclass
+ class SomeImpl implements Some implements Some
+ this.count: number
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1350:')
+ v9.CheckSourceFailure(lines, 'E1350: Duplicate "implements"', 7)
lines =<< trim END
- vim9script
+ vim9script
- interface Some
- this.count: number
- endinterface
+ interface Some
+ this.count: number
+ endinterface
- class SomeImpl implements Some, Some
- this.count: number
- endclass
+ class SomeImpl implements Some, Some
+ this.count: number
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1351: Duplicate interface after "implements": Some')
+ v9.CheckSourceFailure(lines, 'E1351: Duplicate interface after "implements": Some', 7)
lines =<< trim END
- vim9script
+ vim9script
- interface Some
- this.counter: number
- def Method(nr: number)
- endinterface
+ 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
+ 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')
+ v9.CheckSourceFailure(lines, 'E1348: Variable "counter" of interface "Some" is not implemented', 13)
lines =<< trim END
- vim9script
+ vim9script
- interface Some
- this.count: number
- def Methods(nr: number)
- endinterface
+ 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
+ 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')
+ 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
class B implements A;
endclass
END
- v9.CheckSourceFailure(lines, 'E1315:')
+ v9.CheckSourceFailure(lines, 'E1315: White space required after name: A;', 4)
lines =<< trim END
- vim9script
+ vim9script
- interface One
- def IsEven(nr: number): bool
- endinterface
- class Two implements One
- def IsEven(nr: number): string
- enddef
- endclass
+ 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')
+ v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number): string', 9)
lines =<< trim END
- vim9script
+ vim9script
- interface One
- def IsEven(nr: number): bool
- endinterface
- class Two implements One
- def IsEven(nr: bool): bool
- enddef
- endclass
+ 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')
+ v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(bool): bool', 9)
lines =<< trim END
- vim9script
+ vim9script
- interface One
- def IsEven(nr: number): bool
- endinterface
- class Two implements One
- def IsEven(nr: number, ...extra: list<number>): bool
- enddef
- endclass
+ interface One
+ def IsEven(nr: number): bool
+ endinterface
+ class Two implements One
+ def IsEven(nr: number, ...extra: list<number>): bool
+ enddef
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number, ...list<number>): bool')
+ v9.CheckSourceFailure(lines, 'E1383: Method "IsEven": type mismatch, expected func(number): bool but got func(number, ...list<number>): 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<number>
- return [ i.mvar1, i.mvar2 ]
+ return [ i.mvar1, i.mvar2 ]
enddef
var oa = A.new()
@@ -2341,60 +2330,60 @@
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<number>
- return [ i.mvar1, i.mvar2 ]
+ return [ i.mvar1, i.mvar2 ]
enddef
def F4(i: I2): list<number>
- return [ i.mvar3, i.mvar4 ]
+ return [ i.mvar3, i.mvar4 ]
enddef
var oa = A.new()
@@ -2542,269 +2531,269 @@
# No class that implements the interface.
lines =<< trim END
- vim9script
+ vim9script
- interface IWithEE
- def Enter(): any
- def Exit(): void
- endinterface
+ interface IWithEE
+ def Enter(): any
+ def Exit(): void
+ endinterface
- def With1(ee: IWithEE, F: func)
- var r = ee.Enter()
- enddef
+ def With1(ee: IWithEE, F: func)
+ var r = ee.Enter()
+ enddef
- defcompile
+ defcompile
END
v9.CheckSourceSuccess(lines)
enddef
def Test_class_used_as_type()
var lines =<< trim END
- vim9script
+ vim9script
- class Point
- this.x = 0
- this.y = 0
- endclass
+ 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)
+ 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
+ vim9script
- interface HasX
- this.x: number
- endinterface
+ interface HasX
+ this.x: number
+ endinterface
- class Point implements HasX
- this.x = 0
- this.y = 0
- endclass
+ 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)
+ var p: Point
+ p = Point.new(2, 33)
+ var hx = p
+ assert_equal(2, hx.x)
END
v9.CheckSourceSuccess(lines)
lines =<< trim END
- vim9script
+ vim9script
- class Point
- this.x = 0
- this.y = 0
- endclass
+ class Point
+ this.x = 0
+ this.y = 0
+ endclass
- var p: Point
- p = 'text'
+ var p: Point
+ p = 'text'
END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<Point> but got string')
+ v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<Point> 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())
- 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)
- 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())
- 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
- def ToString(): string
- return super.ToString() .. ': ' .. age
+ vim9script
+ class Base
+ this.one = 1
+ def GetOne(): number
+ return this.one
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())
+ 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.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()
+ 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.CheckSourceFailure(lines, 'E1385: Class method "new" accessible only using class "Child"')
+ 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"', 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', 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 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"', 1)
# base class with more than one object member
lines =<< trim END
- vim9script
+ vim9script
- class Result
- this.success: bool
- this.value: any = null
- endclass
+ 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
+ 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))
+ var v = Success.new('asdf')
+ assert_equal("object of Success {success: true, value: 'asdf'}", string(v))
END
v9.CheckSourceSuccess(lines)
@@ -2816,7 +2805,7 @@
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 @@
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 Enter(): any
+ return 42
+ enddef
- def Exit(resource: number): void
- g:result ..= '/exit'
- 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 @@
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 @@
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
+ 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 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)
+ 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')
+ 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')
+ v9.CheckSourceFailure(lines, 'E1325: Method not found on class "Base": new', 8)
lines =<< trim END
- abstract class Base
- this.name: string
- endclass
+ abstract class Base
+ this.name: string
+ endclass
END
- v9.CheckSourceFailure(lines, 'E1316:')
+ 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 @@
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
+ vim9script
- class Foo
- this.y: list<string> = ['B']
+ class Foo
+ this.y: list<string> = ['B']
- def new()
- g:result = filter(['A', 'B'], (_, v) => index(this.y, v) == -1)
- enddef
- endclass
+ def new()
+ g:result = filter(['A', 'B'], (_, v) => index(this.y, v) == -1)
+ enddef
+ endclass
- Foo.new()
- assert_equal(['A'], g:result)
+ Foo.new()
+ assert_equal(['A'], g:result)
END
v9.CheckSourceSuccess(lines)
enddef
def Test_call_constructor_from_legacy()
var lines =<< trim END
- vim9script
+ vim9script
- var newCalled = 'false'
+ var newCalled = 'false'
- class A
- def new()
- newCalled = 'true'
- enddef
- endclass
-
- export def F(options = {}): any
- return A
+ class A
+ def new()
+ newCalled = 'true'
enddef
+ endclass
- g:p = F()
- legacy call p.new()
- assert_equal('true', newCalled)
+ 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
+ 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()
+ class CWithEE
+ def Enter()
+ g:result ..= "entered/"
enddef
+ def Exit()
+ g:result ..= "exited"
+ enddef
+ endclass
- g:result = ''
- var obj = CWithEE.new()
- obj->With(() => {
- g:result ..= "called/"
- })
- assert_equal('entered/called/exited', g:result)
+ 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
+ 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()
+ class BaseWithEE
+ def Enter()
+ g:result ..= "entered-base/"
enddef
+ def Exit()
+ g:result ..= "exited-base"
+ enddef
+ endclass
- g:result = ''
- var obj = CWithEE.new()
- obj->With(() => {
- g:result ..= "called/"
- })
- assert_equal('entered-child/called/exited-child', g:result)
+ 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 @@
vim9script
class C
- def M1()
- F0()
- enddef
+ def M1()
+ F0()
+ enddef
endclass
def F0()
@@ -3356,7 +3345,7 @@
enddef
def F()
- C.new().M1()
+ C.new().M1()
enddef
F()
@@ -3442,7 +3431,7 @@
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 @@
var c = C.new()
assert_equal('object<C>', 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 new()
+ this._mvar = 103
+ enddef
- def AccessPrivateStaticThroughClassName(): number
- assert_equal(1, A._svar)
- return 444
- enddef
+ def AccessPrivateStaticThroughClassName(): number
+ assert_equal(1, A._svar)
+ return 444
+ enddef
endclass
var oa = A.new()
@@ -4075,7 +4064,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
enddef
endclass
END
- v9.CheckSourceFailure(lines, 'E1383: Method "Foo": type mismatch, expected func(string, number): list<number> but got func(number, string): list<string>')
+ v9.CheckSourceFailure(lines, 'E1383: Method "Foo": type mismatch, expected func(string, number): list<number> but got func(number, string): list<string>', 9)
# Use an abstract class to invoke an abstract method
# FIXME: This should fail
@@ -4691,7 +4680,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
static def Foo(d: dict<any>): list<string>
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 @@
static def _Foo(d: dict<any>): list<string>
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 @@
this._Foo: list<string>
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 _Foo(d: dict<any>): list<string>
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
this.var1 = [{a: 10}]
endclass
END
- v9.CheckSourceFailure(lines, 'E1382: Variable "var3": type mismatch, expected list<dict<number>> but got list<dict<string>>')
+ v9.CheckSourceFailure(lines, 'E1382: Variable "var3": type mismatch, expected list<dict<number>> but got list<dict<string>>', 22)
enddef
" Test for extending an interface with duplicate variables and methods
@@ -5594,7 +5583,7 @@
endclass
var b = B.new()
END
- v9.CheckSourceFailure(lines, 'E1382: Variable "val": type mismatch, expected list<dict<string>> but got dict<number>')
+ v9.CheckSourceFailure(lines, 'E1382: Variable "val": type mismatch, expected list<dict<string>> but got dict<number>', 1)
enddef
" Test for assigning to a member variable in a nested class
@@ -5603,29 +5592,29 @@
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
index 0bb2239..5aca53a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1951,
+/**/
1950,
/**/
1949,
diff --git a/src/vim9class.c b/src/vim9class.c
index 4c70f8d..29ed6d1 100644
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -1577,7 +1577,7 @@
}
if (!is_class)
{
- emsg(_(e_public_member_not_supported_in_interface));
+ emsg(_(e_public_variable_not_supported_in_interface));
break;
}
has_public = TRUE;