cgen: fix child struct's default values not assigned (#8202)
parent
d9532eda30
commit
985ef52872
|
@ -5459,24 +5459,32 @@ fn (mut g Gen) type_default(typ_ table.Type) string {
|
|||
// User struct defined in another module.
|
||||
// if typ.contains('__') {
|
||||
if sym.kind == .struct_ {
|
||||
mut has_array_map := false
|
||||
mut zero_str := '{'
|
||||
mut has_none_zero := false
|
||||
mut init_str := '{'
|
||||
info := sym.info as table.Struct
|
||||
for field in info.fields {
|
||||
field_sym := g.table.get_type_symbol(field.typ)
|
||||
if field_sym.kind in [.array, .map] {
|
||||
zero_str += '.$field.name=${g.type_default(field.typ)},'
|
||||
has_array_map = true
|
||||
if field_sym.kind in [.array, .map] || field.has_default_expr {
|
||||
if field.has_default_expr {
|
||||
pos := g.out.len
|
||||
g.expr(ast.fe2ex(field.default_expr))
|
||||
expr_str := g.out.after(pos)
|
||||
g.out.go_back(expr_str.len)
|
||||
init_str += '.$field.name = $expr_str,'
|
||||
} else {
|
||||
init_str += '.$field.name = ${g.type_default(field.typ)},'
|
||||
}
|
||||
has_none_zero = true
|
||||
}
|
||||
}
|
||||
if has_array_map {
|
||||
zero_str += '}'
|
||||
if has_none_zero {
|
||||
init_str += '}'
|
||||
type_name := g.typ(typ)
|
||||
zero_str = '($type_name)' + zero_str
|
||||
init_str = '($type_name)' + init_str
|
||||
} else {
|
||||
zero_str += '0}'
|
||||
init_str += '0}'
|
||||
}
|
||||
return zero_str
|
||||
return init_str
|
||||
}
|
||||
// if typ.ends_with('Fn') { // TODO
|
||||
// return '0'
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
struct Position {
|
||||
line_nr int = 1
|
||||
}
|
||||
|
||||
struct Statement {
|
||||
pos Position
|
||||
}
|
||||
|
||||
struct Expression {
|
||||
pos Position
|
||||
}
|
||||
|
||||
fn test_child_struct_field_default() {
|
||||
stmt := Statement{
|
||||
pos: Position{}
|
||||
}
|
||||
expr := Expression{}
|
||||
println(stmt)
|
||||
println(expr)
|
||||
assert stmt.pos.line_nr == 1
|
||||
assert expr.pos.line_nr == 1
|
||||
}
|
Loading…
Reference in New Issue