From a9f55de3521c18db74c3cf739fc9b65c6b7d1332 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 25 Mar 2023 14:31:25 +0800 Subject: [PATCH] checker: fix generic array delete in skip_unused mode (#17759) --- vlib/v/checker/checker.v | 2 +- vlib/v/checker/fn.v | 5 +++++ .../generics_array_delete_method.run.out | 0 ...erics_array_delete_method.skip_unused.run.out | 0 .../skip_unused/generics_array_delete_method.vv | 16 ++++++++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/skip_unused/generics_array_delete_method.run.out create mode 100644 vlib/v/tests/skip_unused/generics_array_delete_method.skip_unused.run.out create mode 100644 vlib/v/tests/skip_unused/generics_array_delete_method.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 61a34a52cc..68bb0016eb 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -25,7 +25,7 @@ const ( pub const ( array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort', - 'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop'] + 'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop', 'delete'] array_builtin_methods_chk = token.new_keywords_matcher_from_array_trie(array_builtin_methods) // TODO: remove `byte` from this list when it is no longer supported reserved_type_names = ['byte', 'bool', 'char', 'i8', 'i16', 'int', 'i64', 'u8', 'u16', diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 389276e40a..c37f775261 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -2426,6 +2426,11 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as } else { node.receiver_type = left_type } + } else if method_name == 'delete' { + unwrapped_left_sym := c.table.sym(c.unwrap_generic(left_type)) + if method := c.table.find_method(unwrapped_left_sym, method_name) { + node.receiver_type = method.receiver_type + } } return node.return_type } diff --git a/vlib/v/tests/skip_unused/generics_array_delete_method.run.out b/vlib/v/tests/skip_unused/generics_array_delete_method.run.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vlib/v/tests/skip_unused/generics_array_delete_method.skip_unused.run.out b/vlib/v/tests/skip_unused/generics_array_delete_method.skip_unused.run.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vlib/v/tests/skip_unused/generics_array_delete_method.vv b/vlib/v/tests/skip_unused/generics_array_delete_method.vv new file mode 100644 index 0000000000..56e868ae8c --- /dev/null +++ b/vlib/v/tests/skip_unused/generics_array_delete_method.vv @@ -0,0 +1,16 @@ +struct Bar[K] { +} + +struct Foo[K] { +mut: + bars []Bar[K] +} + +fn main() { + mut f := Foo[int]{[Bar[int]{}]} + f.xy() +} + +pub fn (mut f Foo[K]) xy() { + f.bars.delete(0) +}