summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-10-19 10:47:53 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-19 10:47:53 +0200
commitd7b616d0ad006db06140729313b6217677cc4e80 (patch)
treeec31d6da6f2ada0811cfa989721f0c2f7a959f4a /src
parent982ef16059bd163a77271107020defde0740bbd6 (diff)
patch 9.0.2049: Vim9: not recognizing qualified class vars for infix opsv9.0.2049
Problem: Vim9: not recognizing qualified class vars for infix ops Solution: Drop the class type from the stack before generating the CLASSMEMBER instruction closes: #13378 closes: #13379 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_vim9_class.vim72
-rw-r--r--src/version.c2
-rw-r--r--src/vim9expr.c4
3 files changed, 78 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 01cf3e128f..802415b3ae 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -8337,4 +8337,76 @@ def Test_classmethod_timer_callback()
v9.CheckSourceSuccess(lines)
enddef
+" Test for using a class variable as the first and/or second operand of a binary
+" operator.
+def Test_class_variable_as_operands()
+ var lines =<< trim END
+ vim9script
+ class Tests
+ static truthy: bool = true
+ static list: list<any> = []
+ static four: number = 4
+ static hello: string = 'hello'
+
+ static def Hello(): string
+ return hello
+ enddef
+
+ static def Four(): number
+ return four
+ enddef
+
+ static def List(): list<any>
+ return list
+ enddef
+
+ static def Truthy(): bool
+ return truthy
+ enddef
+
+ def TestOps()
+ assert_true(Tests.truthy == truthy)
+ assert_true(truthy == Tests.truthy)
+ assert_true(Tests.list isnot [])
+ assert_true([] isnot Tests.list)
+ assert_equal(2, Tests.four >> 1)
+ assert_equal(16, 1 << Tests.four)
+ assert_equal(8, Tests.four + four)
+ assert_equal(8, four + Tests.four)
+ assert_equal('hellohello', Tests.hello .. hello)
+ assert_equal('hellohello', hello .. Tests.hello)
+ enddef
+ endclass
+
+ def TestOps2()
+ assert_true(Tests.truthy == Tests.Truthy())
+ assert_true(Tests.Truthy() == Tests.truthy)
+ assert_true(Tests.list is Tests.List())
+ assert_true(Tests.List() is Tests.list)
+ assert_equal(2, Tests.four >> 1)
+ assert_equal(16, 1 << Tests.four)
+ assert_equal(8, Tests.four + Tests.Four())
+ assert_equal(8, Tests.Four() + Tests.four)
+ assert_equal('hellohello', Tests.hello .. Tests.Hello())
+ assert_equal('hellohello', Tests.Hello() .. Tests.hello)
+ enddef
+
+ var t = Tests.new()
+ t.TestOps()
+ TestOps2()
+
+ assert_true(Tests.truthy == Tests.Truthy())
+ assert_true(Tests.Truthy() == Tests.truthy)
+ assert_true(Tests.list is Tests.List())
+ assert_true(Tests.List() is Tests.list)
+ assert_equal(2, Tests.four >> 1)
+ assert_equal(16, 1 << Tests.four)
+ assert_equal(8, Tests.four + Tests.Four())
+ assert_equal(8, Tests.Four() + Tests.four)
+ assert_equal('hellohello', Tests.hello .. Tests.Hello())
+ assert_equal('hellohello', Tests.Hello() .. Tests.hello)
+ 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 977bbdf6fe..a79dd1d463 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2049,
+/**/
2048,
/**/
2047,
diff --git a/src/vim9expr.c b/src/vim9expr.c
index 85eb7afb90..41ed7e7401 100644
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -379,6 +379,8 @@ compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type)
}
if (type->tt_type == VAR_CLASS)
{
+ // Remove the class type from the stack
+ --cctx->ctx_type_stack.ga_len;
if (generate_CLASSMEMBER(cctx, TRUE, cl, m_idx) == FAIL)
return FAIL;
}
@@ -475,6 +477,8 @@ compile_class_object_index(cctx_T *cctx, char_u **arg, type_T *type)
}
*arg = name_end;
+ // Remove the class type from the stack
+ --cctx->ctx_type_stack.ga_len;
return generate_CLASSMEMBER(cctx, TRUE, cl, idx);
}