cgen: gen_str_for_array()
parent
402e55d115
commit
420ecaf31d
|
@ -28,7 +28,6 @@ const (
|
||||||
'vlib/v/tests/option_test.v',
|
'vlib/v/tests/option_test.v',
|
||||||
'vlib/v/tests/pointers_test.v',
|
'vlib/v/tests/pointers_test.v',
|
||||||
'vlib/v/tests/repl/repl_test.v',
|
'vlib/v/tests/repl/repl_test.v',
|
||||||
'vlib/v/tests/string_interpolation_array_of_structs_test.v',
|
|
||||||
'vlib/v/tests/string_interpolation_variadic_test.v',
|
'vlib/v/tests/string_interpolation_variadic_test.v',
|
||||||
'vlib/v/tests/type_test.v',
|
'vlib/v/tests/type_test.v',
|
||||||
'vlib/v/tests/valgrind/valgrind_test.v', // ubuntu-musl only
|
'vlib/v/tests/valgrind/valgrind_test.v', // ubuntu-musl only
|
||||||
|
|
|
@ -2288,15 +2288,9 @@ fn (var g Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
sym := g.table.get_type_symbol(node.expr_types[i])
|
sym := g.table.get_type_symbol(node.expr_types[i])
|
||||||
if sym.kind == .enum_ {
|
if sym.kind == .enum_ {
|
||||||
is_var := match node.exprs[i] {
|
is_var := match node.exprs[i] {
|
||||||
ast.SelectorExpr {
|
ast.SelectorExpr { true }
|
||||||
true
|
ast.Ident { true }
|
||||||
}
|
else { false }
|
||||||
ast.Ident {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if is_var {
|
if is_var {
|
||||||
styp := g.typ(node.expr_types[i])
|
styp := g.typ(node.expr_types[i])
|
||||||
|
@ -2319,6 +2313,7 @@ fn (var g Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
}
|
}
|
||||||
} else if sym.kind in [.array, .array_fixed] {
|
} else if sym.kind in [.array, .array_fixed] {
|
||||||
styp := g.typ(node.expr_types[i])
|
styp := g.typ(node.expr_types[i])
|
||||||
|
g.gen_str_for_type(sym, styp)
|
||||||
g.write('${styp}_str(')
|
g.write('${styp}_str(')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
|
@ -2873,6 +2868,9 @@ fn (var g Gen) gen_str_for_type(sym table.TypeSymbol, styp string) {
|
||||||
table.Alias {
|
table.Alias {
|
||||||
g.gen_str_default(sym, styp)
|
g.gen_str_default(sym, styp)
|
||||||
}
|
}
|
||||||
|
table.Array, table.ArrayFixed {
|
||||||
|
g.gen_str_for_array(it, styp)
|
||||||
|
}
|
||||||
table.Enum {
|
table.Enum {
|
||||||
g.gen_str_for_enum(it, styp)
|
g.gen_str_for_enum(it, styp)
|
||||||
}
|
}
|
||||||
|
@ -2968,6 +2966,28 @@ fn (var g Gen) gen_str_for_struct(info table.Struct, styp string) {
|
||||||
g.definitions.writeln(', indents.len, indents.str);\n}')
|
g.definitions.writeln(', indents.len, indents.str);\n}')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (var g Gen) gen_str_for_array(info table.Array, styp string) {
|
||||||
|
s := styp.replace('.', '__')
|
||||||
|
sym := g.table.get_type_symbol(info.elem_type)
|
||||||
|
if sym.kind == .struct_ && !sym.has_method('str') {
|
||||||
|
field_styp := g.typ(info.elem_type)
|
||||||
|
g.gen_str_for_type(sym, field_styp)
|
||||||
|
g.definitions.write('string ${s}_str($styp a) {\n')
|
||||||
|
g.definitions.write('\tstrings__Builder sb = strings__new_builder(a.len * 10);\n')
|
||||||
|
g.definitions.write('\tstrings__Builder_write(&sb, tos3("["));\n')
|
||||||
|
g.definitions.write('\tfor (int i = 0; i < a.len; i++) {\n')
|
||||||
|
g.definitions.write('\t\t${field_styp} it = (*(${field_styp}*)array_get(a, i));\n')
|
||||||
|
g.definitions.write('\t\tif (i != a.len-1) {\n')
|
||||||
|
g.definitions.write('\t\t\tstrings__Builder_write(&sb, ${field_styp}_str(it,0));\n')
|
||||||
|
g.definitions.write('\t\t\tstrings__Builder_write(&sb, tos3(", "));\n')
|
||||||
|
g.definitions.write('\t\t} else {\n')
|
||||||
|
g.definitions.write('\t\t\tstrings__Builder_write(&sb, ${field_styp}_str(it,0));\n\t\t}\n\t}\n')
|
||||||
|
g.definitions.write('\tstrings__Builder_write(&sb, tos3("]"));\n')
|
||||||
|
g.definitions.write('\treturn strings__Builder_str(&sb);\n')
|
||||||
|
g.definitions.write('}\n')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn (g Gen) type_to_fmt(typ table.Type) string {
|
fn (g Gen) type_to_fmt(typ table.Type) string {
|
||||||
sym := g.table.get_type_symbol(typ)
|
sym := g.table.get_type_symbol(typ)
|
||||||
if sym.kind in [.struct_, .array, .array_fixed] {
|
if sym.kind in [.struct_, .array, .array_fixed] {
|
||||||
|
|
|
@ -21,11 +21,11 @@ fn test_default_struct_array_of_structs_interpolation() {
|
||||||
]
|
]
|
||||||
s := '$people' // the compiler should generate code for both a) and b)
|
s := '$people' // the compiler should generate code for both a) and b)
|
||||||
assert s.contains('Man {')
|
assert s.contains('Man {')
|
||||||
assert s.contains('name: Superman')
|
assert s.contains("name: 'Superman'")
|
||||||
assert s.contains('age: 30')
|
assert s.contains('age: 30')
|
||||||
assert s.contains('"being nice"')
|
assert s.contains('"being nice"')
|
||||||
assert s.contains('}, Man {')
|
assert s.contains('}, Man {')
|
||||||
assert s.contains('name: Bilbo Baggins')
|
assert s.contains("name: 'Bilbo Baggins'")
|
||||||
assert s.contains('age: 111')
|
assert s.contains('age: 111')
|
||||||
assert s.contains('interests: ["exploring", "hiding"]')
|
assert s.contains('interests: ["exploring", "hiding"]')
|
||||||
assert s.contains('}]')
|
assert s.contains('}]')
|
||||||
|
|
Loading…
Reference in New Issue