patch 9.0.2049: Vim9: not recognizing qualified class vars for infix ops
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>
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 01cf3e1..802415b 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -8337,4 +8337,76 @@
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 977bbdf..a79dd1d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
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 85eb7af..41ed7e7 100644
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -379,6 +379,8 @@
}
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 @@
}
*arg = name_end;
+ // Remove the class type from the stack
+ --cctx->ctx_type_stack.ga_len;
return generate_CLASSMEMBER(cctx, TRUE, cl, idx);
}