# HG changeset patch # User Christian Brabandt # Date 1697706004 -7200 # Node ID de690130ba437ce90d5aa4aeba22c0de51a55be4 # Parent 0ca9c54620a68ff7d741de6090317951e9b7077c patch 9.0.2049: Vim9: not recognizing qualified class vars for infix ops Commit: https://github.com/vim/vim/commit/d7b616d0ad006db06140729313b6217677cc4e80 Author: Yegappan Lakshmanan Date: Thu Oct 19 10:47:53 2023 +0200 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 Co-authored-by: Yegappan Lakshmanan diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim --- 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 = [] + 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 + 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 --- 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 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -379,6 +379,8 @@ compile_class_object_index(cctx_T *cctx, } 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, } *arg = name_end; + // Remove the class type from the stack + --cctx->ctx_type_stack.ga_len; return generate_CLASSMEMBER(cctx, TRUE, cl, idx); }