From 117c99d9388e88c390f5a968b8f19553ad117149 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 21 Nov 2021 13:22:38 +0200 Subject: [PATCH] v.util: add Surrounder.builder_write_befores and Surrounder.builder_write_afters methods for writing to an existing strings.Builder --- vlib/v/gen/c/auto_str_methods.v | 4 ++-- vlib/v/gen/c/dumpexpr.v | 4 ++-- vlib/v/util/surrounder.v | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index eececc4838..c471856a4a 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -802,9 +802,9 @@ fn (mut g Gen) gen_str_for_struct(info ast.Struct, styp string, str_fn_name stri mut fn_body_surrounder := util.new_surrounder(info.fields.len) mut fn_body := strings.new_builder(info.fields.len * 256) defer { - fn_builder.write_string(fn_body_surrounder.before()) + fn_body_surrounder.builder_write_befores(mut fn_builder) fn_builder << fn_body - fn_builder.write_string(fn_body_surrounder.after()) + fn_body_surrounder.builder_write_afters(mut fn_builder) fn_builder.writeln('\tstring_free(&indents);') fn_builder.writeln('\treturn res;') fn_builder.writeln('}') diff --git a/vlib/v/gen/c/dumpexpr.v b/vlib/v/gen/c/dumpexpr.v index d4b94da6dc..7832724a12 100644 --- a/vlib/v/gen/c/dumpexpr.v +++ b/vlib/v/gen/c/dumpexpr.v @@ -57,7 +57,7 @@ eprint(res); string_free(&res); strings__Builder_free(&sb); ') - dump_fns.writeln(surrounder.before()) + surrounder.builder_write_befores(mut dump_fns) dump_fns.writeln("\tstrings__Builder_write_rune(&sb, '[');") dump_fns.writeln('\tstrings__Builder_write_string(&sb, fpath);') dump_fns.writeln("\tstrings__Builder_write_rune(&sb, ':');") @@ -72,7 +72,7 @@ strings__Builder_free(&sb); } dump_fns.writeln('\tstrings__Builder_write_string(&sb, value);') dump_fns.writeln("\tstrings__Builder_write_rune(&sb, '\\n');") - dump_fns.writeln(surrounder.after()) + surrounder.builder_write_afters(mut dump_fns) dump_fns.writeln('\treturn dump_arg;') dump_fns.writeln('}') } diff --git a/vlib/v/util/surrounder.v b/vlib/v/util/surrounder.v index 49addd722d..6f5644b474 100644 --- a/vlib/v/util/surrounder.v +++ b/vlib/v/util/surrounder.v @@ -61,6 +61,30 @@ pub fn (s &Surrounder) after() string { return '' } +pub fn (s &Surrounder) builder_write_befores(mut sb strings.Builder) { + len := s.befores.len + if len > 0 { + for i := 0; i < len; i++ { + x := &s.befores[i] + if x.len > 0 { + sb.writeln(x) + } + } + } +} + +pub fn (s &Surrounder) builder_write_afters(mut sb strings.Builder) { + len := s.afters.len + if len > 0 { + for i := len - 1; i >= 0; i-- { + x := &s.afters[i] + if x.len > 0 { + sb.writeln(x) + } + } + } +} + [unsafe] pub fn (mut s Surrounder) free() { unsafe {