generic structs: better naming & comments
parent
616b07204d
commit
73da3c9e4c
vlib/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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue