Skip to content

Commit a992680

Browse files
committed
Convert empty slices and maps to nil
1 parent 437493a commit a992680

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed

internal/convgen/assign/index.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,16 @@ func (fac *factory) tryIndex(x, y Object) (*indexAssigner, error) {
4545
// writeAssignCode writes code that assigns x to y by converting each element.
4646
func (a indexAssigner) writeAssignCode(w *codefmt.Writer, varX, varY, varErr string) {
4747
if a.isSliceY {
48+
w.Printf("if len(%s) != 0 {\n", varX)
49+
defer w.Printf("}\n")
50+
4851
w.Printf("%s = make([]%t, len(%s))\n", varY, a.elemY, varX)
4952
}
5053

5154
varI := w.Name("i")
5255
varV := w.Name("v")
5356
w.Printf("for %s, %s := range %s {\n", varI, varV, varX)
57+
defer w.Printf("}\n")
5458

5559
a.assigner.writeAssignCode(w, varV, varY+"["+varI+"]", varErr)
5660
if a.requiresErr() {
@@ -61,6 +65,4 @@ func (a indexAssigner) writeAssignCode(w *codefmt.Writer, varX, varY, varErr str
6165
w.Printf("break\n")
6266
w.Printf("}\n")
6367
}
64-
65-
w.Printf("}\n")
6668
}

internal/convgen/assign/key.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,15 @@ func (fac *factory) tryKey(x, y Object) (*keyAssigner, error) {
7575
// writeAssignCode writes code that assigns x to y by converting each key and
7676
// element.
7777
func (a keyAssigner) writeAssignCode(w *codefmt.Writer, varX, varY, varErr string) {
78+
w.Printf("if len(%s) != 0 {\n", varX)
79+
defer w.Printf("}\n")
80+
7881
w.Printf("%s = make(map[%t]%t, len(%s))\n", varY, a.keyY, a.elemY, varX)
7982

8083
varKeyX := w.Name("k")
8184
varValX := w.Name("v")
8285
w.Printf("for %s, %s := range %s {\n", varKeyX, varValX, varX)
86+
defer w.Printf("}\n")
8387

8488
varKeyY := w.Name("k")
8589
w.Printf("var %s %t\n", varKeyY, a.keyY)
@@ -98,6 +102,4 @@ func (a keyAssigner) writeAssignCode(w *codefmt.Writer, varX, varY, varErr strin
98102
w.Printf("break\n")
99103
w.Printf("}\n")
100104
}
101-
102-
w.Printf("}\n")
103105
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//go:build convgen
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
8+
"github.com/sublee/convgen"
9+
)
10+
11+
type X struct {
12+
Slice []int
13+
Map map[int]int
14+
}
15+
16+
type Y X
17+
18+
var XtoY = convgen.Struct[X, Y](nil)
19+
20+
func main() {
21+
// Output: true true
22+
xNil := X{}
23+
yNil := XtoY(xNil)
24+
fmt.Println(yNil.Slice == nil, yNil.Map == nil)
25+
26+
// Output: true true
27+
xLen0 := X{Slice: []int{}, Map: map[int]int{}}
28+
yLen0 := XtoY(xLen0)
29+
fmt.Println(yLen0.Slice == nil, yLen0.Map == nil)
30+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
true true
2+
true true

0 commit comments

Comments
 (0)