patch 9.1.1105: Vim9: no support for protected new() method
Commit:
https://github.com/vim/vim/commit/7e89800988e44b0ef2d89c69ddb5360d85c03a67
Author: Yegappan Lakshmanan <[email protected]>
Date: Tue Feb 11 22:07:05 2025 +0100
patch 9.1.1105: Vim9: no support for protected new() method
Problem: Vim9: no support for protected new() method
Solution: support the protected "_new()" object method
(Yegappan Lakshmanan)
closes: #16604
Signed-off-by: Yegappan Lakshmanan <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index 3614ce3d2..fbe9b9865 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -1,4 +1,4 @@
-*version9.txt* For Vim version 9.1. Last change: 2025 Feb 08
+*version9.txt* For Vim version 9.1. Last change: 2025 Feb 11
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -41551,6 +41551,8 @@ Add support for internal builtin functions with vim9
objects, see
Enum support for Vim9 script |:enum|
+Support for protected _new() method
+
*new-other-9.2*
Other new features ~
------------------
diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt
index 9aab6c74a..5e5c28e9e 100644
--- a/runtime/doc/vim9class.txt
+++ b/runtime/doc/vim9class.txt
@@ -1,4 +1,4 @@
-*vim9class.txt* For Vim version 9.1. Last change: 2024 Dec 29
+*vim9class.txt* For Vim version 9.1. Last change: 2025 Feb 11
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -272,6 +272,9 @@ no need to call "super()" or "new()" on the parent.
When defining the new() method the return type should not be specified. It
always returns an object of the class.
+The new() method can be made a protected method by using "_new()". This can
+be used to support the singleton design pattern.
+
*E1386*
When invoking an object method, the method name should be preceded by the
object variable name. An object method cannot be invoked using the class
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 0b3ea4a10..7a269fc8f 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -12374,4 +12374,39 @@ def Test_abstract_method_across_hierarchy()
v9.CheckSourceSuccess(lines)
enddef
+" Test for using a protected new() method (singleton design pattern)
+def Test_protected_new_method()
+ var lines =<< trim END
+ vim9script
+ class A
+ def _new()
+ enddef
+ endclass
+ var a = A.new()
+ END
+ v9.CheckSourceFailure(lines, 'E1325: Method "new" not found in class "A"', 6)
+
+ lines =<< trim END
+ vim9script
+ class A
+ static var _instance: A
+ var str: string
+ def _new(str: string)
+ this.str = str
+ enddef
+ static def GetInstance(str: string): A
+ if _instance == null
+ _instance = A._new(str)
+ endif
+ return _instance
+ enddef
+ endclass
+ var a: A = A.GetInstance('foo')
+ var b: A = A.GetInstance('bar')
+ assert_equal('foo', a.str)
+ assert_equal('foo', b.str)
+ END
+ v9.CheckSourceSuccess(lines)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 76de99dd0..f9aa19a5b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1105,
/**/
1104,
/**/
diff --git a/src/vim9class.c b/src/vim9class.c
index 47ab2369d..82205365c 100644
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -2375,7 +2375,8 @@ early_ret:
{
exarg_T ea;
garray_T lines_to_free;
- int is_new = STRNCMP(p, "new", 3) == 0;
+ int is_new = STRNCMP(p, "new", 3) == 0
+ || STRNCMP(p, "_new", 4) == 0;
if (has_public)
{
@@ -2601,7 +2602,8 @@ early_ret:
for (int i = 0; i < classfunctions.ga_len; ++i)
{
class_func = ((ufunc_T **)classfunctions.ga_data)[i];
- if (STRCMP(class_func->uf_name, "new") == 0)
+ if (STRCMP(class_func->uf_name, "new") == 0
+ || STRCMP(class_func->uf_name, "_new") == 0)
{
have_new = TRUE;
break;
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1thxax-003HCz-9I%40256bit.org.