Mercurial > vim
changeset 33611:de690130ba43 v9.0.2049
patch 9.0.2049: Vim9: not recognizing qualified class vars for infix ops
Commit: https://github.com/vim/vim/commit/d7b616d0ad006db06140729313b6217677cc4e80
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
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 <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 19 Oct 2023 11:00:04 +0200 |
parents | 0ca9c54620a6 |
children | 0dd1e3a17f68 |
files | src/testdir/test_vim9_class.vim src/version.c src/vim9expr.c |
diffstat | 3 files changed, 78 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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,
--- 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); }