From 73da3c9e4c6d1246452d0d95a1ea37e9a7a90215 Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Tue, 30 Jun 2020 09:22:15 +1000 Subject: [PATCH] generic structs: better naming & comments --- vlib/v/builder/c.v | 2 +- vlib/v/builder/generics.v | 12 +++++++----- vlib/v/gen/js/js.v | 2 +- vlib/v/parser/parse_type.v | 4 ++-- vlib/v/table/atypes.v | 9 +++++---- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/vlib/v/builder/c.v b/vlib/v/builder/c.v index 54c5e8c69f..34f57fddd2 100644 --- a/vlib/v/builder/c.v +++ b/vlib/v/builder/c.v @@ -14,7 +14,7 @@ pub fn (mut b Builder) gen_c(v_files []string) string { parse_time := t1 - t0 b.info('PARSE: ${parse_time}ms') // - b.instantiate_generic_structs() + b.generic_struct_insts_to_concrete() b.checker.check_files(b.parsed_files) t2 := time.ticks() check_time := t2 - t1 diff --git a/vlib/v/builder/generics.v b/vlib/v/builder/generics.v index 75533b4338..881164924b 100644 --- a/vlib/v/builder/generics.v +++ b/vlib/v/builder/generics.v @@ -2,15 +2,16 @@ module builder import v.table -pub fn (b &Builder) instantiate_generic_structs() { +// generic struct instantiations to concrete types +pub fn (b &Builder) generic_struct_insts_to_concrete() { for idx, _ in b.table.types { mut typ := &b.table.types[idx] - if typ.kind == .generic_struct_instance { - info := typ.info as table.GenericStructInstance + if typ.kind == .generic_struct_inst { + info := typ.info as table.GenericStructInst parent := b.table.types[info.parent_idx] mut parent_info := *(parent.info as table.Struct) mut fields := parent_info.fields.clone() - for i, _ in parent_info.fields { + for i, _ in fields { mut field := fields[i] if field.typ.has_flag(.generic) { if parent_info.generic_types.len != info.generic_types.len { @@ -27,9 +28,10 @@ pub fn (b &Builder) instantiate_generic_structs() { fields[i] = field } parent_info.generic_types = [] + parent_info.fields = fields typ.is_public = true typ.kind = .struct_ - typ.info = {parent_info| fields: fields} + typ.info = parent_info } } } \ No newline at end of file diff --git a/vlib/v/gen/js/js.v b/vlib/v/gen/js/js.v index 8dc1492112..16e3b125a2 100644 --- a/vlib/v/gen/js/js.v +++ b/vlib/v/gen/js/js.v @@ -238,7 +238,7 @@ pub fn (mut g JsGen) typ(t table.Type) string { .struct_ { styp = g.struct_typ(sym.name) } - .generic_struct_instance {} + .generic_struct_inst {} // 'multi_return_int_int' => '[number, number]' .multi_return { info := sym.info as table.MultiReturn diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 9d3bd347b7..af7da87cc5 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -314,9 +314,9 @@ pub fn (mut p Parser) parse_generic_struct_inst_type(name string) table.Type { } gt_idx = p.table.add_placeholder_type(bs_name) idx := p.table.register_type_symbol(table.TypeSymbol{ - kind: .generic_struct_instance + kind: .generic_struct_inst name: bs_name - info: table.GenericStructInstance{ + info: table.GenericStructInst{ parent_idx: p.table.type_idxs[name] generic_types: generic_types } diff --git a/vlib/v/table/atypes.v b/vlib/v/table/atypes.v index f92be44b87..993afdc897 100644 --- a/vlib/v/table/atypes.v +++ b/vlib/v/table/atypes.v @@ -16,7 +16,7 @@ import strings pub type Type int pub type TypeInfo = Alias | Array | ArrayFixed | Enum | FnType | Interface | Map | MultiReturn | - Struct | GenericStructInstance | SumType + Struct | GenericStructInst | SumType pub enum Language { v @@ -321,7 +321,7 @@ pub enum Kind { map any struct_ - generic_struct_instance + generic_struct_inst multi_return sum_type alias @@ -623,9 +623,10 @@ pub mut: generic_types []Type } -pub struct GenericStructInstance { +// instantiation of a generic struct +pub struct GenericStructInst { pub mut: - parent_idx int + parent_idx int // idx of the base generic struct generic_types []Type }