wrap up struct default vals + tests
parent
268a6dc6d9
commit
a4ab7b14c1
|
@ -214,7 +214,10 @@ fn (p mut Parser) struct_decl() {
|
||||||
if def_val_type != field_type {
|
if def_val_type != field_type {
|
||||||
p.error('expected `$field_type` but got `$def_val_type`')
|
p.error('expected `$field_type` but got `$def_val_type`')
|
||||||
}
|
}
|
||||||
p.table.add_default_val(i, typ.name, expr)
|
//println('pass=$p.pass $typ.name ADDING field=$field_name "$def_val_type" "$expr"')
|
||||||
|
if !p.first_pass() {
|
||||||
|
p.table.add_default_val(i, typ.name, expr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// [ATTR]
|
// [ATTR]
|
||||||
mut attr := ''
|
mut attr := ''
|
||||||
|
@ -303,7 +306,11 @@ fn (p mut Parser) struct_init(typ string) string {
|
||||||
}
|
}
|
||||||
// Zero values: init all fields (ints to 0, strings to '' etc)
|
// Zero values: init all fields (ints to 0, strings to '' etc)
|
||||||
for i, field in t.fields {
|
for i, field in t.fields {
|
||||||
sanitized_name := if typ != 'Option' { p.table.var_cgen_name( field.name ) } else { field.name }
|
sanitized_name := if typ != 'Option' {
|
||||||
|
p.table.var_cgen_name( field.name )
|
||||||
|
} else {
|
||||||
|
field.name
|
||||||
|
}
|
||||||
// println('### field.name')
|
// println('### field.name')
|
||||||
// Skip if this field has already been assigned to
|
// Skip if this field has already been assigned to
|
||||||
if sanitized_name in inited_fields {
|
if sanitized_name in inited_fields {
|
||||||
|
@ -324,7 +331,13 @@ fn (p mut Parser) struct_init(typ string) string {
|
||||||
did_gen_something = true
|
did_gen_something = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
def_val := type_default(field_typ)
|
// Did the user provide a default value for this struct field?
|
||||||
|
// Use it. Otherwise zero it.
|
||||||
|
def_val := if t.default_vals.len > i && t.default_vals[i] != '' {
|
||||||
|
t.default_vals[i]
|
||||||
|
} else {
|
||||||
|
type_default(field_typ)
|
||||||
|
}
|
||||||
if def_val != '' && def_val != '{0}' {
|
if def_val != '' && def_val != '{0}' {
|
||||||
p.gen_struct_field_init(sanitized_name)
|
p.gen_struct_field_init(sanitized_name)
|
||||||
p.gen(def_val)
|
p.gen(def_val)
|
||||||
|
|
|
@ -444,6 +444,9 @@ fn (table mut Table) add_field(type_name, field_name, field_type string, is_mut
|
||||||
|
|
||||||
fn (table mut Table) add_default_val(idx int, type_name, val_expr string) {
|
fn (table mut Table) add_default_val(idx int, type_name, val_expr string) {
|
||||||
mut t := table.typesmap[type_name]
|
mut t := table.typesmap[type_name]
|
||||||
|
if t.default_vals.len == 0 {
|
||||||
|
t.default_vals = [''].repeat(t.fields.len)
|
||||||
|
}
|
||||||
t.default_vals[idx] = val_expr
|
t.default_vals[idx] = val_expr
|
||||||
table.typesmap[type_name] = t
|
table.typesmap[type_name] = t
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,3 +118,19 @@ fn test_mutable_fields() {
|
||||||
u.name = 'Peter'
|
u.name = 'Peter'
|
||||||
assert u.name == 'Peter'
|
assert u.name == 'Peter'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct Def {
|
||||||
|
a int
|
||||||
|
b int = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_default_vals() {
|
||||||
|
d := Def{}
|
||||||
|
assert d.a == 0
|
||||||
|
assert d.b == 7
|
||||||
|
d2 := Def{10, 20}
|
||||||
|
assert d2.a == 10
|
||||||
|
assert d2.b == 20
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue