From eec87883336e3d20eba9fa69bb008ab8045bb195 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 20 Nov 2021 02:31:55 +0800 Subject: [PATCH] checker: fix generics fn infer nested generic fn (#12519) --- vlib/v/checker/check_types.v | 3 +- .../generic_fn_infer_nested_generic_fn_test.v | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generic_fn_infer_nested_generic_fn_test.v diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 34d3a74483..736c17dba1 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -614,7 +614,8 @@ pub fn (mut c Checker) infer_fn_generic_types(func ast.Fn, mut node ast.CallExpr if node.args.len <= arg_i { break } - arg := node.args[arg_i] + mut arg := node.args[arg_i] + arg.typ = c.unwrap_generic(arg.typ) param_type_sym := c.table.get_type_symbol(param.typ) if param.typ.has_flag(.generic) && param_type_sym.name == gt_name { diff --git a/vlib/v/tests/generic_fn_infer_nested_generic_fn_test.v b/vlib/v/tests/generic_fn_infer_nested_generic_fn_test.v new file mode 100644 index 0000000000..9e27374d3d --- /dev/null +++ b/vlib/v/tests/generic_fn_infer_nested_generic_fn_test.v @@ -0,0 +1,49 @@ +import json +import os + +fn test_generics_fn_infer_nested_generic_fn() { + mut spawns := []ItemSpawn{} + load_item_spawns(mut spawns) + println(spawns) + assert spawns.len == 0 +} + +fn load_item_spawns(mut spawns []ItemSpawn) { + walk('./data/items/spawns/', mut spawns) +} + +fn parse_json(file string, mut array []T) { + data := os.read_file(file) or { + panic('error reading file $file') + return + } + decoded_data := json.decode([]T, data) or { + eprintln('Failed to parse item spawns') + return + } + for d in decoded_data { + array << d + } +} + +fn walk(path string, mut array []T) { + if !os.is_dir(path) { + return + } + mut files := os.ls(path) or { return } + for file in files { + p := path + os.path_separator + file + if os.is_dir(p) && !os.is_link(p) { + walk(p, mut array) + } else if os.exists(p) { + parse_json(p, mut array) + } + } +} + +struct ItemSpawn { + id int + amount int = 1 + x int + y int +}