| package stringsbuilder |
| |
| import "strings" |
| |
| // basic test |
| func _() { |
| var s strings.Builder |
| s.WriteString("before") |
| for range 10 { |
| s.WriteString("in") // want "using string \\+= string in a loop is inefficient" |
| s.WriteString("in2") |
| } |
| s.WriteString("after") |
| print(s.String()) |
| } |
| |
| // with initializer |
| func _() { |
| var s strings.Builder |
| s.WriteString("a") |
| for range 10 { |
| s.WriteString("b") // want "using string \\+= string in a loop is inefficient" |
| } |
| print(s.String()) |
| } |
| |
| // with empty initializer |
| func _() { |
| var s strings.Builder |
| for range 10 { |
| s.WriteString("b") // want "using string \\+= string in a loop is inefficient" |
| } |
| print(s.String()) |
| } |
| |
| // with short decl |
| func _() { |
| var s strings.Builder |
| s.WriteString("a") |
| for range 10 { |
| s.WriteString("b") // want "using string \\+= string in a loop is inefficient" |
| } |
| print(s.String()) |
| } |
| |
| // with short decl and empty initializer |
| func _() { |
| var s strings.Builder |
| for range 10 { |
| s.WriteString("b") // want "using string \\+= string in a loop is inefficient" |
| } |
| print(s.String()) |
| } |
| |
| // nope: += must appear at least once within a loop. |
| func _() { |
| var s string |
| s += "a" |
| s += "b" |
| s += "c" |
| print(s) |
| } |
| |
| // nope: the declaration of s is not in a block. |
| func _() { |
| if s := "a"; true { |
| for range 10 { |
| s += "x" |
| } |
| print(s) |
| } |
| } |
| |
| // in a switch (special case of "in a block" logic) |
| func _() { |
| switch { |
| default: |
| var s strings.Builder |
| s.WriteString("a") |
| for range 10 { |
| s.WriteString("b") // want "using string \\+= string in a loop is inefficient" |
| } |
| print(s.String()) |
| } |
| } |
| |
| // nope: don't handle direct assignments to the string (only +=). |
| func _(x string) string { |
| var s string |
| s = x |
| for range 3 { |
| s += "" + x |
| } |
| return s |
| } |
| |
| // Regression test for bug in a GenDecl with parens. |
| func issue75318(slice []string) string { |
| var ( |
| msg strings.Builder |
| ) |
| for _, s := range slice { |
| msg.WriteString(s) // want "using string \\+= string in a loop is inefficient" |
| } |
| return msg.String() |
| } |
| |
| // Regression test for https://go.dev/issue/76983. |
| // We offer only the first fix if the second would overlap. |
| // This is an ad-hoc mitigation of the more general issue #76476. |
| func _(slice []string) string { |
| var a strings.Builder; a.WriteString("12") |
| for range 2 { |
| a.WriteString("34") // want "using string \\+= string in a loop is inefficient" |
| } |
| b := "56" |
| for range 2 { |
| b += "78" |
| } |
| a.WriteString(b) |
| return a.String() |
| } |
| func _(slice []string) string { |
| var a strings.Builder |
| a.WriteString("12") |
| for range 2 { |
| a.WriteString("34") |
| } |
| var b strings.Builder |
| b.WriteString("56") |
| for range 2 { |
| b.WriteString("78") // want "using string \\+= string in a loop is inefficient" |
| } |
| a.WriteString(b.String()) |
| return a.String() |
| } |
| |
| // Regression test for go.dev/issue/76934, which mutilated the var decl. |
| func stringDeclaredWithVarDecl() { |
| var ( |
| before int // this is ok |
| str strings.Builder |
| ) |
| str.WriteString("hello world") |
| for range 100 { |
| str.WriteString("!") // want "using string \\+= string in a loop is inefficient" |
| } |
| println(before, str.String()) |
| } |
| |
| func nopeStringIsNotLastValueSpecInVarDecl() { |
| var ( |
| str = "hello world" |
| after int // this defeats the transformation |
| ) |
| for range 100 { |
| str += "!" // nope |
| } |
| println(str, after) |
| } |