From 0b0c496effe161f48fe5e309c7e5a3efb224d479 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 26 Jul 2022 09:37:16 +0800 Subject: [PATCH] cgen: fix printing struct with skip fields (#15224) --- vlib/v/gen/c/auto_str_methods.v | 13 ++++++++++--- .../inout/printing_struct_with_skip_fields.out | 3 +++ .../tests/inout/printing_struct_with_skip_fields.vv | 9 +++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/inout/printing_struct_with_skip_fields.out create mode 100644 vlib/v/tests/inout/printing_struct_with_skip_fields.vv diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index cd9541dd12..2278c29ee0 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -843,14 +843,21 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri fn_builder.writeln('\treturn res;') fn_builder.writeln('}') } - fn_body.writeln('\tstring res = str_intp( ${info.fields.len * 4 + 3}, _MOV((StrIntpData[]){') + // find skip fields + mut skip_field_count := 0 + for field in info.fields { + if attr := field.attrs.find_first('str') { + if attr.arg == 'skip' { + skip_field_count++ + } + } + } + fn_body.writeln('\tstring res = str_intp( ${(info.fields.len - skip_field_count) * 4 + 3}, _MOV((StrIntpData[]){') fn_body.writeln('\t\t{_SLIT("$clean_struct_v_type_name{\\n"), 0, {.d_c=0}},') for i, field in info.fields { // Skip `str:skip` fields if attr := field.attrs.find_first('str') { if attr.arg == 'skip' { - fn_body.writeln('{_SLIT(""), 0, {.d_c=0}},') - fn_body.writeln('{_SLIT(""), 0, {.d_c=0}},') continue } } diff --git a/vlib/v/tests/inout/printing_struct_with_skip_fields.out b/vlib/v/tests/inout/printing_struct_with_skip_fields.out new file mode 100644 index 0000000000..d3689fad70 --- /dev/null +++ b/vlib/v/tests/inout/printing_struct_with_skip_fields.out @@ -0,0 +1,3 @@ +Foo{ + name: 'Peter' +} diff --git a/vlib/v/tests/inout/printing_struct_with_skip_fields.vv b/vlib/v/tests/inout/printing_struct_with_skip_fields.vv new file mode 100644 index 0000000000..097458e88c --- /dev/null +++ b/vlib/v/tests/inout/printing_struct_with_skip_fields.vv @@ -0,0 +1,9 @@ +struct Foo { + name string + age int [str: skip] +} + +fn main() { + x := Foo{'Peter', 25} + println(x) +}