From 09948ad68fad3a5e8e74077f4d6923a87cdcb96b Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:20 +0300 Subject: [PATCH] parser: fix chained methods not parsing correctly when . is separated from name (fixes #23258) --- vlib/v/parser/parser.v | 19 +++++++++---------- .../fns/method_call_chained_multiline_test.v | 9 +++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 vlib/v/tests/fns/method_call_chained_multiline_test.v diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 76c547ff7..f0fbc01c3 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -2248,7 +2248,15 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { } else { p.name_error = true } - is_builtin_array_generic_method := ast.builtin_array_generic_methods_matcher.matches(field_name) + if ast.builtin_array_generic_methods_matcher.matches(field_name) { + if p.file_backend_mode == .v || p.file_backend_mode == .c { + p.register_auto_import('builtin.closure') + } + p.open_scope() + defer(fn) { + p.close_scope() + } + } // ! in mutable methods if p.tok.kind == .not && p.peek_tok.kind == .lpar { p.next() @@ -2270,15 +2278,6 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { } } if p.tok.kind == .lpar { - if is_builtin_array_generic_method { - if p.file_backend_mode == .v || p.file_backend_mode == .c { - p.register_auto_import('builtin.closure') - } - p.open_scope() - defer(fn) { - p.close_scope() - } - } p.next() args := p.call_args() p.check(.rpar) diff --git a/vlib/v/tests/fns/method_call_chained_multiline_test.v b/vlib/v/tests/fns/method_call_chained_multiline_test.v new file mode 100644 index 000000000..0ec645cb5 --- /dev/null +++ b/vlib/v/tests/fns/method_call_chained_multiline_test.v @@ -0,0 +1,9 @@ +fn test_method_call_chained_multiline() { + mut s := ' a b ' + // vfmt off + s = s. trim_space(). + replace(' ', ''). + to_upper() + // vfmt on + assert s == 'AB' +} -- 2.39.5