From f1797a0150eb34bd20d60661819186827bf12049 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 31 Mar 2021 19:11:55 +0800 Subject: [PATCH] generics: fix generic_struct_insts_to_concrete (#9536) --- vlib/v/table/table.v | 31 ++++++++----------- .../generics_return_generics_struct_test.v | 12 +++++++ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/vlib/v/table/table.v b/vlib/v/table/table.v index 1ea61f6b5d..1d831d85a1 100644 --- a/vlib/v/table/table.v +++ b/vlib/v/table/table.v @@ -1093,27 +1093,22 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() { } mut parent_info := parent.info as Struct mut fields := parent_info.fields.clone() - for i, _ in fields { - mut field := fields[i] - if field.typ.has_flag(.generic) { - if parent_info.generic_types.len != info.generic_types.len { - // TODO: proper error - panic('generic template mismatch') - } - for j, gp in parent_info.generic_types { - if gp == field.typ { - field.typ = info.generic_types[j].derive(field.typ).clear_flag(.generic) - break - } + if parent_info.generic_types.len == info.generic_types.len { + for i, _ in fields { + mut field := fields[i] + if t_typ := t.resolve_generic_by_types(field.typ, parent_info.generic_types, + info.generic_types) + { + field.typ = t_typ } + fields[i] = field } - fields[i] = field + parent_info.generic_types = [] + parent_info.fields = fields + typ.is_public = true + typ.kind = .struct_ + typ.info = parent_info } - parent_info.generic_types = [] - parent_info.fields = fields - typ.is_public = true - typ.kind = .struct_ - typ.info = parent_info } } } diff --git a/vlib/v/tests/generics_return_generics_struct_test.v b/vlib/v/tests/generics_return_generics_struct_test.v index fde0fcb134..e6b669d5f4 100644 --- a/vlib/v/tests/generics_return_generics_struct_test.v +++ b/vlib/v/tests/generics_return_generics_struct_test.v @@ -49,3 +49,15 @@ fn test_generics_with_generics_struct_string() { assert ret.contains("data: ['foo', 'bar']") assert ret.contains('index: 11') } + +fn test_generics_struct_insts_to_concrete() { + ai := ArrayIterator{ + data: [11, 22], + index: 22 + } + println(ai) + ret := '$ai' + assert ret.contains('ArrayIterator{') + assert ret.contains('data: [11, 22]') + assert ret.contains('index: 22') +}