From 4d74d7296a0a9c106cf5d104affc62f0435810fe Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 8 Oct 2024 17:32:28 +0800 Subject: [PATCH] parser: fix generics method chaining call (#22447) --- vlib/v/parser/parse_type.v | 1 + .../generics_method_chaining_call_test.v | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 vlib/v/tests/generics/generics_method_chaining_call_test.v diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index a22bb1393..a89f5c54f 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -835,6 +835,7 @@ fn (mut p Parser) find_type_or_add_placeholder(name string, language ast.Languag ...sym name: sym_name rname: sym.name + parent_idx: sym.idx generic_types: p.init_generic_types.clone() }) } diff --git a/vlib/v/tests/generics/generics_method_chaining_call_test.v b/vlib/v/tests/generics/generics_method_chaining_call_test.v new file mode 100644 index 000000000..a032e5dc5 --- /dev/null +++ b/vlib/v/tests/generics/generics_method_chaining_call_test.v @@ -0,0 +1,32 @@ +struct Seq[T] { + ar []T +} + +type MapFn[T, K] = fn (T) K + +fn (s Seq[T]) map[K](map_fn MapFn[T, K]) Seq[K] { + mut map_ar := []K{cap: s.ar.len} + + for _, i in s.ar { + map_ar << map_fn[T, K](i) + } + + return Seq[K]{map_ar} +} + +fn test_generics_method_chaining_call() { + s := Seq[string]{['one', 'two']} + .map[int](fn (element string) int { + match element { + 'one' { return 1 } + 'two' { return 2 } + else { return -1 } + } + }) + .map[int](fn (element int) int { + return element + 2 + }) + + println(s) + assert s.ar == [3, 4] +} -- 2.39.5