summaryrefslogtreecommitdiffstats
path: root/src/testdir
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-08-20 18:20:17 +0200
committerChristian Brabandt <cb@256bit.org>2023-08-20 18:20:17 +0200
commit6ac1544e13d78e0deeca1f357d1d73947180171c (patch)
tree87cdbb42a368d402fce1773a4b9321cef96e8fc9 /src/testdir
parent6cc8bc836616e9b0cda1d8cb6993a958f569ad7b (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.vim110
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