diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-08-20 18:20:17 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-08-20 18:20:17 +0200 |
commit | 6ac1544e13d78e0deeca1f357d1d73947180171c (patch) | |
tree | 87cdbb42a368d402fce1773a4b9321cef96e8fc9 /src/testdir | |
parent | 6cc8bc836616e9b0cda1d8cb6993a958f569ad7b (diff) |
patch 9.0.1760: vim9 class problem with new() constructorv9.0.1760
Problem: vim9 class problem with new() constructor
Solution: Don't allow a return type for the new() class constructor.
closes: #12863
closes: #12040
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src/testdir')
-rw-r--r-- | src/testdir/test_vim9_class.vim | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index bc90e42597..dbd4c3bcbe 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -1577,6 +1577,16 @@ def Test_class_implements_interface() END v9.CheckScriptFailure(lines, 'E1349:') + # implements should be followed by a white space + lines =<< trim END + vim9script + interface A + endinterface + class B implements A; + endclass + END + v9.CheckScriptFailure(lines, 'E1315:') + lines =<< trim END vim9script @@ -2515,4 +2525,104 @@ def Test_stack_expansion_with_methods() END v9.CheckScriptSuccess(lines) enddef + +" Test the return type of the new() constructor +def Test_new_return_type() + # new() uses the default return type and there is no return statement + var lines =<< trim END + vim9script + + class C + this._bufnr: number + + def new(this._bufnr) + if !bufexists(this._bufnr) + this._bufnr = -1 + endif + enddef + endclass + + var c = C.new(12345) + assert_equal('object<C>', typename(c)) + + var v1: C + v1 = C.new(12345) + assert_equal('object<C>', typename(v1)) + + def F() + var v2: C + v2 = C.new(12345) + assert_equal('object<C>', typename(v2)) + enddef + F() + END + v9.CheckScriptSuccess(lines) + + # new() uses the default return type and an empty 'return' statement + lines =<< trim END + vim9script + + class C + this._bufnr: number + + def new(this._bufnr) + if !bufexists(this._bufnr) + this._bufnr = -1 + return + endif + enddef + endclass + + var c = C.new(12345) + assert_equal('object<C>', typename(c)) + + var v1: C + v1 = C.new(12345) + assert_equal('object<C>', typename(v1)) + + def F() + var v2: C + v2 = C.new(12345) + assert_equal('object<C>', typename(v2)) + enddef + F() + END + v9.CheckScriptSuccess(lines) + + # new() uses "any" return type and returns "this" + lines =<< trim END + vim9script + + class C + this._bufnr: number + + def new(this._bufnr): any + if !bufexists(this._bufnr) + this._bufnr = -1 + return this + endif + enddef + endclass + END + v9.CheckScriptFailure(lines, 'E1365:') + + # new() uses 'Dict' return type and returns a Dict + lines =<< trim END + vim9script + + class C + this._state: dict<any> + + def new(): dict<any> + this._state = {} + return this._state + enddef + endclass + + var c = C.new() + assert_equal('object<C>', typename(c)) + END + v9.CheckScriptFailure(lines, 'E1365:') +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker |