From d9b29bfb4e5554b5061a5deddb3485b07ac0c32a Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 11 Nov 2019 08:04:37 +0300 Subject: [PATCH] fix a bug in strings.Builder and wrap up vfmt --- vlib/compiler/scanner.v | 2 +- vlib/compiler/struct.v | 1 - vlib/compiler/vfmt.v | 9 +++++++-- vlib/strings/builder_c.v | 12 +++++++----- vlib/strings/builder_test.v | 6 ++++++ 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/vlib/compiler/scanner.v b/vlib/compiler/scanner.v index 7c1ccf2eee..1c7f0d3775 100644 --- a/vlib/compiler/scanner.v +++ b/vlib/compiler/scanner.v @@ -76,7 +76,7 @@ fn new_scanner_file(file_path string) &Scanner { fn new_scanner(text string) &Scanner { return &Scanner { text: text - fmt_out: strings.new_builder(10000) + fmt_out: strings.new_builder(1000) should_print_line_on_error: true should_print_errors_in_color: true should_print_relative_paths_on_error: true diff --git a/vlib/compiler/struct.v b/vlib/compiler/struct.v index ab33c9495e..408cacd884 100644 --- a/vlib/compiler/struct.v +++ b/vlib/compiler/struct.v @@ -238,7 +238,6 @@ fn (p mut Parser) struct_init(typ string) string { p.warn('type `$t.name` is private') } if p.gen_struct_init(typ, t) { return typ } - p.scanner.fmt_out.cut(typ.len) ptr := typ.contains('*') mut did_gen_something := false // Loop thru all struct init keys and assign values diff --git a/vlib/compiler/vfmt.v b/vlib/compiler/vfmt.v index e5437e3a5e..3ac3235642 100644 --- a/vlib/compiler/vfmt.v +++ b/vlib/compiler/vfmt.v @@ -13,6 +13,8 @@ fn (scanner mut Scanner) fgen(s_ string) { if scanner.fmt_line_empty { s = strings.repeat(`\t`, scanner.fmt_indent) + s } + + //scanner.fmt_out << s scanner.fmt_out.write(s) scanner.fmt_line_empty = false } @@ -23,6 +25,8 @@ fn (scanner mut Scanner) fgenln(s_ string) { if scanner.fmt_line_empty { s = strings.repeat(`\t`, scanner.fmt_indent) + s } + //scanner.fmt_out << s + //scanner.fmt_out << '\n' scanner.fmt_out.writeln(s) scanner.fmt_line_empty = true } @@ -111,6 +115,7 @@ fn (p mut Parser) fnext() { } } + [if vfmt] fn (p mut Parser) gen_fmt() { if p.pass != .main { @@ -120,6 +125,7 @@ fn (p mut Parser) gen_fmt() { return } s := p.scanner.fmt_out.str().trim_space() + //s := p.scanner.fmt_out.join('').trim_space() if s == '' { return } @@ -128,8 +134,7 @@ fn (p mut Parser) gen_fmt() { verror('failed to create fmt.v') return } - //println(p.scanner.fmt_out.str()) - out.writeln(p.scanner.fmt_out.str().trim_space()) + out.writeln(s)//p.scanner.fmt_out.str().trim_space()) out.close() } diff --git a/vlib/strings/builder_c.v b/vlib/strings/builder_c.v index dadaefa61f..99c9a4e2cb 100644 --- a/vlib/strings/builder_c.v +++ b/vlib/strings/builder_c.v @@ -13,17 +13,23 @@ pub: pub fn new_builder(initial_size int) Builder { return Builder { - buf: make(0, initial_size, sizeof(byte)) + buf: make(0, initial_size, 1) } } pub fn (b mut Builder) write(s string) { b.buf.push_many(s.str, s.len) + //for c in s { + //b.buf << c + //} //b.buf << []byte(s) // TODO b.len += s.len } pub fn (b mut Builder) writeln(s string) { + //for c in s { + //b.buf << c + //} b.buf.push_many(s.str, s.len) //b.buf << []byte(s) // TODO b.buf << `\n` @@ -34,10 +40,6 @@ pub fn (b Builder) str() string { return string(b.buf, b.len) } -pub fn (b mut Builder) cut(n int) { - b.len -= n -} - pub fn (b mut Builder) free() { //free(b.buf.data) } diff --git a/vlib/strings/builder_test.v b/vlib/strings/builder_test.v index 8703351099..da20328fc8 100644 --- a/vlib/strings/builder_test.v +++ b/vlib/strings/builder_test.v @@ -6,11 +6,13 @@ fn test_sb() { sb.write('!') sb.write('hello') assert sb.str() == 'hi!hello' + assert sb.len == 8 sb = strings.new_builder(10) sb.write('a') sb.write('b') println(sb.str()) assert sb.str() == 'ab' + assert sb.len == 2 } const ( @@ -19,8 +21,10 @@ const ( fn test_big_sb() { mut sb := strings.new_builder(100) + mut sb2 := strings.new_builder(10000) for i in 0..n { sb.writeln(i.str()) + sb2.write('+') } s := sb.str() lines := s.split_into_lines() @@ -29,6 +33,8 @@ fn test_big_sb() { assert lines[1] == '1' assert lines[777] == '777' assert lines[98765] == '98765' + println(sb2.len) + assert sb2.len == n }