compiler: handles printing of structures and arrays of structures
parent
232532ba3b
commit
780ddaf22b
|
@ -253,6 +253,9 @@ fn (p mut Parser) gen_array_str(typ mut Type) {
|
||||||
})
|
})
|
||||||
t := typ.name
|
t := typ.name
|
||||||
elm_type := t.right(6)
|
elm_type := t.right(6)
|
||||||
|
if p.typ_to_fmt(elm_type, 0) == '' && !p.table.type_has_method(p.table.find_type(elm_type), 'str') {
|
||||||
|
p.error('cant print ${elm_type}[], unhandled print of ${elm_type}')
|
||||||
|
}
|
||||||
p.cgen.fns << '
|
p.cgen.fns << '
|
||||||
string ${t}_str($t a) {
|
string ${t}_str($t a) {
|
||||||
strings__Builder sb = strings__new_builder(a.len * 3);
|
strings__Builder sb = strings__new_builder(a.len * 3);
|
||||||
|
|
|
@ -2547,8 +2547,19 @@ fn (p mut Parser) string_expr() {
|
||||||
else {
|
else {
|
||||||
f := p.typ_to_fmt(typ, 0)
|
f := p.typ_to_fmt(typ, 0)
|
||||||
if f == '' {
|
if f == '' {
|
||||||
|
is_array := typ.starts_with('array_')
|
||||||
|
has_str_method := p.table.type_has_method(p.table.find_type(typ), 'str')
|
||||||
|
if is_array || has_str_method {
|
||||||
|
if is_array && !has_str_method {
|
||||||
|
p.gen_array_str(mut p.table.find_type(typ))
|
||||||
|
}
|
||||||
|
args = args.all_before_last(val) + '${typ}_str(${val}).len, ${typ}_str(${val}).str'
|
||||||
|
format += '%.*s '
|
||||||
|
}
|
||||||
|
else {
|
||||||
p.error('unhandled sprintf format "$typ" ')
|
p.error('unhandled sprintf format "$typ" ')
|
||||||
}
|
}
|
||||||
|
}
|
||||||
format += f
|
format += f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,3 +206,37 @@ fn test_doubling() {
|
||||||
}
|
}
|
||||||
assert nums.str() == '[2, 4, 6, 8, 10]'
|
assert nums.str() == '[2, 4, 6, 8, 10]'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Test2 {
|
||||||
|
one int
|
||||||
|
two int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Test {
|
||||||
|
a string
|
||||||
|
b []Test2
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (t Test2) str() string {
|
||||||
|
return '{$t.one $t.two}'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (t Test) str() string {
|
||||||
|
return '{$t.a $t.b}'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_struct_print() {
|
||||||
|
mut a := Test {
|
||||||
|
a: 'Test',
|
||||||
|
b: []Test2
|
||||||
|
}
|
||||||
|
b := Test2 {
|
||||||
|
one: 1,
|
||||||
|
two: 2
|
||||||
|
}
|
||||||
|
a.b << b
|
||||||
|
a.b << b
|
||||||
|
assert a.str() == '{Test [{1 2}, {1 2}] }'
|
||||||
|
assert b.str() == '{1 2}'
|
||||||
|
assert a.b.str() == '[{1 2}, {1 2}]'
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue