From adf10f88cf864c890dcdfb2a189f3d04b80576c9 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 26 Aug 2023 23:50:06 +0800 Subject: [PATCH] cgen: fix array sort with fn call parameter (fix #19220) (#19221) --- vlib/v/gen/c/array.v | 3 ++- vlib/v/tests/array_sort_with_fn_call_test.v | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/array_sort_with_fn_call_test.v diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index 6dc9dc64d0..41edc9895f 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -611,7 +611,8 @@ fn (mut g Gen) gen_array_sort(node ast.CallExpr) { comparison_type = g.unwrap(infix_expr.left_type.set_nr_muls(0)) left_name := infix_expr.left.str() if left_name.len > 1 { - compare_fn += '_by' + left_name[1..].replace_each(['.', '_', '[', '_', ']', '_']) + compare_fn += '_by' + + left_name[1..].replace_each(['.', '_', '[', '_', ']', '_', "'", '_', '"', '_', '(', '', ')', '', ',', '']) } // is_reverse is `true` for `.sort(a > b)` and `.sort(b < a)` is_reverse := (left_name.starts_with('a') && infix_expr.op == .gt) diff --git a/vlib/v/tests/array_sort_with_fn_call_test.v b/vlib/v/tests/array_sort_with_fn_call_test.v new file mode 100644 index 0000000000..65d55ebb8a --- /dev/null +++ b/vlib/v/tests/array_sort_with_fn_call_test.v @@ -0,0 +1,13 @@ +struct Info { +mut: + fields []string +} + +fn test_sort_with_fn_call() { + mut info := Info{ + fields: ['aaa(', 'b('] + } + info.fields.sort(a.before('(').len < b.before('(').len) + println(info.fields) + assert info.fields == ['b(', 'aaa('] +}