compiler: handles printing of structures and arrays of structures

pull/1710/head
Henrixounez 2019-08-22 06:56:29 +02:00 committed by Alexander Medvednikov
parent 232532ba3b
commit 780ddaf22b
3 changed files with 50 additions and 2 deletions

View File

@ -253,6 +253,9 @@ fn (p mut Parser) gen_array_str(typ mut Type) {
})
t := typ.name
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 << '
string ${t}_str($t a) {
strings__Builder sb = strings__new_builder(a.len * 3);

View File

@ -2547,8 +2547,19 @@ fn (p mut Parser) string_expr() {
else {
f := p.typ_to_fmt(typ, 0)
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" ')
}
}
format += f
}
}

View File

@ -206,3 +206,37 @@ fn test_doubling() {
}
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}]'
}